Skip to content

Commit 19dde97

Browse files
feat(integrations): hosted API keys for Findymail, Prospeo, and Wiza
Add hosted-key support across all credit-consuming Findymail, Prospeo, and Wiza operations so Sim provides the key when a workspace has not brought its own. Register the three BYOK providers, consolidate Wiza's two-step reveal into a single polling wiza_individual_reveal op, and hide the API key field on hosted Sim for hosted operations.
1 parent e62c3ad commit 19dde97

34 files changed

Lines changed: 840 additions & 371 deletions

apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
AnthropicIcon,
2020
BrandfetchIcon,
2121
ExaAIIcon,
22+
FindymailIcon,
2223
FirecrawlIcon,
2324
FireworksIcon,
2425
GeminiIcon,
@@ -32,7 +33,9 @@ import {
3233
ParallelIcon,
3334
PeopleDataLabsIcon,
3435
PerplexityIcon,
36+
ProspeoIcon,
3537
SerperIcon,
38+
WizaIcon,
3639
} from '@/components/icons'
3740
import { Input } from '@/components/ui'
3841
import { BYOKKeySkeleton } from '@/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton'
@@ -172,6 +175,27 @@ const PROVIDERS: {
172175
description: 'Person and company enrichment, search, and identity',
173176
placeholder: 'Enter your People Data Labs API key',
174177
},
178+
{
179+
id: 'findymail',
180+
name: 'Findymail',
181+
icon: FindymailIcon,
182+
description: 'Email finder, verification, and phone lookup',
183+
placeholder: 'Enter your Findymail API key',
184+
},
185+
{
186+
id: 'prospeo',
187+
name: 'Prospeo',
188+
icon: ProspeoIcon,
189+
description: 'Person and company enrichment and search',
190+
placeholder: 'Enter your Prospeo API key',
191+
},
192+
{
193+
id: 'wiza',
194+
name: 'Wiza',
195+
icon: WizaIcon,
196+
description: 'Prospect search, individual reveal, and company enrichment',
197+
placeholder: 'Enter your Wiza API key',
198+
},
175199
]
176200

177201
export function BYOK() {

apps/sim/blocks/blocks/findymail.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,26 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
214214
placeholder: 'e.g. React, TypeScript, Node.js',
215215
},
216216
},
217-
// API Key
217+
// API Key — hidden on hosted Sim for operations with hosted-key support
218218
{
219219
id: 'apiKey',
220220
title: 'API Key',
221221
type: 'short-input',
222222
required: true,
223223
placeholder: 'Enter your Findymail API key',
224224
password: true,
225+
hideWhenHosted: true,
226+
condition: { field: 'operation', value: 'findymail_get_credits', not: true },
227+
},
228+
// API Key — always required for the credit-balance lookup (no hosted key)
229+
{
230+
id: 'apiKey',
231+
title: 'API Key',
232+
type: 'short-input',
233+
required: true,
234+
placeholder: 'Enter your Findymail API key',
235+
password: true,
236+
condition: { field: 'operation', value: 'findymail_get_credits' },
225237
},
226238
],
227239
tools: {

apps/sim/blocks/blocks/prospeo.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,33 @@ export const ProspeoBlock: BlockConfig<ProspeoResponse> = {
302302
condition: { field: 'operation', value: 'prospeo_search_suggestions' },
303303
},
304304

305-
// API Key (always last)
305+
// API Key — hidden on hosted Sim for operations with hosted-key support
306306
{
307307
id: 'apiKey',
308308
title: 'API Key',
309309
type: 'short-input',
310310
required: true,
311311
placeholder: 'Enter your Prospeo API key',
312312
password: true,
313+
hideWhenHosted: true,
314+
condition: {
315+
field: 'operation',
316+
value: ['prospeo_search_suggestions', 'prospeo_account_information'],
317+
not: true,
318+
},
319+
},
320+
// API Key — always required for the free account/suggestion lookups (no hosted key)
321+
{
322+
id: 'apiKey',
323+
title: 'API Key',
324+
type: 'short-input',
325+
required: true,
326+
placeholder: 'Enter your Prospeo API key',
327+
password: true,
328+
condition: {
329+
field: 'operation',
330+
value: ['prospeo_search_suggestions', 'prospeo_account_information'],
331+
},
313332
},
314333
],
315334
tools: {

apps/sim/blocks/blocks/wiza.ts

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
2424
options: [
2525
{ label: 'Prospect Search', id: 'prospect_search' },
2626
{ label: 'Company Enrichment', id: 'company_enrichment' },
27-
{ label: 'Start Individual Reveal', id: 'start_individual_reveal' },
28-
{ label: 'Get Individual Reveal', id: 'get_individual_reveal' },
27+
{ label: 'Individual Reveal', id: 'individual_reveal' },
2928
{ label: 'Get Credits', id: 'get_credits' },
3029
],
3130
value: () => 'prospect_search',
@@ -37,6 +36,17 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
3736
placeholder: 'Enter your Wiza API key',
3837
password: true,
3938
required: true,
39+
hideWhenHosted: true,
40+
condition: { field: 'operation', value: 'get_credits', not: true },
41+
},
42+
{
43+
id: 'apiKey',
44+
title: 'Wiza API Key',
45+
type: 'short-input',
46+
placeholder: 'Enter your Wiza API key',
47+
password: true,
48+
required: true,
49+
condition: { field: 'operation', value: 'get_credits' },
4050
},
4151

4252
// Prospect Search
@@ -224,7 +234,7 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
224234
mode: 'advanced',
225235
},
226236

227-
// Start Individual Reveal
237+
// Individual Reveal
228238
{
229239
id: 'enrichment_level',
230240
title: 'Enrichment Level',
@@ -236,84 +246,65 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
236246
{ label: 'Full', id: 'full' },
237247
],
238248
value: () => 'full',
239-
condition: { field: 'operation', value: 'start_individual_reveal' },
240-
required: { field: 'operation', value: 'start_individual_reveal' },
249+
condition: { field: 'operation', value: 'individual_reveal' },
250+
required: { field: 'operation', value: 'individual_reveal' },
241251
},
242252
{
243253
id: 'profile_url',
244254
title: 'LinkedIn Profile URL',
245255
type: 'short-input',
246256
placeholder: 'https://linkedin.com/in/johndoe',
247-
condition: { field: 'operation', value: 'start_individual_reveal' },
257+
condition: { field: 'operation', value: 'individual_reveal' },
248258
},
249259
{
250260
id: 'full_name',
251261
title: 'Full Name',
252262
type: 'short-input',
253263
placeholder: 'John Doe',
254-
condition: { field: 'operation', value: 'start_individual_reveal' },
264+
condition: { field: 'operation', value: 'individual_reveal' },
255265
},
256266
{
257267
id: 'company',
258268
title: 'Company',
259269
type: 'short-input',
260270
placeholder: 'Wiza',
261-
condition: { field: 'operation', value: 'start_individual_reveal' },
271+
condition: { field: 'operation', value: 'individual_reveal' },
262272
},
263273
{
264274
id: 'domain',
265275
title: 'Company Domain',
266276
type: 'short-input',
267277
placeholder: 'wiza.co',
268-
condition: { field: 'operation', value: 'start_individual_reveal' },
278+
condition: { field: 'operation', value: 'individual_reveal' },
269279
},
270280
{
271281
id: 'email',
272282
title: 'Email',
273283
type: 'short-input',
274284
placeholder: 'john@wiza.co',
275-
condition: { field: 'operation', value: 'start_individual_reveal' },
285+
condition: { field: 'operation', value: 'individual_reveal' },
276286
},
277287
{
278288
id: 'accept_work',
279289
title: 'Accept Work Emails',
280290
type: 'switch',
281-
condition: { field: 'operation', value: 'start_individual_reveal' },
291+
condition: { field: 'operation', value: 'individual_reveal' },
282292
mode: 'advanced',
283293
},
284294
{
285295
id: 'accept_personal',
286296
title: 'Accept Personal Emails',
287297
type: 'switch',
288-
condition: { field: 'operation', value: 'start_individual_reveal' },
298+
condition: { field: 'operation', value: 'individual_reveal' },
289299
mode: 'advanced',
290300
},
291-
{
292-
id: 'callback_url',
293-
title: 'Callback URL',
294-
type: 'short-input',
295-
placeholder: 'https://example.com/wiza-callback',
296-
condition: { field: 'operation', value: 'start_individual_reveal' },
297-
mode: 'advanced',
298-
},
299-
300-
// Get Individual Reveal
301-
{
302-
id: 'id',
303-
title: 'Reveal ID',
304-
type: 'short-input',
305-
placeholder: 'Reveal ID returned from Start Individual Reveal',
306-
condition: { field: 'operation', value: 'get_individual_reveal' },
307-
required: { field: 'operation', value: 'get_individual_reveal' },
308-
},
309301
],
310302

311303
tools: {
312304
access: [
313305
'wiza_prospect_search',
314306
'wiza_company_enrichment',
315-
'wiza_start_individual_reveal',
316-
'wiza_get_individual_reveal',
307+
'wiza_individual_reveal',
317308
'wiza_get_credits',
318309
],
319310
config: {
@@ -323,10 +314,8 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
323314
return 'wiza_prospect_search'
324315
case 'company_enrichment':
325316
return 'wiza_company_enrichment'
326-
case 'start_individual_reveal':
327-
return 'wiza_start_individual_reveal'
328-
case 'get_individual_reveal':
329-
return 'wiza_get_individual_reveal'
317+
case 'individual_reveal':
318+
return 'wiza_individual_reveal'
330319
case 'get_credits':
331320
return 'wiza_get_credits'
332321
default:
@@ -416,8 +405,6 @@ export const WizaBlock: BlockConfig<WizaResponse> = {
416405
email: { type: 'string', description: 'Email address' },
417406
accept_work: { type: 'boolean', description: 'Whether to accept work emails' },
418407
accept_personal: { type: 'boolean', description: 'Whether to accept personal emails' },
419-
callback_url: { type: 'string', description: 'Callback URL' },
420-
id: { type: 'string', description: 'Individual reveal ID' },
421408
},
422409

423410
outputs: {

apps/sim/lib/api/contracts/byok-keys.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ export const byokProviderIdSchema = z.enum([
2020
'cohere',
2121
'hunter',
2222
'peopledatalabs',
23+
'findymail',
24+
'prospeo',
25+
'wiza',
2326
])
2427

2528
export const byokKeySchema = z.object({

0 commit comments

Comments
 (0)