Skip to content

Commit 56893cb

Browse files
authored
fix(integrations): validate zendesk, pipedrive, and intercom against vendor specs (#10028)
* fix(zendesk): align search, merge, and bulk update requests with the Support API and expose missing block fields * fix(pipedrive): move activity writes and pipeline listing to API v2, send lead visible_to as a string, guard path ids * fix(intercom): snooze via the manage-conversation endpoint, coerce snoozed_until, guard path ids, add user/lead recipient types * fix(integrations): default Intercom message recipients to a documented type, accept boolean done on Pipedrive updates, keep the Pipedrive file_type output * chore(docs): regenerate integration docs, catalog, and tool metadata * chore(lint): shrink the explicit-any baseline * fix(integrations): keep quoted Zendesk search text, require org names on create, validate Intercom snooze timestamps, and tighten Pipedrive outputs * fix(intercom): label the message recipient id for users, leads, and contacts
1 parent 57d0968 commit 56893cb

56 files changed

Lines changed: 530 additions & 134 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎apps/docs/content/docs/integrations/intercom.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ Create and send a new admin-initiated message in Intercom. Returns API-aligned f
784784
| `body` | string | Yes | The body of the message |
785785
| `from_type` | string | Yes | Sender type: "admin" |
786786
| `from_id` | string | Yes | The ID of the admin sending the message |
787-
| `to_type` | string | Yes | Recipient type: "contact" |
787+
| `to_type` | string | Yes | Recipient role: "user" or "lead" |
788788
| `to_id` | string | Yes | The ID of the contact receiving the message |
789789
| `created_at` | number | No | Unix timestamp for when the message was created. If not provided, current time is used. |
790790

‎apps/docs/content/docs/integrations/pipedrive.mdx‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ Retrieve files from Pipedrive with optional filters
186186
| `files` | array | Array of file objects from Pipedrive |
187187
| ↳ `id` | number | File ID |
188188
| ↳ `name` | string | File name |
189+
| ↳ `file_name` | string | Stored file name |
189190
| ↳ `file_type` | string | File type/extension |
190191
| ↳ `file_size` | number | File size in bytes |
191192
| ↳ `add_time` | string | When the file was uploaded |
@@ -263,7 +264,8 @@ Retrieve all pipelines from Pipedrive
263264
| `sort_by` | string | No | Field to sort by: id, update_time, add_time \(default: id\) |
264265
| `sort_direction` | string | No | Sorting direction: asc, desc \(default: asc\) |
265266
| `limit` | string | No | Number of results to return \(e.g., "50", default: 100, max: 500\) |
266-
| `start` | string | No | Pagination start offset \(0-based index of the first item to return\) |
267+
| `start` | string | No | Ignored: Pipedrive API v2 pages pipelines with cursor instead of an offset |
268+
| `cursor` | string | No | For pagination, the marker representing the first item on the next page |
267269

268270
#### Output
269271

@@ -272,15 +274,15 @@ Retrieve all pipelines from Pipedrive
272274
| `pipelines` | array | Array of pipeline objects from Pipedrive |
273275
| ↳ `id` | number | Pipeline ID |
274276
| ↳ `name` | string | Pipeline name |
275-
| ↳ `url_title` | string | URL-friendly title |
276277
| ↳ `order_nr` | number | Pipeline order number |
277-
| ↳ `active` | boolean | Whether the pipeline is active |
278-
| ↳ `deal_probability` | boolean | Whether deal probability is enabled |
279-
| ↳ `add_time` | string | When the pipeline was created |
280-
| ↳ `update_time` | string | When the pipeline was last updated |
278+
| ↳ `is_deleted` | boolean | Whether the pipeline is deleted |
279+
| ↳ `is_deal_probability_enabled` | boolean | Whether deal probability is enabled |
280+
| ↳ `add_time` | string | When the pipeline was created \(ISO 8601\) |
281+
| ↳ `update_time` | string | When the pipeline was last updated \(ISO 8601\) |
281282
| `total_items` | number | Total number of pipelines returned |
282283
| `has_more` | boolean | Whether more pipelines are available |
283-
| `next_start` | number | Offset for fetching the next page |
284+
| `next_start` | number | Always null: API v2 pages with next_cursor instead of an offset |
285+
| `next_cursor` | string | Cursor for fetching the next page; null on the last page |
284286
| `success` | boolean | Operation success status |
285287

286288
</ReferenceDetails>
@@ -321,7 +323,7 @@ Retrieve all projects or a specific project from Pipedrive
321323
| Parameter | Type | Required | Description |
322324
| --------- | ---- | -------- | ----------- |
323325
| `project_id` | string | No | Optional: ID of a specific project to retrieve \(e.g., "123"\) |
324-
| `status` | string | No | Filter by project status: open, completed, deleted \(only for listing all\) |
326+
| `status` | string | No | Filter by project status: open, completed, canceled, deleted \(only for listing all\) |
325327
| `limit` | string | No | Number of results to return \(e.g., "50", default: 100, max: 500, only for listing all\) |
326328
| `cursor` | string | No | For pagination, the marker representing the first item on the next page |
327329

@@ -419,7 +421,7 @@ Create a new activity (task) in Pipedrive
419421
| `due_time` | string | No | Due time in HH:MM format \(e.g., "14:30"\) |
420422
| `duration` | string | No | Duration in HH:MM format \(e.g., "01:00" for 1 hour\) |
421423
| `deal_id` | string | No | ID of the deal to associate with \(e.g., "123"\) |
422-
| `person_id` | string | No | ID of the person to associate with \(e.g., "456"\) |
424+
| `person_id` | string | No | ID of the person to associate with as the primary participant \(e.g., "456"\) |
423425
| `org_id` | string | No | ID of the organization to associate with \(e.g., "789"\) |
424426
| `note` | string | No | Notes for the activity |
425427

@@ -533,7 +535,7 @@ Create a new lead in Pipedrive
533535
| `value_amount` | string | No | Potential value amount \(e.g., "10000"\) |
534536
| `value_currency` | string | No | Currency code \(e.g., "USD", "EUR", "GBP"\) |
535537
| `expected_close_date` | string | No | Expected close date in YYYY-MM-DD format \(e.g., "2025-04-15"\) |
536-
| `visible_to` | string | No | Visibility: 1 \(Owner & followers\), 3 \(Entire company\) |
538+
| `visible_to` | string | No | Visibility group; meanings depend on the Pipedrive plan. Light, Growth, and Professional: 1 = owner & followers, 3 = entire company. Premium and Ultimate: 1 = owner only, 3 = owner's visibility group, 5 = owner's visibility group and sub-groups, 7 = entire company |
537539

538540
#### Output
539541

‎apps/docs/content/docs/integrations/zendesk.mdx‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ Update an existing ticket in Zendesk with support for custom fields
317317
| `ticketId` | string | Yes | Ticket ID to update as a numeric string \(e.g., "12345"\) |
318318
| `subject` | string | No | New ticket subject text |
319319
| `comment` | string | No | Comment text to add to the ticket |
320+
| `commentPublic` | boolean | No | Whether the comment is a public reply \(true\) or an internal note \(false\). Omit to keep the ticket default |
320321
| `priority` | string | No | Priority: "low", "normal", "high", or "urgent" |
321322
| `status` | string | No | Status: "new", "open", "pending", "hold", "solved", or "closed" |
322323
| `type` | string | No | Type: "problem", "incident", "question", or "task" |
@@ -401,7 +402,7 @@ Update multiple tickets in Zendesk at once (max 100)
401402
| `priority` | string | No | New priority for all tickets: "low", "normal", "high", or "urgent" |
402403
| `assigneeId` | string | No | New assignee ID for all tickets as a numeric string \(e.g., "12345"\) |
403404
| `groupId` | string | No | New group ID for all tickets as a numeric string \(e.g., "67890"\) |
404-
| `tags` | string | No | Comma-separated tags to add to all tickets \(e.g., "bulk-update, processed"\) |
405+
| `tags` | string | No | Comma-separated tags that replace the existing tags on all tickets \(e.g., "bulk-update, processed"\) |
405406

406407
#### Output
407408

@@ -1247,7 +1248,7 @@ Unified search across tickets, users, and organizations in Zendesk
12471248

12481249
| Parameter | Type | Required | Description |
12491250
| --------- | ---- | -------- | ----------- |
1250-
| `query` | string | Yes | Search query string using Zendesk search syntax \(e.g., "type:ticket status:open"\) |
1251+
| `query` | string | Yes | Search query string using Zendesk search syntax \(e.g., "status:open priority:urgent"\). The resource type comes from filterType; a "type:" keyword in the query is dropped |
12511252
| `filterType` | string | Yes | Resource type to search for: "ticket", "user", "organization", or "group" |
12521253
| `perPage` | string | No | Results per page as a number string \(default: "100", max: "100"\) |
12531254
| `pageAfter` | string | No | Cursor from a previous response to fetch the next page of results |

‎apps/sim/blocks/blocks/intercom.ts‎

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ const EVENT_ACTOR_FIELD = ['event_email', 'event_user_id', 'event_contact_id'] a
1717
/** What an outbound message shows: its subject when set, otherwise its body. */
1818
const MESSAGE_PREVIEW_FIELD = ['subject', 'body'] as const
1919

20+
/** Intercom requires `snoozed_until` as a whole Unix timestamp in seconds. */
21+
function toSnoozeTimestamp(value: unknown): number {
22+
const timestamp = Number(value)
23+
if (!Number.isInteger(timestamp)) {
24+
throw new Error('Snooze until must be a whole Unix timestamp in seconds')
25+
}
26+
return timestamp
27+
}
28+
2029
export const IntercomBlock: BlockConfig = {
2130
type: 'intercom',
2231
name: 'Intercom (Legacy)',
@@ -854,7 +863,11 @@ Return ONLY the subject line - no explanations.`,
854863
id: 'to_type',
855864
title: 'To Type',
856865
type: 'dropdown',
857-
options: [{ label: 'Contact', id: 'contact' }],
866+
options: [
867+
{ label: 'User', id: 'user' },
868+
{ label: 'Lead', id: 'lead' },
869+
{ label: 'Contact', id: 'contact' },
870+
],
858871
required: true,
859872
condition: {
860873
field: 'operation',
@@ -864,9 +877,9 @@ Return ONLY the subject line - no explanations.`,
864877
{
865878
id: 'to_id',
866879
title: 'To ID',
867-
canvasNoun: 'a contact ID',
880+
canvasNoun: 'a recipient ID',
868881
type: 'short-input',
869-
placeholder: 'Contact ID',
882+
placeholder: 'User, lead, or contact ID',
870883
required: true,
871884
condition: {
872885
field: 'operation',
@@ -1354,6 +1367,7 @@ Return ONLY the numeric timestamp.`,
13541367
ticket_open,
13551368
ticket_is_shared,
13561369
ticket_snoozed_until,
1370+
snoozed_until,
13571371
ticket_assignee_id,
13581372
tag_name,
13591373
tag_id_update,
@@ -1406,6 +1420,10 @@ Return ONLY the numeric timestamp.`,
14061420
cleanParams.include_translations = include_translations === 'true'
14071421
}
14081422

1423+
if (operation === 'snooze_conversation' && snoozed_until) {
1424+
cleanParams.snoozed_until = toSnoozeTimestamp(snoozed_until)
1425+
}
1426+
14091427
if (operation === 'close_conversation' && close_body) {
14101428
cleanParams.body = close_body
14111429
}
@@ -1638,6 +1656,7 @@ export const IntercomV2Block: BlockConfig = {
16381656
ticket_open,
16391657
ticket_is_shared,
16401658
ticket_snoozed_until,
1659+
snoozed_until,
16411660
ticket_assignee_id,
16421661
tag_name,
16431662
tag_id_update,
@@ -1690,6 +1709,10 @@ export const IntercomV2Block: BlockConfig = {
16901709
cleanParams.include_translations = include_translations === 'true'
16911710
}
16921711

1712+
if (operation === 'snooze_conversation' && snoozed_until) {
1713+
cleanParams.snoozed_until = toSnoozeTimestamp(snoozed_until)
1714+
}
1715+
16931716
if (operation === 'close_conversation' && close_body) {
16941717
cleanParams.body = close_body
16951718
}

‎apps/sim/blocks/blocks/pipedrive.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ Return ONLY the date string in YYYY-MM-DD format - no explanations, no quotes, n
399399
placeholder: 'Pagination cursor from previous response',
400400
condition: {
401401
field: 'operation',
402-
value: ['get_all_deals', 'get_projects'],
402+
value: ['get_all_deals', 'get_projects', 'get_pipelines'],
403403
},
404404
},
405405
{
@@ -415,7 +415,6 @@ Return ONLY the date string in YYYY-MM-DD format - no explanations, no quotes, n
415415
'get_files',
416416
'get_pipeline_deals',
417417
'get_mail_messages',
418-
'get_pipelines',
419418
],
420419
},
421420
},
@@ -448,6 +447,8 @@ Return ONLY the date string in YYYY-MM-DD format - no explanations, no quotes, n
448447
{ label: 'All', id: '' },
449448
{ label: 'Open', id: 'open' },
450449
{ label: 'Completed', id: 'completed' },
450+
{ label: 'Canceled', id: 'canceled' },
451+
{ label: 'Deleted', id: 'deleted' },
451452
],
452453
value: () => '',
453454
condition: { field: 'operation', value: ['get_projects'] },

0 commit comments

Comments
 (0)