Checking authentication...

Records

Create, read, update, and delete records in apps

14 tools

Get Record

Read Idempotent

POST /v1/tools/tape/getRecord

Retrieve a Tape record by record_id. Returns a compact summary: record header (record_id, title, record_url, created_by) + fields as {"Label": "formatted value"} — no field config (use getApp for that). Use field_ids to fetch specific fields only. Set verbose=true to get the full raw Tape API response (discouraged — very large).

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID (from filterRecords, listRecords, createRecord, or platform context).
field_idsarrayoptionalFilter to specific fields
field_typesstringoptionalFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
Values: all, basic, calculation
verbosebooleanoptionalReturn full raw Tape response (discouraged)

Flags

NameTypeDescription
field_idsarrayFilter to specific fields
field_typesstringFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
verbosebooleanReturn full raw Tape response (discouraged)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/getRecord \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123"
}'

Response

{
  "record_id": 314159001,
  "app_record_id": 1,
  "app_id": 500123,
  "title": "Acme Corp — Annual Renewal",
  "record_url": "https://tapeapp.com/acme/record/314159001",
  "created_by": {
    "user_id": 4820193,
    "name": "Jordan Lee"
  },
  "created_on": "2026-07-01 14:30:00",
  "fields": [
    {
      "field_id": 702001,
      "external_id": "deal_name",
      "label": "Deal Name",
      "type": "text",
      "value": "Acme Corp — Annual Renewal"
    },
    {
      "field_id": 702002,
      "external_id": "stage",
      "label": "Stage",
      "type": "category",
      "value": [
        {
          "id": 90002,
          "text": "Negotiation"
        }
      ]
    },
    {
      "field_id": 702004,
      "external_id": "amount",
      "label": "Amount",
      "type": "number",
      "value": 24000
    },
    {
      "field_id": 702005,
      "external_id": "close_date",
      "label": "Close Date",
      "type": "date",
      "value": {
        "start": "2026-08-15",
        "end": null
      }
    },
    {
      "field_id": 702007,
      "external_id": "vendor",
      "label": "Vendor",
      "type": "app",
      "value": [
        {
          "record_id": 314158001,
          "app_id": 500124,
          "title": "Acme Supply Co"
        }
      ]
    },
    {
      "field_id": 702009,
      "external_id": "contact_email",
      "label": "Contact Email",
      "type": "email",
      "value": [
        {
          "type": "work",
          "value": "procurement@acme.example.com"
        }
      ]
    },
    {
      "field_id": 702011,
      "external_id": "tasks",
      "label": "Tasks",
      "type": "checklist",
      "value": [
        {
          "title": "Send quote",
          "completed": true,
          "assignee": null,
          "description": "",
          "due": null
        }
      ]
    }
  ]
}

Try It

Try it

Sign in to execute this tool

List Records

Read Idempotent

POST /v1/tools/tape/listRecords

List records in a Tape app or saved view with pagination. Provide app_id for all app records, or view_id for records pre-filtered/sorted by a saved view. If both provided, view_id takes precedence. For custom filtering, use tape_filterRecords instead. Returns compact format: record header (record_id, title, record_url, created_by) + fields as {"Label": "formatted value"} — no field config (use getApp for that). Set verbose=true for full raw Tape API response (discouraged — very large).

Parameters

NameTypeRequiredDescription
app_idnumberoptionalApp ID to list records from (from getApp, listApps, or platform context).
view_idnumberoptionalView ID to list records from (from getAppViews). Overrides app_id — returns records matching the view filters and sort order.
limitnumberoptionalMax records to return (default: 100, max: 500). Use cursor for pagination if you need more.
cursorstringoptionalPagination cursor from previous response. Pass the cursor value to get the next page.
count_onlybooleanoptionalReturn only the count without fetching records
field_idsarrayoptionalArray of field_id or external_id to include. If not provided, all fields returned.
field_typesstringoptionalFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
Values: all, basic, calculation
verbosebooleanoptionalReturn full raw Tape response (discouraged)

Flags

NameTypeDescription
count_onlybooleanReturn only the count without fetching records
field_idsarrayArray of field_id or external_id to include. If not provided, all fields returned.
field_typesstringFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
verbosebooleanReturn full raw Tape response (discouraged)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/listRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

Response

{
  "total": 3,
  "cursor": "eyJhbGciOiJIUzI1NiJ9.eyJ2YWx1ZXMiOlszMTQxNTkwMDNdfQ",
  "records": [
    {
      "record_id": 314159001,
      "app_record_id": 1,
      "app_id": 500123,
      "title": "Acme Corp — Annual Renewal",
      "record_url": "https://tapeapp.com/acme/record/314159001",
      "created_by": {
        "user_id": 4820193,
        "name": "Jordan Lee"
      },
      "created_on": "2026-07-01 14:30:00",
      "fields": [
        {
          "field_id": 702001,
          "external_id": "deal_name",
          "label": "Deal Name",
          "type": "text",
          "value": "Acme Corp — Annual Renewal"
        },
        {
          "field_id": 702002,
          "external_id": "stage",
          "label": "Stage",
          "type": "category",
          "value": [
            {
              "id": 90002,
              "text": "Negotiation"
            }
          ]
        },
        {
          "field_id": 702004,
          "external_id": "amount",
          "label": "Amount",
          "type": "number",
          "value": 24000
        }
      ]
    }
  ]
}

Alternate mode

{
  "total": 3,
  "count_only": true
}

Try It

Try it

Sign in to execute this tool

Create Record

Write

POST /v1/tools/tape/createRecord

Create a new record in a Tape app. IMPORTANT: If creating 2+ records, use tape_batchCreateRecords instead — it is faster and validates all inputs upfront. Returns record_id and record_url. When presenting the result to the user, always include the record_url so they can navigate directly to the new record in Tape. PREREQUISITE: Call tape_getApp(app_id) first to get field IDs, types, and category option IDs — do NOT guess these values. Field values are keyed by field_id (numeric) or external_id (string). Format depends on field type: text/multi_text="string value", number=123 or 45.67, single_category/multi_category=[option_id] or [option_id1, option_id2] or ["text1","text2"] (option_ids or text from getApp config.settings.options), single_date="YYYY-MM-DD HH:MM:SS" (plain string, time REQUIRED — use 00:00:00 for date-only; WRONG: {"start":"..."}), range_date={"start":"2024-01-15 09:00:00","end":"2024-01-16 17:00:00"}, money={"value":"100.00","currency":"USD"}, single_relation/multi_relation=[record_id] or [record_id1, record_id2], single_user/multi_user=[user_id] or [user_id1, user_id2], attachment=[file_id] or ["https://url"] (URLs are auto-uploaded — no need to call uploadFiles first), multi_email=[{"type":"work","email":"a@b.com"}], multi_phone=[{"type":"mobile","phone":"+15551234567"}] (email type: work/home/other; phone type: work/mobile/home/other), multi_link=[{"url":"https://...","title":"Link text"}], checklist=[{"title":"Task name","completed":false}] (IMPORTANT: use "title" NOT "text", use "completed" NOT "checked"; optional: description, due "YYYY-MM-DD" or "YYYY-MM-DD HH:MM", assignee user_id), single_location="address string".

Parameters

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from getApp, listApps, or platform context)
fieldsobjectrequiredField values keyed by field_id (numeric) or external_id (string), from getApp. Format by type: text="string", number=123, category=[option_id] or ["text"], single_date="YYYY-MM-DD HH:MM:SS" (plain string, time REQUIRED), range_date={"start":"...","end":"..."}, money={"value":"100.00","currency":"USD"}, relation=[record_id], user=[user_id], checklist=[{"title":"Task","completed":false}] (use "title" NOT "text"). See tool description for all formats.
id_onlybooleanoptionalReturn only record_id and record_url (default: true). Set to false only if full record data is needed for subsequent steps.

Flags

NameTypeDescription
id_onlybooleanReturn only record_id and record_url (default: true). Set to false only if full record data is needed for subsequent steps.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/createRecord \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123",
  "fields": "..."
}'

Response

{
  "record_id": 314159001,
  "record_url": "https://tapeapp.com/acme/record/314159001"
}

Try It

Try it

Sign in to execute this tool

Batch Create Records

Write

POST /v1/tools/tape/batchCreateRecords

Create any number of records in a Tape app — automatically splits into chunks of 50. Records within each chunk run in parallel; chunks are processed sequentially. PREREQUISITE: Call tape_getApp first to get field IDs, types, and category option IDs — do NOT guess. Each input uses the same field value format as tape_createRecord (text="string", number=123, category=[option_id] or ["text"], single_date="YYYY-MM-DD HH:MM:SS" (plain string), range_date={"start":"...","end":"..."}, etc.). All inputs are validated upfront before any API calls. Partial failures are possible (some records may succeed while others fail). Use for bulk data entry or migration tasks.

Parameters

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from getApp, listApps, or platform context)
inputsarrayrequiredArray of {fields: {...}} objects (any number — automatically chunked into batches of 50). Each fields object uses the same format as createRecord — keyed by field_id or external_id. All records must be for the same app.
silentbooleanoptionalSuppress notifications (default: false)
hookbooleanoptionalExecute webhooks (default: true)
workflowbooleanoptionalTrigger workflows (default: true)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/batchCreateRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123",
  "inputs": "..."
}'

Response

{
  "total": 3,
  "successful": 3,
  "failed": 0,
  "items": [
    {
      "index": 0,
      "success": true,
      "record_id": 314159001,
      "record_url": "https://tapeapp.com/acme/record/314159001"
    },
    {
      "index": 1,
      "success": true,
      "record_id": 314159002,
      "record_url": "https://tapeapp.com/acme/record/314159002"
    },
    {
      "index": 2,
      "success": true,
      "record_id": 314159003,
      "record_url": "https://tapeapp.com/acme/record/314159003"
    }
  ]
}

Try It

Try it

Sign in to execute this tool

Update Record

Write

POST /v1/tools/tape/updateRecord

Update field values on an existing Tape record. IMPORTANT: If updating 2+ records, use tape_batchUpdateRecords instead — it is faster and validates all updates upfront. Only specified fields are updated — omitted fields are unchanged. PREREQUISITE: Call tape_getApp first to get field IDs and types; call tape_getRecord to see current values. Do NOT guess field IDs. Field value formats: text/multi_text="string value", number=123 or 45.67, single_category/multi_category=[option_id] or [option_id1, option_id2] or ["text1","text2"], single_date="YYYY-MM-DD HH:MM:SS" (plain string, time REQUIRED), range_date={"start":"...","end":"..."}, single_relation/multi_relation=[record_id] or [record_id1, record_id2], single_user/multi_user=[user_id] or [user_id1, user_id2], multi_email=[{"type":"work","email":"a@b.com"}], multi_phone=[{"type":"mobile","phone":"+15551234567"}] (email type: work/home/other; phone type: work/mobile/home/other), checklist=[{"title":"Task name","completed":false}] (IMPORTANT: use "title" NOT "text", use "completed" NOT "checked"; when updating existing checklist items, include their "id" to preserve them — items without "id" are treated as NEW, and existing items not included will be DELETED; optional: description, due "YYYY-MM-DD" or "YYYY-MM-DD HH:MM", assignee user_id), attachment=[file_id] or ["https://url"] (URLs are auto-uploaded — no need to call uploadFiles first).

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID to update (from filterRecords, listRecords, getRecord, or platform context).
fieldsobjectrequiredField values to update, keyed by field_id (numeric) or external_id (string). Only specified fields are changed. Format: text="string", number=123, category=[option_id] or ["text"], date={"start":"YYYY-MM-DD HH:MM:SS"}, relation=[record_id], user=[user_id], checklist=[{"title":"Task","completed":false}] (include "id" for existing items). See tool description for all formats.
id_onlybooleanoptionalReturn only record_id (default: true). Set to false only if full record data is needed for subsequent steps.

Flags

NameTypeDescription
id_onlybooleanReturn only record_id (default: true). Set to false only if full record data is needed for subsequent steps.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/updateRecord \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123",
  "fields": "..."
}'

Response

{
  "record_id": 314159001
}

Try It

Try it

Sign in to execute this tool

Batch Update Records

Write

POST /v1/tools/tape/batchUpdateRecords

Update any number of records in a Tape app — automatically splits into chunks of 50. Records within each chunk run in parallel; chunks are processed sequentially. PREREQUISITE: Call tape_getApp first to get field IDs and types; use tape_filterRecords to get record IDs. Do NOT guess field IDs. Each update uses the same field value format as tape_updateRecord. All updates are validated upfront; if any fail validation, none are updated. Partial failures are possible (some records may succeed while others fail). Only specified fields in each update are changed — omitted fields remain unchanged.

Parameters

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from getApp, listApps, or platform context)
updatesarrayrequiredArray of {record_id, fields} objects (any number — automatically chunked into batches of 50). Each fields object uses the same format as updateRecord — keyed by field_id or external_id. Only specified fields are changed per record.
silentbooleanoptionalSuppress notifications (default: false)
hookbooleanoptionalExecute webhooks (default: true)
workflowbooleanoptionalTrigger workflows (default: true)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/batchUpdateRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123",
  "updates": "..."
}'

Response

{
  "total": 2,
  "successful": 2,
  "failed": 0,
  "items": [
    {
      "index": 0,
      "success": true,
      "record_id": 314159002
    },
    {
      "index": 1,
      "success": true,
      "record_id": 314159003
    }
  ]
}

Try It

Try it

Sign in to execute this tool

Delete Record

Destructive

POST /v1/tools/tape/deleteRecord

Soft-delete a Tape record by moving it to trash. Use tape_getRecord first to verify you have the correct record. The record can be recovered later with tape_restoreRecord. Returns confirmation with the deleted record_id.

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID to delete (from filterRecords, listRecords, getRecord, or platform context).

Request

curl -X POST https://api.syncello.io/v1/tools/tape/deleteRecord \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123"
}'

Response

{
  "deleted": true,
  "record_id": 314159003
}

Try It

Try it

Sign in to execute this tool

Restore Record

Write

POST /v1/tools/tape/restoreRecord

Restore a soft-deleted Tape record from trash. Reverses a tape_deleteRecord operation. Returns the restored record with all field values intact.

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID of the deleted record to restore.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/restoreRecord \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123"
}'

Response

{
  "record_id": 314159003,
  "record_url": "https://tapeapp.com/acme/record/314159003",
  "app_record_id": 3,
  "app_id": 500123,
  "title": "Initech Pilot",
  "created_on": "2026-07-01 09:15:00",
  "created_on_utc": "2026-07-01 13:15:00",
  "last_modified_on": "2026-07-01 09:20:00",
  "last_modified_on_utc": "2026-07-01 13:20:00",
  "deleted_on": null,
  "deleted_on_utc": null,
  "app": {
    "app_id": 500123,
    "icon": "assignment",
    "name": "Deals",
    "record_name": "Deal",
    "workspace_id": 500100
  },
  "fields": [
    {
      "field_id": 702001,
      "external_id": "deal_name",
      "label": "Deal Name",
      "type": "text",
      "field_type": "single_text",
      "values": [
        {
          "value": "Initech Pilot"
        }
      ]
    },
    {
      "field_id": 702002,
      "external_id": "stage",
      "label": "Stage",
      "type": "category",
      "field_type": "status",
      "values": [
        {
          "value": {
            "id": 90001,
            "text": "Lead",
            "color": "0077DE",
            "means_completed": false
          }
        }
      ]
    }
  ]
}

Try It

Try it

Sign in to execute this tool

Filter Records

Read Idempotent

POST /v1/tools/tape/filterRecords

Search, filter, and list records in a Tape app. PREREQUISITE for FIELD filters: Call tape_getApp first to get field_ids, field_types, and category option_ids. EXCEPTION — filtering by record creation/modification date needs NO field and NO getApp call: every Tape record has system timestamps filterable via {field_type: "created_on"|"last_modified_on", match_type: "on_or_after", values: [{value: "-7d"}]} with NO field_id (works on every app, whether or not it has such a field; with a field_id it filters that field instead). System-date filters support ONLY before/after/on_or_before/on_or_after — no equal/empty/not_empty; for one exact day combine on_or_after (00:00:00) + on_or_before (23:59:59). Their values (absolute or relative) are interpreted in the user timezone and converted server-side. Pass an empty filters array [] to list all records. Returns compact format: record header (record_id, title, record_url, created_by) + fields as {"Label": "formatted value"} — no field config (use getApp for that). Filter format is an array of objects: {field_id: "123", field_type: "single_text", match_type: "contains", values: [{value: "search"}], type: "text"}. The "type" value maps from field_type: single_text/multi_text→"text", number/unique_id→"number", single_category/multi_category→"category", status→"status", single_date/range_date/created_on/last_modified_on→"date", single_relation/multi_relation→"app", single_user/multi_user/created_by/last_modified_by→"contact", multi_email→"email", multi_phone→"phone", multi_link→"embed", single_location→"location", *_attachment/multi_image→"file". The "type" field is OPTIONAL — Syncello derives it from field_type automatically, so you can omit it; field_type and match_type are what matter. Match types vary by field: text supports contains/equal/not_equal/not_contains/empty/not_empty (NOTE: starts_with/ends_with are NOT supported for text fields — use "contains" instead); category supports equal/not_equal/any/none/empty/not_empty; number supports equal/smaller/larger/smaller_or_equal/larger_or_equal/empty/not_empty; date supports equal/before/after/on_or_before/on_or_after/empty/not_empty. For multi-value fields (multi_category, multi_relation, multi_user): `any` = record contains at least one of the given values (possibly alongside others); `equal` = record's value set is exactly the given values and nothing else; `none` = record contains none of the given values; `not_equal` is NOT supported on these three (only on their single-value counterparts). `fully_includes` works on multi_email/multi_phone but not multi_link. status also supports completed/incomplete, which take NO values array. Add include_active_user: true to a user-field filter to also match records assigned to the CALLING user ("assigned to Sam or me"); not combinable with not_empty. Use `any` for natural-language "has X" or "contains X" queries. Use `equal` only when the user explicitly asks for an exact match. Date values format: {value: "YYYY-MM-DD HH:MM:SS"} (also accepts relative tokens — -30d, +0d=today, -1w, +1m, -1y — resolved server-side in the user timezone; the sign is required; e.g. last 30 days = on_or_after {value:"-30d"} + on_or_before {value:"+0d"}). Category values format: {value: option_id}. Pagination via cursor and limit (default 30). Set verbose=true for full raw Tape API response (discouraged — very large). Use tape_aggregateRecords instead when you need to compute totals, averages, counts, or breakdowns — it handles pagination automatically and returns exact computed numbers without fetching every record.

Parameters

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from getApp, listApps, or platform context)
filtersarrayrequiredArray of filter objects. Each: {field_id: "123", field_type: "single_text", match_type: "contains", values: [{value: "search"}]}. Pass empty array [] to list all records. Get field_id and field_type from getApp. The "type" field is OPTIONAL — Syncello derives it from field_type, so you can omit it. Multiple filters are AND-combined. Alternatively, a filter may target a field by LABEL instead of field_id via `field_label` (case-insensitive exact match, e.g. {field_label: "Status", match_type: "equal", values: [{value: "Open"}]}) — Syncello resolves it to the numeric field_id and backfills field_type; an ambiguous (>1 match) or unknown label is rejected with the matching field_ids so you can disambiguate via field_id.
limitnumberoptionalMax records to return (default: 100, max: 500). Use cursor for pagination if you need more.
cursorstringoptionalPagination cursor from previous response. Pass the cursor value from the response to get the next page.
sort_bystringoptionalExternal ID (slug) of an app field to sort by (from getApp). Example: "status", "due_date". System properties like created_on are NOT supported.
sort_descbooleanoptionalSort descending (default: false)
count_onlybooleanoptionalReturn only the count without fetching records
field_idsarrayoptionalArray of field_id or external_id to include. If not provided, all fields returned.
field_typesstringoptionalFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
Values: all, basic, calculation
verbosebooleanoptionalReturn full raw Tape response (discouraged)

Flags

NameTypeDescription
count_onlybooleanReturn only the count without fetching records
field_idsarrayArray of field_id or external_id to include. If not provided, all fields returned.
field_typesstringFilter by field type: all (default), basic (exclude calculations), calculation (only calculations)
verbosebooleanReturn full raw Tape response (discouraged)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/filterRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123",
  "filters": "..."
}'

Response

{
  "total": 1,
  "cursor": "eyJhbGciOiJIUzI1NiJ9.eyJ2YWx1ZXMiOlszMTQxNTkwMDFdfQ",
  "records": [
    {
      "record_id": 314159001,
      "app_record_id": 1,
      "app_id": 500123,
      "title": "Acme Corp — Annual Renewal",
      "record_url": "https://tapeapp.com/acme/record/314159001",
      "created_by": {
        "user_id": 4820193,
        "name": "Jordan Lee"
      },
      "created_on": "2026-07-01 14:30:00",
      "fields": [
        {
          "field_id": 702001,
          "external_id": "deal_name",
          "label": "Deal Name",
          "type": "text",
          "value": "Acme Corp — Annual Renewal"
        },
        {
          "field_id": 702002,
          "external_id": "stage",
          "label": "Stage",
          "type": "category",
          "value": [
            {
              "id": 90002,
              "text": "Negotiation"
            }
          ]
        },
        {
          "field_id": 702004,
          "external_id": "amount",
          "label": "Amount",
          "type": "number",
          "value": 24000
        }
      ]
    }
  ]
}

Alternate mode

{
  "total": 14,
  "count_only": true
}

Try It

Try it

Sign in to execute this tool

Aggregate Records

Read Idempotent

POST /v1/tools/tape/aggregateRecords

Compute server-side aggregations (sum, avg, min, max, count) on Tape records matching a filter. For a simple "how many records match" COUNT, OMIT aggregations entirely (or pass []) — it returns {total_items} for the filter, with no field_id/operation needed. Use this instead of tape_filterRecords when you need totals, averages, or breakdowns across many records. Returns exact computed numbers — no need to manually sum field values from filterRecords results. When using group_by, the response includes both per-group breakdowns AND a "totals" object with grand totals across all groups — use totals directly, do NOT add up group values manually. Supports group_by on date fields (with day/week/month/quarter/year intervals), category/status fields, relation fields, and contact (user) fields. IMPORTANT: You MUST call tape_getApp in a prior step and wait for its response before calling this tool. Do NOT call tape_aggregateRecords in the same turn as tape_getApp — the model needs real field_ids from getApp before constructing aggregations. Using field_id: 0 or guessed IDs will fail with a validation error.

Parameters

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from getApp, listApps, or platform context)
filtersarrayoptionalSame filter format as tape_filterRecords — array of filter objects. Each: {field_id: "123", field_type: "single_date", match_type: "after", values: [{value: "2026-01-01 00:00:00"}]}. The "type" field is OPTIONAL — Syncello derives it from field_type, so you can omit it. SYSTEM record dates need NO field_id: {field_type: "created_on"|"last_modified_on", match_type: "on_or_after", values: [{value: "-7d"}]} filters on the record creation/last-modified timestamp of ANY app (match types: before/after/on_or_before/on_or_after only). Omit or pass [] to aggregate all records in the app.
aggregationsarrayoptionalOPTIONAL. What to compute. Max 5 per request. OMIT this (or pass []) to just COUNT the matching records (returns {total_items}). Operations by field type: number/calculation(number) → sum, avg, min, max, count; date fields (single_date, range_date, created_on, last_modified_on) → min, max, count; all other fields (text, category, status, relation, contact, etc.) → count only. Date difference: {metric:"date_diff", field_a_id, field_b_id, unit, operation} computes avg/sum/min/max/count of (field_b - field_a), e.g. avg days from a Start Date to an End Date — both fields must be date fields, and it is groupable like any metric. For date_diff, count = records where BOTH dates are present.
group_byobjectoptionalOptional. Group results by a field. Only one group_by per request.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/aggregateRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123"
}'

Response

{
  "total_items": 3,
  "aggregations": {
    "702004": {
      "sum": 51000,
      "avg": 17000
    }
  }
}

Alternate mode

{
  "total_items": 3,
  "totals": {
    "702004": {
      "sum": 51000
    }
  },
  "groups": [
    {
      "group": "Lead",
      "count": 1,
      "aggregations": {
        "702004": {
          "sum": 9000
        }
      }
    },
    {
      "group": "Negotiation",
      "count": 1,
      "aggregations": {
        "702004": {
          "sum": 24000
        }
      }
    },
    {
      "group": "Won",
      "count": 1,
      "aggregations": {
        "702004": {
          "sum": 18000
        }
      }
    }
  ]
}

Alternate mode

{
  "total_items": 3,
  "count_only": true
}

Try It

Try it

Sign in to execute this tool

Get Related Records

Read Idempotent

POST /v1/tools/tape/getRelatedRecords

Get records linked via a relationship field between two Tape apps. PREREQUISITE: You need the app_id of the related app and the field_id of the relation field. Call tape_getApp first to find relation fields (field_type: "single_relation" or "multi_relation") and their referenced_apps. Returns compact format: record header (record_id, title, record_url, created_by) + fields as {"Label": "formatted value"}. Use direction to control which side of the relation to traverse: "forward" (outgoing links from app_id), "reverse" (incoming links to app_id), or "both" (all links). Set verbose=true for full raw Tape API response (discouraged — very large).

Parameters

NameTypeRequiredDescription
app_idnumberrequiredThe app that has the relationship field (from getApp or platform context).
related_app_idnumberrequiredThe related app to fetch linked records from.
record_idsarrayrequiredArray of record IDs in app_id to find related records for.
directionstringoptionalDirection of relations: "forward" (outgoing from app_id), "reverse" (incoming to app_id), or "both" (default).
field_idsarrayoptionalArray of field_id or external_id to include. If not provided, all fields returned.
verbosebooleanoptionalReturn full raw Tape response (discouraged)

Flags

NameTypeDescription
field_idsarrayArray of field_id or external_id to include. If not provided, all fields returned.
verbosebooleanReturn full raw Tape response (discouraged)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/getRelatedRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "app_id": "123",
  "related_app_id": "123",
  "record_ids": "..."
}'

Response

{
  "total": 1,
  "records": [
    {
      "record_id": 314158001,
      "app_record_id": 1,
      "title": "Acme Supply Co",
      "record_url": "https://tapeapp.com/acme/record/314158001",
      "created_by": "Jordan Lee (user:4820193)",
      "created_on": "2026-07-01 14:20:00",
      "fields": {
        "Vendor Name": "Acme Supply Co",
        "Website": "https://acme-supply.example.com"
      }
    }
  ]
}

Try It

Try it

Sign in to execute this tool

Find Relatable Records

Read Idempotent

POST /v1/tools/tape/findRelatableRecords

Search for records that can be linked via a specific relation field. Use this to find record IDs before setting a relation field value in createRecord or updateRecord. PREREQUISITE: Call tape_getApp first to find the relation field_id (look for field_type "single_relation" or "multi_relation"). Returns compact format: record header (record_id, title, created_by; record_url when the API provides it) + fields as {"Label": "formatted value"}. Set verbose=true for full raw Tape API response (discouraged — very large).

Parameters

NameTypeRequiredDescription
field_idnumberrequiredThe field_id of the relation field (single_relation or multi_relation, from getApp).
textstringrequiredSearch text to find matching records in the related app.
field_idsarrayoptionalArray of field_id or external_id to include. If not provided, all fields returned.
verbosebooleanoptionalReturn full raw Tape response (discouraged)

Flags

NameTypeDescription
field_idsarrayArray of field_id or external_id to include. If not provided, all fields returned.
verbosebooleanReturn full raw Tape response (discouraged)

Request

curl -X POST https://api.syncello.io/v1/tools/tape/findRelatableRecords \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "field_id": "123",
  "text": "example"
}'

Response

{
  "total": 1,
  "records": [
    {
      "record_id": 314158002,
      "app_record_id": 2,
      "title": "Globex Trading",
      "created_by": "Jordan Lee (user:4820193)",
      "created_on": "2026-07-01 14:22:00",
      "fields": {}
    }
  ]
}

Try It

Try it

Sign in to execute this tool

Get Record Revisions

Read Idempotent

POST /v1/tools/tape/getRecordRevisions

Get the revision history (edit log) for a Tape record. Returns an array of revisions with user, timestamp, and change summaries. Use tape_getRecordRevisionDelta with a specific revision to see the exact field changes.

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID to get revision history for.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/getRecordRevisions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123"
}'

Response

{
  "revisions": [
    {
      "created_by": {
        "id": 4820193,
        "mail": [
          "jane@example.com"
        ],
        "user_id": 4820193,
        "name": "Jordan Lee",
        "org_id": 44001,
        "type": "user"
      },
      "created_on": "2026-07-01 14:30:00",
      "record_id": 314159001,
      "revision": 0,
      "type": "creation"
    },
    {
      "created_by": {
        "id": 4820193,
        "mail": [
          "jane@example.com"
        ],
        "user_id": 4820193,
        "name": "Jordan Lee",
        "org_id": 44001,
        "type": "user"
      },
      "created_on": "2026-07-01 15:05:00",
      "record_id": 314159001,
      "revision": 1,
      "type": "update"
    }
  ],
  "total": 2
}

Try It

Try it

Sign in to execute this tool

Get Record Revision Delta

Read Idempotent

POST /v1/tools/tape/getRecordRevisionDelta

Get the exact field-level changes (before/after values) for a specific revision of a Tape record. Shows what changed in a specific revision compared to the previous one. Use tape_getRecordRevisions first to find revision IDs.

Parameters

NameTypeRequiredDescription
record_idnumberrequiredThe record ID.
to_revision_idnumberrequiredThe revision ID to inspect (from getRecordRevisions). Shows changes made in this revision vs. the previous one.

Request

curl -X POST https://api.syncello.io/v1/tools/tape/getRecordRevisionDelta \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
  -d '{
  "record_id": "123",
  "to_revision_id": "123"
}'

Response

{
  "record_id": 314159001,
  "from_revision_id": 0,
  "to_revision_id": 1,
  "revision_deltas": [
    {
      "type": "category",
      "field_type": "status",
      "from": [
        {
          "value": {
            "id": 90002,
            "text": "Negotiation",
            "color": "F45D00",
            "means_completed": false
          }
        }
      ],
      "to": [
        {
          "value": {
            "id": 90003,
            "text": "Won",
            "color": "00866A",
            "means_completed": true
          }
        }
      ],
      "label": "Stage",
      "config": {
        "label": "Stage",
        "external_id": "stage",
        "required": true,
        "settings": {
          "multiple": false,
          "layout": "inline",
          "options": [
            {
              "id": 90002,
              "text": "Negotiation",
              "color": "F45D00",
              "means_completed": false
            },
            {
              "id": 90003,
              "text": "Won",
              "color": "00866A",
              "means_completed": true
            }
          ]
        }
      },
      "external_id": "stage",
      "field_id": 702002
    }
  ]
}

Try It

Try it

Sign in to execute this tool