Records
Create, read, update, and delete records in apps
14 tools
Get Record
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The record ID (from filterRecords, listRecords, createRecord, or platform context). |
field_ids | array | optional | Filter to specific fields |
field_types | string | optional | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) Values: all, basic, calculation |
verbose | boolean | optional | Return full raw Tape response (discouraged) |
Flags
| Name | Type | Description |
|---|---|---|
field_ids | array | Filter to specific fields |
field_types | string | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) |
verbose | boolean | Return 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
Sign InList Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | optional | App ID to list records from (from getApp, listApps, or platform context). |
view_id | number | optional | View ID to list records from (from getAppViews). Overrides app_id — returns records matching the view filters and sort order. |
limit | number | optional | Max records to return (default: 100, max: 500). Use cursor for pagination if you need more. |
cursor | string | optional | Pagination cursor from previous response. Pass the cursor value to get the next page. |
count_only | boolean | optional | Return only the count without fetching records |
field_ids | array | optional | Array of field_id or external_id to include. If not provided, all fields returned. |
field_types | string | optional | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) Values: all, basic, calculation |
verbose | boolean | optional | Return full raw Tape response (discouraged) |
Flags
| Name | Type | Description |
|---|---|---|
count_only | boolean | Return only the count without fetching records |
field_ids | array | Array of field_id or external_id to include. If not provided, all fields returned. |
field_types | string | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) |
verbose | boolean | Return 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
Sign InCreate Record
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from getApp, listApps, or platform context) |
fields | object | required | Field 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_only | boolean | optional | Return only record_id and record_url (default: true). Set to false only if full record data is needed for subsequent steps. |
Flags
| Name | Type | Description |
|---|---|---|
id_only | boolean | Return 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
Sign InBatch Create Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from getApp, listApps, or platform context) |
inputs | array | required | Array 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. |
silent | boolean | optional | Suppress notifications (default: false) |
hook | boolean | optional | Execute webhooks (default: true) |
workflow | boolean | optional | Trigger 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
Sign InUpdate Record
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The record ID to update (from filterRecords, listRecords, getRecord, or platform context). |
fields | object | required | Field 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_only | boolean | optional | Return only record_id (default: true). Set to false only if full record data is needed for subsequent steps. |
Flags
| Name | Type | Description |
|---|---|---|
id_only | boolean | Return 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
Sign InBatch Update Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from getApp, listApps, or platform context) |
updates | array | required | Array 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. |
silent | boolean | optional | Suppress notifications (default: false) |
hook | boolean | optional | Execute webhooks (default: true) |
workflow | boolean | optional | Trigger 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
Sign InDelete Record
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The 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
Sign InRestore Record
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The 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
Sign InFilter Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from getApp, listApps, or platform context) |
filters | array | required | Array 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. |
limit | number | optional | Max records to return (default: 100, max: 500). Use cursor for pagination if you need more. |
cursor | string | optional | Pagination cursor from previous response. Pass the cursor value from the response to get the next page. |
sort_by | string | optional | External ID (slug) of an app field to sort by (from getApp). Example: "status", "due_date". System properties like created_on are NOT supported. |
sort_desc | boolean | optional | Sort descending (default: false) |
count_only | boolean | optional | Return only the count without fetching records |
field_ids | array | optional | Array of field_id or external_id to include. If not provided, all fields returned. |
field_types | string | optional | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) Values: all, basic, calculation |
verbose | boolean | optional | Return full raw Tape response (discouraged) |
Flags
| Name | Type | Description |
|---|---|---|
count_only | boolean | Return only the count without fetching records |
field_ids | array | Array of field_id or external_id to include. If not provided, all fields returned. |
field_types | string | Filter by field type: all (default), basic (exclude calculations), calculation (only calculations) |
verbose | boolean | Return 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
Sign InAggregate Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from getApp, listApps, or platform context) |
filters | array | optional | Same 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. |
aggregations | array | optional | OPTIONAL. 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_by | object | optional | Optional. 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
Sign InGet Related Records
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
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app that has the relationship field (from getApp or platform context). |
related_app_id | number | required | The related app to fetch linked records from. |
record_ids | array | required | Array of record IDs in app_id to find related records for. |
direction | string | optional | Direction of relations: "forward" (outgoing from app_id), "reverse" (incoming to app_id), or "both" (default). |
field_ids | array | optional | Array of field_id or external_id to include. If not provided, all fields returned. |
verbose | boolean | optional | Return full raw Tape response (discouraged) |
Flags
| Name | Type | Description |
|---|---|---|
field_ids | array | Array of field_id or external_id to include. If not provided, all fields returned. |
verbose | boolean | Return 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
Sign InFind Relatable Records
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
| Name | Type | Required | Description |
|---|---|---|---|
field_id | number | required | The field_id of the relation field (single_relation or multi_relation, from getApp). |
text | string | required | Search text to find matching records in the related app. |
field_ids | array | optional | Array of field_id or external_id to include. If not provided, all fields returned. |
verbose | boolean | optional | Return full raw Tape response (discouraged) |
Flags
| Name | Type | Description |
|---|---|---|
field_ids | array | Array of field_id or external_id to include. If not provided, all fields returned. |
verbose | boolean | Return 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
Sign InGet Record Revisions
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The 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
Sign InGet Record Revision Delta
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
| Name | Type | Required | Description |
|---|---|---|---|
record_id | number | required | The record ID. |
to_revision_id | number | required | The 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
Sign In