@@ -37,15 +37,15 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
3737 } ,
3838 // Find Email From Name
3939 {
40- id : 'name ' ,
40+ id : 'fn_name ' ,
4141 title : 'Full Name' ,
4242 type : 'short-input' ,
4343 required : true ,
4444 placeholder : 'John Doe' ,
4545 condition : { field : 'operation' , value : 'findymail_find_email_from_name' } ,
4646 } ,
4747 {
48- id : 'domain ' ,
48+ id : 'fn_domain ' ,
4949 title : 'Company Domain or Name' ,
5050 type : 'short-input' ,
5151 required : true ,
@@ -54,7 +54,7 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
5454 } ,
5555 // Find Email From LinkedIn
5656 {
57- id : 'linkedin_url ' ,
57+ id : 'fefl_linkedin_url ' ,
5858 title : 'LinkedIn URL' ,
5959 type : 'short-input' ,
6060 required : true ,
@@ -63,7 +63,7 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
6363 } ,
6464 // Find Emails By Domain
6565 {
66- id : 'domain ' ,
66+ id : 'fed_domain ' ,
6767 title : 'Domain' ,
6868 type : 'short-input' ,
6969 required : true ,
@@ -77,10 +77,15 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
7777 required : true ,
7878 placeholder : '["CEO", "Founder"]' ,
7979 condition : { field : 'operation' , value : 'findymail_find_emails_by_domain' } ,
80+ wandConfig : {
81+ prompt :
82+ 'Generate a JSON array of job roles/titles to target at the company (max 3). Return ONLY the JSON array - no explanations, no extra text.' ,
83+ placeholder : 'e.g. CEO, Founder, CTO' ,
84+ } ,
8085 } ,
8186 // Verify Email
8287 {
83- id : 'email ' ,
88+ id : 've_email ' ,
8489 title : 'Email Address' ,
8590 type : 'short-input' ,
8691 required : true ,
@@ -89,7 +94,7 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
8994 } ,
9095 // Reverse Email Lookup
9196 {
92- id : 'email ' ,
97+ id : 'rel_email ' ,
9398 title : 'Email Address' ,
9499 type : 'short-input' ,
95100 required : true ,
@@ -99,27 +104,32 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
99104 {
100105 id : 'with_profile' ,
101106 title : 'Return Full Profile' ,
102- type : 'switch' ,
107+ type : 'dropdown' ,
108+ options : [
109+ { label : 'No' , id : 'false' } ,
110+ { label : 'Yes' , id : 'true' } ,
111+ ] ,
112+ value : ( ) => 'false' ,
103113 condition : { field : 'operation' , value : 'findymail_reverse_email_lookup' } ,
104114 mode : 'advanced' ,
105115 } ,
106116 // Get Company Info — provide at least one of LinkedIn URL, domain, or name
107117 {
108- id : 'linkedin_url ' ,
118+ id : 'gc_linkedin_url ' ,
109119 title : 'Company LinkedIn URL' ,
110120 type : 'short-input' ,
111121 placeholder : 'LinkedIn URL (at least one of URL/domain/name required)' ,
112122 condition : { field : 'operation' , value : 'findymail_get_company' } ,
113123 } ,
114124 {
115- id : 'domain ' ,
125+ id : 'gc_domain ' ,
116126 title : 'Company Domain' ,
117127 type : 'short-input' ,
118128 placeholder : 'stripe.com (at least one of URL/domain/name required)' ,
119129 condition : { field : 'operation' , value : 'findymail_get_company' } ,
120130 } ,
121131 {
122- id : 'name ' ,
132+ id : 'gc_name ' ,
123133 title : 'Company Name' ,
124134 type : 'short-input' ,
125135 placeholder : 'Stripe (at least one of URL/domain/name required)' ,
@@ -141,6 +151,11 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
141151 required : true ,
142152 placeholder : '["Software Engineer", "CEO"]' ,
143153 condition : { field : 'operation' , value : 'findymail_find_employees' } ,
154+ wandConfig : {
155+ prompt :
156+ 'Generate a JSON array of job titles to search for at the company (max 10). Return ONLY the JSON array - no explanations, no extra text.' ,
157+ placeholder : 'e.g. Software Engineer, CEO, Product Manager' ,
158+ } ,
144159 } ,
145160 {
146161 id : 'count' ,
@@ -152,7 +167,7 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
152167 } ,
153168 // Find Phone
154169 {
155- id : 'linkedin_url ' ,
170+ id : 'fp_linkedin_url ' ,
156171 title : 'LinkedIn URL' ,
157172 type : 'short-input' ,
158173 required : true ,
@@ -167,10 +182,15 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
167182 required : true ,
168183 placeholder : 'React' ,
169184 condition : { field : 'operation' , value : 'findymail_search_technologies' } ,
185+ wandConfig : {
186+ prompt :
187+ 'Generate a technology search term to look up in the Findymail technology catalog. Return ONLY the search term - no explanations, no extra text.' ,
188+ placeholder : 'e.g. React, Stripe, Salesforce' ,
189+ } ,
170190 } ,
171191 // Lookup Technologies By Domain
172192 {
173- id : 'domain ' ,
193+ id : 'lt_domain ' ,
174194 title : 'Company Domain' ,
175195 type : 'short-input' ,
176196 required : true ,
@@ -184,6 +204,11 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
184204 placeholder : '["React", "TypeScript"]' ,
185205 condition : { field : 'operation' , value : 'findymail_lookup_technologies' } ,
186206 mode : 'advanced' ,
207+ wandConfig : {
208+ prompt :
209+ 'Generate a JSON array of technology names to filter by (case-insensitive). Return ONLY the JSON array - no explanations, no extra text.' ,
210+ placeholder : 'e.g. React, TypeScript, Node.js' ,
211+ } ,
187212 } ,
188213 // API Key
189214 {
@@ -230,35 +255,58 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
230255 } ,
231256 params : ( params ) => {
232257 const { operation : _operation , ...rest } = params
258+
259+ // Map unique subBlock IDs back to tool param names
260+ const idToParam : Record < string , string > = {
261+ fn_name : 'name' ,
262+ fn_domain : 'domain' ,
263+ fefl_linkedin_url : 'linkedin_url' ,
264+ fed_domain : 'domain' ,
265+ ve_email : 'email' ,
266+ rel_email : 'email' ,
267+ gc_linkedin_url : 'linkedin_url' ,
268+ gc_domain : 'domain' ,
269+ gc_name : 'name' ,
270+ fp_linkedin_url : 'linkedin_url' ,
271+ lt_domain : 'domain' ,
272+ }
273+
233274 const result : Record < string , unknown > = { }
234275 for ( const [ key , value ] of Object . entries ( rest ) ) {
235276 if ( value === undefined || value === null || value === '' ) continue
236- if ( key === 'count' ) {
277+ const mappedKey = idToParam [ key ] ?? key
278+ if ( mappedKey === 'count' ) {
237279 const n = Number ( value )
238- if ( ! Number . isNaN ( n ) ) result [ key ] = n
239- } else if ( key === 'roles' || key === 'job_titles' || key === 'technologies' ) {
280+ if ( ! Number . isNaN ( n ) ) result [ mappedKey ] = n
281+ } else if ( mappedKey === 'with_profile' ) {
282+ result [ mappedKey ] = value === true || value === 'true'
283+ } else if (
284+ mappedKey === 'roles' ||
285+ mappedKey === 'job_titles' ||
286+ mappedKey === 'technologies'
287+ ) {
240288 if ( Array . isArray ( value ) ) {
241- result [ key ] = value
289+ result [ mappedKey ] = value
242290 } else if ( typeof value === 'string' ) {
243291 const trimmed = value . trim ( )
244292 if ( trimmed . startsWith ( '[' ) ) {
245293 try {
246294 const parsed = JSON . parse ( trimmed )
247295 if ( Array . isArray ( parsed ) ) {
248- result [ key ] = parsed
296+ result [ mappedKey ] = parsed
249297 continue
250298 }
251299 } catch {
252300 // fall through to comma-split
253301 }
254302 }
255- result [ key ] = trimmed
303+ result [ mappedKey ] = trimmed
256304 . split ( ',' )
257305 . map ( ( s ) => s . trim ( ) )
258306 . filter ( Boolean )
259307 }
260308 } else {
261- result [ key ] = value
309+ result [ mappedKey ] = value
262310 }
263311 }
264312 return result
@@ -268,78 +316,116 @@ export const FindymailBlock: BlockConfig<FindymailResponse> = {
268316 inputs : {
269317 operation : { type : 'string' , description : 'Operation to perform' } ,
270318 apiKey : { type : 'string' , description : 'Findymail API key' } ,
271- email : { type : 'string' , description : 'Email address ' } ,
272- name : { type : 'string' , description : 'Full name or company name' } ,
273- domain : { type : 'string' , description : 'Company domain ' } ,
274- linkedin_url : { type : 'string' , description : 'LinkedIn profile or company URL ' } ,
319+ fn_name : { type : 'string' , description : 'Full name (find email from name) ' } ,
320+ fn_domain : { type : 'string' , description : 'Company domain or name (find email from name) ' } ,
321+ fefl_linkedin_url : { type : 'string' , description : 'LinkedIn URL (find email from LinkedIn) ' } ,
322+ fed_domain : { type : 'string' , description : 'Company domain (find emails by domain) ' } ,
275323 roles : { type : 'array' , description : 'Target roles (max 3)' } ,
324+ ve_email : { type : 'string' , description : 'Email address to verify' } ,
325+ rel_email : { type : 'string' , description : 'Email address for reverse lookup' } ,
276326 with_profile : { type : 'boolean' , description : 'Return full profile data on reverse lookup' } ,
327+ gc_linkedin_url : { type : 'string' , description : 'Company LinkedIn URL (get company info)' } ,
328+ gc_domain : { type : 'string' , description : 'Company domain (get company info)' } ,
329+ gc_name : { type : 'string' , description : 'Company name (get company info)' } ,
277330 website : { type : 'string' , description : 'Company website for employee search' } ,
278331 job_titles : { type : 'array' , description : 'Target job titles (max 10)' } ,
279332 count : { type : 'number' , description : 'Number of contacts to return (max 5)' } ,
333+ fp_linkedin_url : { type : 'string' , description : 'LinkedIn URL (find phone)' } ,
280334 q : { type : 'string' , description : 'Technology search query' } ,
335+ lt_domain : { type : 'string' , description : 'Company domain (lookup technologies)' } ,
281336 technologies : { type : 'array' , description : 'Technology names to filter by' } ,
282337 } ,
283338 outputs : {
284339 // Verify Email
285- verified : { type : 'boolean' , description : 'Whether the email is deliverable' } ,
286- provider : { type : 'string' , description : 'Email service provider' } ,
287- // Find / Reverse / Company
340+ verified : { type : 'boolean' , description : 'Whether the email is deliverable' , optional : true } ,
341+ provider : { type : 'string' , description : 'Email service provider' , optional : true } ,
342+ // Find Email / LinkedIn
288343 contact : {
289344 type : 'json' ,
290345 description : 'Contact found (name, email, domain)' ,
346+ optional : true ,
291347 } ,
292348 contacts : {
293349 type : 'array' ,
294350 description : 'Contacts found at the domain (name, email, domain)' ,
351+ optional : true ,
352+ } ,
353+ // Reverse Email Lookup
354+ linkedin_url : { type : 'string' , description : 'LinkedIn URL' , optional : true } ,
355+ fullName : { type : 'string' , description : 'Full name from LinkedIn profile' , optional : true } ,
356+ username : { type : 'string' , description : 'LinkedIn username' , optional : true } ,
357+ headline : { type : 'string' , description : 'Profile headline' , optional : true } ,
358+ jobTitle : { type : 'string' , description : 'Job title' , optional : true } ,
359+ summary : { type : 'string' , description : 'Profile summary' , optional : true } ,
360+ city : { type : 'string' , description : 'City' , optional : true } ,
361+ region : { type : 'string' , description : 'Region/state' , optional : true } ,
362+ country : { type : 'string' , description : 'Country' , optional : true } ,
363+ companyLinkedinUrl : {
364+ type : 'string' ,
365+ description : 'Current company LinkedIn URL' ,
366+ optional : true ,
367+ } ,
368+ companyName : { type : 'string' , description : 'Current company name' , optional : true } ,
369+ companyWebsite : { type : 'string' , description : 'Current company website' , optional : true } ,
370+ isPremium : {
371+ type : 'boolean' ,
372+ description : 'Whether the profile has LinkedIn Premium' ,
373+ optional : true ,
295374 } ,
296- linkedin_url : { type : 'string' , description : 'LinkedIn URL' } ,
297- fullName : { type : 'string' , description : 'Full name from LinkedIn profile' } ,
298- username : { type : 'string' , description : 'LinkedIn username' } ,
299- headline : { type : 'string' , description : 'Profile headline' } ,
300- jobTitle : { type : 'string' , description : 'Job title' } ,
301- summary : { type : 'string' , description : 'Profile summary' } ,
302- city : { type : 'string' , description : 'City' } ,
303- region : { type : 'string' , description : 'Region/state' } ,
304- country : { type : 'string' , description : 'Country' } ,
305- companyLinkedinUrl : { type : 'string' , description : 'Current company LinkedIn URL' } ,
306- companyName : { type : 'string' , description : 'Current company name' } ,
307- companyWebsite : { type : 'string' , description : 'Current company website' } ,
308- isPremium : { type : 'boolean' , description : 'Whether the profile has LinkedIn Premium' } ,
309- isOpenProfile : { type : 'boolean' , description : 'Whether the profile is open' } ,
310- skills : { type : 'array' , description : 'Profile skills' } ,
311- jobs : { type : 'array' , description : 'Job history entries' } ,
375+ isOpenProfile : { type : 'boolean' , description : 'Whether the profile is open' , optional : true } ,
376+ skills : { type : 'array' , description : 'Profile skills' , optional : true } ,
377+ jobs : { type : 'array' , description : 'Job history entries' , optional : true } ,
312378 educations : {
313379 type : 'array' ,
314380 description : 'Education history (school, degree, fieldOfStudy, startDate, endDate)' ,
381+ optional : true ,
315382 } ,
316383 certificates : {
317384 type : 'array' ,
318385 description : 'Certifications (name, issuingOrganization, issueDate, expirationDate)' ,
386+ optional : true ,
319387 } ,
320388 // Get Company
321- name : { type : 'string' , description : 'Company name (get-company)' } ,
322- domain : { type : 'string' , description : 'Company domain' } ,
323- company_size : { type : 'string' , description : 'Headcount range (e.g., 1001-5000)' } ,
324- industry : { type : 'string' , description : 'Industry classification' } ,
325- description : { type : 'string' , description : 'Company description' } ,
389+ name : { type : 'string' , description : 'Company name' , optional : true } ,
390+ domain : { type : 'string' , description : 'Company domain' , optional : true } ,
391+ company_size : {
392+ type : 'string' ,
393+ description : 'Headcount range (e.g., 1001-5000)' ,
394+ optional : true ,
395+ } ,
396+ industry : { type : 'string' , description : 'Industry classification' , optional : true } ,
397+ description : { type : 'string' , description : 'Company description' , optional : true } ,
326398 // Find Employees
327399 employees : {
328400 type : 'array' ,
329401 description : 'Employees found (name, linkedinUrl, companyWebsite, companyName, jobTitle)' ,
402+ optional : true ,
330403 } ,
331404 // Find Phone
332- phone : { type : 'string' , description : 'Phone number in E.164 format (US only)' } ,
333- line_type : { type : 'string' , description : 'Phone line type (Mobile, Landline)' } ,
405+ phone : {
406+ type : 'string' ,
407+ description : 'Phone number in E.164 format (US only)' ,
408+ optional : true ,
409+ } ,
410+ line_type : {
411+ type : 'string' ,
412+ description : 'Phone line type (Mobile, Landline)' ,
413+ optional : true ,
414+ } ,
334415 // Technologies
335416 technologies : {
336417 type : 'array' ,
337418 description : 'Technologies (name, category, subcategory, last_detected_at)' ,
419+ optional : true ,
338420 } ,
339421 // Get Credits
340- credits : { type : 'number' , description : 'Remaining finder credits' } ,
341- verifier_credits : { type : 'number' , description : 'Remaining verifier credits' } ,
342- // Reverse / Verify shared
343- email : { type : 'string' , description : 'Email address' } ,
422+ credits : { type : 'number' , description : 'Remaining finder credits' , optional : true } ,
423+ verifier_credits : {
424+ type : 'number' ,
425+ description : 'Remaining verifier credits' ,
426+ optional : true ,
427+ } ,
428+ // Verify / Reverse shared
429+ email : { type : 'string' , description : 'Email address' , optional : true } ,
344430 } ,
345431}
0 commit comments