From 8f318de288e04023003e86051e55a16c5628fb6a Mon Sep 17 00:00:00 2001 From: lublak Date: Mon, 15 Feb 2021 12:34:05 +0100 Subject: [PATCH 001/137] get also the dir data of the path --- packages/core/src/NodeExecuteFunctions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index dcdc2bd4bb..ebf501a68b 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -103,6 +103,7 @@ export async function prepareBinaryData(binaryData: Buffer, filePath?: string, m const filePathParts = path.parse(filePath as string); + returnData.dir = filePathParts.dir; returnData.fileName = filePathParts.base; // Remove the dot From cb9f31c49d2906ba4525aae2f4f07316fc57efc2 Mon Sep 17 00:00:00 2001 From: lublak Date: Mon, 15 Feb 2021 13:25:30 +0100 Subject: [PATCH 002/137] add dir to different positions --- packages/editor-ui/src/components/RunData.vue | 4 ++++ packages/nodes-base/nodes/ReadBinaryFiles.node.ts | 4 +--- packages/workflow/src/Interfaces.ts | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/editor-ui/src/components/RunData.vue b/packages/editor-ui/src/components/RunData.vue index 8ce435b6d6..8df52c69b0 100644 --- a/packages/editor-ui/src/components/RunData.vue +++ b/packages/editor-ui/src/components/RunData.vue @@ -157,6 +157,10 @@
File Name:
{{binaryData.fileName}}
+
+
Directory:
+
{{binaryData.dir}}
+
File Extension:
{{binaryData.fileExtension}}
diff --git a/packages/nodes-base/nodes/ReadBinaryFiles.node.ts b/packages/nodes-base/nodes/ReadBinaryFiles.node.ts index 4e8d9f2ac3..7a42764f35 100644 --- a/packages/nodes-base/nodes/ReadBinaryFiles.node.ts +++ b/packages/nodes-base/nodes/ReadBinaryFiles.node.ts @@ -60,14 +60,12 @@ export class ReadBinaryFiles implements INodeType { const items: INodeExecutionData[] = []; let item: INodeExecutionData; let data: Buffer; - let fileName: string; for (const filePath of files) { data = await fsReadFileAsync(filePath) as Buffer; - fileName = path.parse(filePath).base; item = { binary: { - [dataPropertyName]: await this.helpers.prepareBinaryData(data, fileName), + [dataPropertyName]: await this.helpers.prepareBinaryData(data, filePath), }, json: {}, }; diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index fc1498651f..22b762fe82 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -9,6 +9,7 @@ export interface IBinaryData { data: string; mimeType: string; fileName?: string; + dir?: string; fileExtension?: string; } From 46d1a5fe58b6d6b4ee0a11be3ee930905ae56e2e Mon Sep 17 00:00:00 2001 From: dali Date: Tue, 16 Feb 2021 07:23:37 +0100 Subject: [PATCH 003/137] Remove executeSingle from EmailSend node --- packages/nodes-base/nodes/EmailSend.node.ts | 151 +++++++++++--------- 1 file changed, 81 insertions(+), 70 deletions(-) diff --git a/packages/nodes-base/nodes/EmailSend.node.ts b/packages/nodes-base/nodes/EmailSend.node.ts index f2ca08ad46..7e203d8890 100644 --- a/packages/nodes-base/nodes/EmailSend.node.ts +++ b/packages/nodes-base/nodes/EmailSend.node.ts @@ -1,6 +1,6 @@ import { BINARY_ENCODING, - IExecuteSingleFunctions, + IExecuteFunctions } from 'n8n-core'; import { IDataObject, @@ -124,84 +124,95 @@ export class EmailSend implements INodeType { }; - async executeSingle(this: IExecuteSingleFunctions): Promise { - const item = this.getInputData(); + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); - const fromEmail = this.getNodeParameter('fromEmail') as string; - const toEmail = this.getNodeParameter('toEmail') as string; - const ccEmail = this.getNodeParameter('ccEmail') as string; - const bccEmail = this.getNodeParameter('bccEmail') as string; - const subject = this.getNodeParameter('subject') as string; - const text = this.getNodeParameter('text') as string; - const html = this.getNodeParameter('html') as string; - const attachmentPropertyString = this.getNodeParameter('attachments') as string; - const options = this.getNodeParameter('options', {}) as IDataObject; + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - const credentials = this.getCredentials('smtp'); + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + + item = items[itemIndex]; + console.log(item,itemIndex) + const fromEmail = this.getNodeParameter('fromEmail', itemIndex) as string; + const toEmail = this.getNodeParameter('toEmail', itemIndex) as string; + const ccEmail = this.getNodeParameter('ccEmail', itemIndex) as string; + const bccEmail = this.getNodeParameter('bccEmail', itemIndex) as string; + const subject = this.getNodeParameter('subject', itemIndex) as string; + const text = this.getNodeParameter('text', itemIndex) as string; + const html = this.getNodeParameter('html', itemIndex) as string; + const attachmentPropertyString = this.getNodeParameter('attachments', itemIndex) as string; + const options = this.getNodeParameter('options', itemIndex, {}) as IDataObject; - if (credentials === undefined) { - throw new Error('No credentials got returned!'); - } + const credentials = this.getCredentials('smtp'); - const connectionOptions: SMTPTransport.Options = { - host: credentials.host as string, - port: credentials.port as number, - secure: credentials.secure as boolean, - }; - - if(credentials.user || credentials.password) { - // @ts-ignore - connectionOptions.auth = { - user: credentials.user as string, - pass: credentials.password as string, - }; - } - - if (options.allowUnauthorizedCerts === true) { - connectionOptions.tls = { - rejectUnauthorized: false, - }; - } - - const transporter = createTransport(connectionOptions); - - // setup email data with unicode symbols - const mailOptions = { - from: fromEmail, - to: toEmail, - cc: ccEmail, - bcc: bccEmail, - subject, - text, - html, - }; - - if (attachmentPropertyString && item.binary) { - const attachments = []; - const attachmentProperties: string[] = attachmentPropertyString.split(',').map((propertyName) => { - return propertyName.trim(); - }); - - for (const propertyName of attachmentProperties) { - if (!item.binary.hasOwnProperty(propertyName)) { - continue; - } - attachments.push({ - filename: item.binary[propertyName].fileName || 'unknown', - content: Buffer.from(item.binary[propertyName].data, BINARY_ENCODING), - }); + if (credentials === undefined) { + throw new Error('No credentials got returned!'); } - if (attachments.length) { + const connectionOptions: SMTPTransport.Options = { + host: credentials.host as string, + port: credentials.port as number, + secure: credentials.secure as boolean, + }; + + if(credentials.user || credentials.password) { // @ts-ignore - mailOptions.attachments = attachments; + connectionOptions.auth = { + user: credentials.user as string, + pass: credentials.password as string, + }; } + + if (options.allowUnauthorizedCerts === true) { + connectionOptions.tls = { + rejectUnauthorized: false, + }; + } + + const transporter = createTransport(connectionOptions); + + // setup email data with unicode symbols + const mailOptions = { + from: fromEmail, + to: toEmail, + cc: ccEmail, + bcc: bccEmail, + subject, + text, + html, + }; + + if (attachmentPropertyString && item.binary) { + const attachments = []; + const attachmentProperties: string[] = attachmentPropertyString.split(',').map((propertyName) => { + return propertyName.trim(); + }); + + for (const propertyName of attachmentProperties) { + if (!item.binary.hasOwnProperty(propertyName)) { + continue; + } + attachments.push({ + filename: item.binary[propertyName].fileName || 'unknown', + content: Buffer.from(item.binary[propertyName].data, BINARY_ENCODING), + }); + } + + if (attachments.length) { + // @ts-ignore + mailOptions.attachments = attachments; + } + } + + // Send the email + const info = await transporter.sendMail(mailOptions); + + returnData.push({ json: info }); } - - // Send the email - const info = await transporter.sendMail(mailOptions); - - return { json: info }; + + return this.prepareOutputData(returnData); } } From 8d119852f64be150525b8326d63e019d8542224f Mon Sep 17 00:00:00 2001 From: dali Date: Tue, 16 Feb 2021 08:09:10 +0100 Subject: [PATCH 004/137] Remove executeSingle from ReadBinaryFile node --- packages/nodes-base/nodes/EmailSend.node.ts | 2 +- .../nodes-base/nodes/ReadBinaryFile.node.ts | 62 +++++++++++-------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/packages/nodes-base/nodes/EmailSend.node.ts b/packages/nodes-base/nodes/EmailSend.node.ts index 7e203d8890..2bdc29076f 100644 --- a/packages/nodes-base/nodes/EmailSend.node.ts +++ b/packages/nodes-base/nodes/EmailSend.node.ts @@ -134,7 +134,7 @@ export class EmailSend implements INodeType { for (let itemIndex = 0; itemIndex < length; itemIndex++) { item = items[itemIndex]; - console.log(item,itemIndex) + const fromEmail = this.getNodeParameter('fromEmail', itemIndex) as string; const toEmail = this.getNodeParameter('toEmail', itemIndex) as string; const ccEmail = this.getNodeParameter('ccEmail', itemIndex) as string; diff --git a/packages/nodes-base/nodes/ReadBinaryFile.node.ts b/packages/nodes-base/nodes/ReadBinaryFile.node.ts index ee38fc0cdc..e8be54cd4c 100644 --- a/packages/nodes-base/nodes/ReadBinaryFile.node.ts +++ b/packages/nodes-base/nodes/ReadBinaryFile.node.ts @@ -1,4 +1,4 @@ -import { IExecuteSingleFunctions } from 'n8n-core'; +import { IExecuteFunctions } from 'n8n-core'; import { INodeExecutionData, INodeType, @@ -49,38 +49,46 @@ export class ReadBinaryFile implements INodeType { }; - async executeSingle(this: IExecuteSingleFunctions): Promise { - const item = this.getInputData(); + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); - const dataPropertyName = this.getNodeParameter('dataPropertyName') as string; - const filePath = this.getNodeParameter('filePath') as string; + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - let data; - try { - data = await fsReadFileAsync(filePath) as Buffer; - } catch (error) { - if (error.code === 'ENOENT') { - throw new Error(`The file "${filePath}" could not be found.`); + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + item = items[itemIndex]; + const dataPropertyName = this.getNodeParameter('dataPropertyName', itemIndex) as string; + const filePath = this.getNodeParameter('filePath', itemIndex) as string; + + let data; + try { + data = await fsReadFileAsync(filePath) as Buffer; + } catch (error) { + if (error.code === 'ENOENT') { + throw new Error(`The file "${filePath}" could not be found.`); + } + + throw error; } - throw error; - } + const newItem: INodeExecutionData = { + json: item.json, + binary: {}, + }; - const newItem: INodeExecutionData = { - json: item.json, - binary: {}, - }; + if (item.binary !== undefined) { + // Create a shallow copy of the binary data so that the old + // data references which do not get changed still stay behind + // but the incoming data does not get changed. + Object.assign(newItem.binary, item.binary); + } - if (item.binary !== undefined) { - // Create a shallow copy of the binary data so that the old - // data references which do not get changed still stay behind - // but the incoming data does not get changed. - Object.assign(newItem.binary, item.binary); - } - - newItem.binary![dataPropertyName] = await this.helpers.prepareBinaryData(data, filePath); - - return newItem; + newItem.binary![dataPropertyName] = await this.helpers.prepareBinaryData(data, filePath); + returnData.push(newItem); + } + + return this.prepareOutputData(returnData); } } From b0664d2aa04ec7785bb1e08fb8a1222f7ca3732c Mon Sep 17 00:00:00 2001 From: dali Date: Tue, 16 Feb 2021 09:51:48 +0100 Subject: [PATCH 005/137] Remove executeSingle from ReadPdf node --- packages/nodes-base/nodes/ReadPdf.node.ts | 34 ++++++++++++++--------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/nodes-base/nodes/ReadPdf.node.ts b/packages/nodes-base/nodes/ReadPdf.node.ts index 785683b8ae..0213969adb 100644 --- a/packages/nodes-base/nodes/ReadPdf.node.ts +++ b/packages/nodes-base/nodes/ReadPdf.node.ts @@ -1,6 +1,6 @@ import { BINARY_ENCODING, - IExecuteSingleFunctions, + IExecuteFunctions, } from 'n8n-core'; import { @@ -37,22 +37,30 @@ export class ReadPdf implements INodeType { ], }; + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); - async executeSingle(this: IExecuteSingleFunctions): Promise { + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - const binaryPropertyName = this.getNodeParameter('binaryPropertyName') as string; + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + + item = items[itemIndex]; + const binaryPropertyName = this.getNodeParameter('binaryPropertyName', itemIndex) as string; - const item = this.getInputData(); + if (item.binary === undefined) { + item.binary = {}; + } - if (item.binary === undefined) { - item.binary = {}; + const binaryData = Buffer.from(item.binary[binaryPropertyName].data, BINARY_ENCODING); + returnData.push({ + binary: item.binary, + json: await pdf(binaryData), + }); + } - - const binaryData = Buffer.from(item.binary[binaryPropertyName].data, BINARY_ENCODING); - - return { - binary: item.binary, - json: await pdf(binaryData), - }; + return this.prepareOutputData(returnData); } + } From 735a7e681247db358da5a06a3aca246a15ceedb0 Mon Sep 17 00:00:00 2001 From: dali Date: Tue, 16 Feb 2021 10:42:46 +0100 Subject: [PATCH 006/137] Remove executeSingle from WriteBinaryFile node --- .../nodes-base/nodes/WriteBinaryFile.node.ts | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/packages/nodes-base/nodes/WriteBinaryFile.node.ts b/packages/nodes-base/nodes/WriteBinaryFile.node.ts index eb56a006fd..f329f47093 100644 --- a/packages/nodes-base/nodes/WriteBinaryFile.node.ts +++ b/packages/nodes-base/nodes/WriteBinaryFile.node.ts @@ -1,6 +1,7 @@ import { BINARY_ENCODING, - IExecuteSingleFunctions, + IExecuteFunctions, + IExecuteSingleFunctions } from 'n8n-core'; import { IDataObject, @@ -53,39 +54,53 @@ export class WriteBinaryFile implements INodeType { }; - async executeSingle(this: IExecuteSingleFunctions): Promise { - const item = this.getInputData(); + async execute(this: IExecuteFunctions): Promise { + + const items = this.getInputData(); - const dataPropertyName = this.getNodeParameter('dataPropertyName') as string; - const fileName = this.getNodeParameter('fileName') as string; + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - if (item.binary === undefined) { - throw new Error('No binary data set. So file can not be written!'); + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + + const dataPropertyName = this.getNodeParameter('dataPropertyName', itemIndex) as string; + + const fileName = this.getNodeParameter('fileName', itemIndex) as string; + + item = items[itemIndex]; + + if (item.binary === undefined) { + throw new Error('No binary data set. So file can not be written!'); + } + + if (item.binary[dataPropertyName] === undefined) { + throw new Error(`The binary property "${dataPropertyName}" does not exist. So no file can be written!`); + } + + // Write the file to disk + await fsWriteFileAsync(fileName, Buffer.from(item.binary[dataPropertyName].data, BINARY_ENCODING), 'binary'); + + const newItem: INodeExecutionData = { + json: {}, + }; + Object.assign(newItem.json, item.json); + + if (item.binary !== undefined) { + // Create a shallow copy of the binary data so that the old + // data references which do not get changed still stay behind + // but the incoming data does not get changed. + newItem.binary = {}; + Object.assign(newItem.binary, item.binary); + } + + // Add the file name to data + + (newItem.json as IDataObject).fileName = fileName; + + returnData.push(newItem); } - - if (item.binary[dataPropertyName] === undefined) { - throw new Error(`The binary property "${dataPropertyName}" does not exist. So no file can be written!`); - } - - // Write the file to disk - await fsWriteFileAsync(fileName, Buffer.from(item.binary[dataPropertyName].data, BINARY_ENCODING), 'binary'); - - const newItem: INodeExecutionData = { - json: {}, - }; - Object.assign(newItem.json, item.json); - - if (item.binary !== undefined) { - // Create a shallow copy of the binary data so that the old - // data references which do not get changed still stay behind - // but the incoming data does not get changed. - newItem.binary = {}; - Object.assign(newItem.binary, item.binary); - } - - // Add the file name to data - (newItem.json as IDataObject).fileName = fileName; - - return newItem; + return this.prepareOutputData(returnData); } + } From 81f33b4c043870de7ba71fda77818fa358f04485 Mon Sep 17 00:00:00 2001 From: dali Date: Wed, 17 Feb 2021 08:51:02 +0100 Subject: [PATCH 007/137] Remove executeSingle from FunctionItem node --- .../nodes-base/nodes/FunctionItem.node.ts | 124 ++++++++++-------- 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/packages/nodes-base/nodes/FunctionItem.node.ts b/packages/nodes-base/nodes/FunctionItem.node.ts index cd0eae6df9..d62e2e4a58 100644 --- a/packages/nodes-base/nodes/FunctionItem.node.ts +++ b/packages/nodes-base/nodes/FunctionItem.node.ts @@ -1,4 +1,4 @@ -import { IExecuteSingleFunctions } from 'n8n-core'; +import { IExecuteFunctions } from 'n8n-core'; import { IBinaryKeyData, IDataObject, @@ -40,74 +40,84 @@ export class FunctionItem implements INodeType { ], }; - async executeSingle(this: IExecuteSingleFunctions): Promise { - let item = this.getInputData(); + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); - // Copy the items as they may get changed in the functions - item = JSON.parse(JSON.stringify(item)); + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - // Define the global objects for the custom function - const sandbox = { - getBinaryData: (): IBinaryKeyData | undefined => { - return item.binary; - }, - getNodeParameter: this.getNodeParameter, - getWorkflowStaticData: this.getWorkflowStaticData, - helpers: this.helpers, - item: item.json, - setBinaryData: (data: IBinaryKeyData) => { - item.binary = data; - }, - }; + for (let itemIndex = 0; itemIndex < length; itemIndex++) { - // Make it possible to access data via $node, $parameter, ... - const dataProxy = this.getWorkflowDataProxy(); - Object.assign(sandbox, dataProxy); + item = items[itemIndex]; - const options = { - console: 'inherit', - sandbox, - require: { - external: false as boolean | { modules: string[] }, - builtin: [] as string[], - }, - }; + // Copy the items as they may get changed in the functions + item = JSON.parse(JSON.stringify(item)); - if (process.env.NODE_FUNCTION_ALLOW_BUILTIN) { - options.require.builtin = process.env.NODE_FUNCTION_ALLOW_BUILTIN.split(','); - } + // Define the global objects for the custom function + const sandbox = { + getBinaryData: (): IBinaryKeyData | undefined => { + return item.binary; + }, + getNodeParameter: this.getNodeParameter, + getWorkflowStaticData: this.getWorkflowStaticData, + helpers: this.helpers, + item: item.json, + setBinaryData: (data: IBinaryKeyData) => { + item.binary = data; + }, + }; - if (process.env.NODE_FUNCTION_ALLOW_EXTERNAL) { - options.require.external = { modules: process.env.NODE_FUNCTION_ALLOW_EXTERNAL.split(',') }; - } + // Make it possible to access data via $node, $parameter, ... + const dataProxy = this.getWorkflowDataProxy(itemIndex); + Object.assign(sandbox, dataProxy); - const vm = new NodeVM(options); + const options = { + console: 'inherit', + sandbox, + require: { + external: false as boolean | { modules: string[] }, + builtin: [] as string[], + }, + }; - // Get the code to execute - const functionCode = this.getNodeParameter('functionCode') as string; + if (process.env.NODE_FUNCTION_ALLOW_BUILTIN) { + options.require.builtin = process.env.NODE_FUNCTION_ALLOW_BUILTIN.split(','); + } + + if (process.env.NODE_FUNCTION_ALLOW_EXTERNAL) { + options.require.external = { modules: process.env.NODE_FUNCTION_ALLOW_EXTERNAL.split(',') }; + } + + const vm = new NodeVM(options); + + // Get the code to execute + const functionCode = this.getNodeParameter('functionCode', itemIndex) as string; - let jsonData: IDataObject; - try { - // Execute the function code - jsonData = await vm.run(`module.exports = async function() {${functionCode}}()`, __dirname); - } catch (e) { - return Promise.reject(e); - } + let jsonData: IDataObject; + try { + // Execute the function code + jsonData = await vm.run(`module.exports = async function() {${functionCode}}()`, __dirname); + } catch (e) { + return Promise.reject(e); + } - // Do very basic validation of the data - if (jsonData === undefined) { - throw new Error('No data got returned. Always an object has to be returned!'); - } + // Do very basic validation of the data + if (jsonData === undefined) { + throw new Error('No data got returned. Always an object has to be returned!'); + } - const returnItem: INodeExecutionData = { - json: jsonData, - }; + const returnItem: INodeExecutionData = { + json: jsonData, + }; - if (item.binary) { - returnItem.binary = item.binary; - } - - return returnItem; + if (item.binary) { + returnItem.binary = item.binary; + } + + returnData.push(returnItem); + } + return this.prepareOutputData(returnData); } } From 5cce827d6f8b186d48ae548b70c895f4400638ad Mon Sep 17 00:00:00 2001 From: dali Date: Mon, 22 Feb 2021 15:07:53 +0100 Subject: [PATCH 008/137] Remove executeSingle from Mailgun node --- .../nodes-base/nodes/Mailgun/Mailgun.node.ts | 135 ++++++++++-------- 1 file changed, 72 insertions(+), 63 deletions(-) diff --git a/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts b/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts index 8e5c1de699..fc2625d631 100644 --- a/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts +++ b/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts @@ -1,6 +1,6 @@ import { BINARY_ENCODING, - IExecuteSingleFunctions, + IExecuteFunctions, } from 'n8n-core'; import { IDataObject, @@ -105,80 +105,89 @@ export class Mailgun implements INodeType { }; - async executeSingle(this: IExecuteSingleFunctions): Promise { - const item = this.getInputData(); + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - const fromEmail = this.getNodeParameter('fromEmail') as string; - const toEmail = this.getNodeParameter('toEmail') as string; - const ccEmail = this.getNodeParameter('ccEmail') as string; - const bccEmail = this.getNodeParameter('bccEmail') as string; - const subject = this.getNodeParameter('subject') as string; - const text = this.getNodeParameter('text') as string; - const html = this.getNodeParameter('html') as string; - const attachmentPropertyString = this.getNodeParameter('attachments') as string; + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + item = items[itemIndex]; - const credentials = this.getCredentials('mailgunApi'); + const fromEmail = this.getNodeParameter('fromEmail', itemIndex) as string; + const toEmail = this.getNodeParameter('toEmail', itemIndex) as string; + const ccEmail = this.getNodeParameter('ccEmail', itemIndex) as string; + const bccEmail = this.getNodeParameter('bccEmail', itemIndex) as string; + const subject = this.getNodeParameter('subject', itemIndex) as string; + const text = this.getNodeParameter('text', itemIndex) as string; + const html = this.getNodeParameter('html', itemIndex) as string; + const attachmentPropertyString = this.getNodeParameter('attachments', itemIndex) as string; - if (credentials === undefined) { - throw new Error('No credentials got returned!'); - } + const credentials = this.getCredentials('mailgunApi'); - const formData: IDataObject = { - from: fromEmail, - to: toEmail, - subject, - text, - html, - }; + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } - if (ccEmail.length !== 0) { - formData.cc = ccEmail; - } - if (bccEmail.length !== 0) { - formData.bcc = bccEmail; - } + const formData: IDataObject = { + from: fromEmail, + to: toEmail, + subject, + text, + html, + }; - if (attachmentPropertyString && item.binary) { + if (ccEmail.length !== 0) { + formData.cc = ccEmail; + } + if (bccEmail.length !== 0) { + formData.bcc = bccEmail; + } - const attachments = []; - const attachmentProperties: string[] = attachmentPropertyString.split(',').map((propertyName) => { - return propertyName.trim(); - }); + if (attachmentPropertyString && item.binary) { - for (const propertyName of attachmentProperties) { - if (!item.binary.hasOwnProperty(propertyName)) { - continue; - } - attachments.push({ - value: Buffer.from(item.binary[propertyName].data, BINARY_ENCODING), - options: { - filename: item.binary[propertyName].fileName || 'unknown', - - }, + const attachments = []; + const attachmentProperties: string[] = attachmentPropertyString.split(',').map((propertyName) => { + return propertyName.trim(); }); + + for (const propertyName of attachmentProperties) { + if (!item.binary.hasOwnProperty(propertyName)) { + continue; + } + attachments.push({ + value: Buffer.from(item.binary[propertyName].data, BINARY_ENCODING), + options: { + filename: item.binary[propertyName].fileName || 'unknown', + + }, + }); + } + + if (attachments.length) { + // @ts-ignore + formData.attachment = attachments; + } } - if (attachments.length) { - // @ts-ignore - formData.attachment = attachments; - } - } + const options = { + method: 'POST', + formData, + uri: `https://${credentials.apiDomain}/v3/${credentials.emailDomain}/messages`, + auth: { + user: 'api', + pass: credentials.apiKey as string, + }, + json: true, + }; - const options = { - method: 'POST', - formData, - uri: `https://${credentials.apiDomain}/v3/${credentials.emailDomain}/messages`, - auth: { - user: 'api', - pass: credentials.apiKey as string, - }, - json: true, - }; + const responseData = await this.helpers.request(options); - const responseData = await this.helpers.request(options); - - return { - json: responseData, - }; + returnData.push({ + json: responseData, + }); + } + return this.prepareOutputData(returnData) } } From 4bf7ea3e26bc16b3a2a7e17d4a1a05224731cd55 Mon Sep 17 00:00:00 2001 From: dali Date: Mon, 22 Feb 2021 16:10:01 +0100 Subject: [PATCH 009/137] :bug: Fix Empty buffer error in ImageEdit node --- packages/nodes-base/nodes/EditImage.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/EditImage.node.ts b/packages/nodes-base/nodes/EditImage.node.ts index 67ba06679a..af81cbbe67 100644 --- a/packages/nodes-base/nodes/EditImage.node.ts +++ b/packages/nodes-base/nodes/EditImage.node.ts @@ -11,7 +11,7 @@ import { INodeType, INodeTypeDescription, } from 'n8n-workflow'; -import * as gm from 'gm'; +const gm = require('gm').subClass({imageMagick: true}); import { file } from 'tmp-promise'; import { parse as pathParse, From 256711737c480b2cb699f43d4a0ffc18e555502b Mon Sep 17 00:00:00 2001 From: dali Date: Mon, 22 Feb 2021 16:36:54 +0100 Subject: [PATCH 010/137] Remove executeSingle from Edit Image node --- packages/nodes-base/nodes/EditImage.node.ts | 528 ++++++++++---------- 1 file changed, 269 insertions(+), 259 deletions(-) diff --git a/packages/nodes-base/nodes/EditImage.node.ts b/packages/nodes-base/nodes/EditImage.node.ts index af81cbbe67..54589c0f56 100644 --- a/packages/nodes-base/nodes/EditImage.node.ts +++ b/packages/nodes-base/nodes/EditImage.node.ts @@ -1,6 +1,6 @@ import { BINARY_ENCODING, - IExecuteSingleFunctions, + IExecuteFunctions, } from 'n8n-core'; import { IDataObject, @@ -948,291 +948,301 @@ export class EditImage implements INodeType { }, }; + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + const returnData: INodeExecutionData[] = []; + const length = items.length as unknown as number; + let item: INodeExecutionData; - async executeSingle(this: IExecuteSingleFunctions): Promise { - const item = this.getInputData(); + for (let itemIndex = 0; itemIndex < length; itemIndex++) { + item = items[itemIndex]; - const operation = this.getNodeParameter('operation', 0) as string; - const dataPropertyName = this.getNodeParameter('dataPropertyName') as string; - const options = this.getNodeParameter('options', {}) as IDataObject; + const operation = this.getNodeParameter('operation', itemIndex) as string; + const dataPropertyName = this.getNodeParameter('dataPropertyName', itemIndex) as string; - const cleanupFunctions: Array<() => void> = []; + const options = this.getNodeParameter('options', itemIndex,{}) as IDataObject; - let gmInstance: gm.State; + const cleanupFunctions: Array<() => void> = []; - const requiredOperationParameters: { - [key: string]: string[], - } = { - blur: [ - 'blur', - 'sigma', - ], - border: [ - 'borderColor', - 'borderWidth', - 'borderHeight', - ], - create: [ - 'backgroundColor', - 'height', - 'width', - ], - crop: [ - 'height', - 'positionX', - 'positionY', - 'width', - ], - composite: [ - 'dataPropertyNameComposite', - 'positionX', - 'positionY', - ], - draw: [ - 'color', - 'cornerRadius', - 'endPositionX', - 'endPositionY', - 'primitive', - 'startPositionX', - 'startPositionY', - ], - information: [], - resize: [ - 'height', - 'resizeOption', - 'width', - ], - rotate: [ - 'backgroundColor', - 'rotate', - ], - shear: [ - 'degreesX', - 'degreesY', - ], - text: [ - 'font', - 'fontColor', - 'fontSize', - 'lineLength', - 'positionX', - 'positionY', - 'text', - ], - }; + let gmInstance: gm.State; - let operations: IDataObject[] = []; - if (operation === 'multiStep') { - // Operation parameters are already in the correct format - const operationsData = this.getNodeParameter('operations', { operations: [] }) as IDataObject; - operations = operationsData.operations as IDataObject[]; - } else { - // Operation parameters have to first get collected - const operationParameters: IDataObject = {}; - requiredOperationParameters[operation].forEach(parameterName => { - try { - operationParameters[parameterName] = this.getNodeParameter(parameterName); - } catch (e) {} - }); + const requiredOperationParameters: { + [key: string]: string[], + } = { + blur: [ + 'blur', + 'sigma', + ], + border: [ + 'borderColor', + 'borderWidth', + 'borderHeight', + ], + create: [ + 'backgroundColor', + 'height', + 'width', + ], + crop: [ + 'height', + 'positionX', + 'positionY', + 'width', + ], + composite: [ + 'dataPropertyNameComposite', + 'positionX', + 'positionY', + ], + draw: [ + 'color', + 'cornerRadius', + 'endPositionX', + 'endPositionY', + 'primitive', + 'startPositionX', + 'startPositionY', + ], + information: [], + resize: [ + 'height', + 'resizeOption', + 'width', + ], + rotate: [ + 'backgroundColor', + 'rotate', + ], + shear: [ + 'degreesX', + 'degreesY', + ], + text: [ + 'font', + 'fontColor', + 'fontSize', + 'lineLength', + 'positionX', + 'positionY', + 'text', + ], + }; - operations = [ - { - operation, - ...operationParameters, - }, - ]; - } - - if (operations[0].operation !== 'create') { - // "create" generates a new image so does not require any incoming data. - if (item.binary === undefined) { - throw new Error('Item does not contain any binary data.'); - } - - if (item.binary[dataPropertyName as string] === undefined) { - throw new Error(`Item does not contain any binary data with the name "${dataPropertyName}".`); - } - - gmInstance = gm(Buffer.from(item.binary![dataPropertyName as string].data, BINARY_ENCODING)); - gmInstance = gmInstance.background('transparent'); - } - - if (operation === 'information') { - // Just return the information - const imageData = await new Promise((resolve, reject) => { - gmInstance = gmInstance.identify((error, imageData) => { - if (error) { - reject(error); - return; - } - resolve(imageData as unknown as IDataObject); + let operations: IDataObject[] = []; + if (operation === 'multiStep') { + // Operation parameters are already in the correct format + const operationsData = this.getNodeParameter('operations', itemIndex ,{ operations: [] }) as IDataObject; + operations = operationsData.operations as IDataObject[]; + } else { + // Operation parameters have to first get collected + const operationParameters: IDataObject = {}; + requiredOperationParameters[operation].forEach(parameterName => { + try { + operationParameters[parameterName] = this.getNodeParameter(parameterName, itemIndex); + } catch (e) {} }); - }); - item.json = imageData; - return item; - } + operations = [ + { + operation, + ...operationParameters, + }, + ]; + } - for (let i = 0; i < operations.length; i++) { - const operationData = operations[i]; - if (operationData.operation === 'blur') { - gmInstance = gmInstance!.blur(operationData.blur as number, operationData.sigma as number); - } else if (operationData.operation === 'border') { - gmInstance = gmInstance!.borderColor(operationData.borderColor as string).border(operationData.borderWidth as number, operationData.borderHeight as number); - } else if (operationData.operation === 'composite') { - const positionX = operationData.positionX as number; - const positionY = operationData.positionY as number; - - const geometryString = (positionX >= 0 ? '+' : '') + positionX + (positionY >= 0 ? '+' : '') + positionY; - - if (item.binary![operationData.dataPropertyNameComposite as string] === undefined) { - throw new Error(`Item does not contain any binary data with the name "${operationData.dataPropertyNameComposite}".`); + if (operations[0].operation !== 'create') { + // "create" generates a new image so does not require any incoming data. + if (item.binary === undefined) { + throw new Error('Item does not contain any binary data.'); } - const { fd, path, cleanup } = await file(); - cleanupFunctions.push(cleanup); - await fsWriteFileAsync(fd, Buffer.from(item.binary![operationData.dataPropertyNameComposite as string].data, BINARY_ENCODING)); - - if (operations[0].operation === 'create') { - // It seems like if the image gets created newly we have to create a new gm instance - // else it fails for some reason - gmInstance = gm(gmInstance!.stream('png')).geometry(geometryString).composite(path); - } else { - gmInstance = gmInstance!.geometry(geometryString).composite(path); + if (item.binary[dataPropertyName as string] === undefined) { + throw new Error(`Item does not contain any binary data with the name "${dataPropertyName}".`); } - if (operations.length !== i + 1) { - // If there are other operations after the current one create a new gm instance - // because else things do get messed up - gmInstance = gm(gmInstance.stream()); - } - } else if (operationData.operation === 'create') { - gmInstance = gm(operationData.width as number, operationData.height as number, operationData.backgroundColor as string); - if (!options.format) { - options.format = 'png'; - } - } else if (operationData.operation === 'crop') { - gmInstance = gmInstance!.crop(operationData.width as number, operationData.height as number, operationData.positionX as number, operationData.positionY as number); - } else if (operationData.operation === 'draw') { - gmInstance = gmInstance!.fill(operationData.color as string); + gmInstance = gm(Buffer.from(item.binary![dataPropertyName as string].data, BINARY_ENCODING)); + gmInstance = gmInstance.background('transparent'); + } - if (operationData.primitive === 'line') { - gmInstance = gmInstance.drawLine(operationData.startPositionX as number, operationData.startPositionY as number, operationData.endPositionX as number, operationData.endPositionY as number); - } else if (operationData.primitive === 'rectangle') { - gmInstance = gmInstance.drawRectangle(operationData.startPositionX as number, operationData.startPositionY as number, operationData.endPositionX as number, operationData.endPositionY as number, operationData.cornerRadius as number || undefined); - } - } else if (operationData.operation === 'resize') { - const resizeOption = operationData.resizeOption as string; - - // By default use "maximumArea" - let option: gm.ResizeOption = '@'; - if (resizeOption === 'ignoreAspectRatio') { - option = '!'; - } else if (resizeOption === 'minimumArea') { - option = '^'; - } else if (resizeOption === 'onlyIfSmaller') { - option = '<'; - } else if (resizeOption === 'onlyIfLarger') { - option = '>'; - } else if (resizeOption === 'percent') { - option = '%'; - } - - gmInstance = gmInstance!.resize(operationData.width as number, operationData.height as number, option); - } else if (operationData.operation === 'rotate') { - gmInstance = gmInstance!.rotate(operationData.backgroundColor as string, operationData.rotate as number); - } else if (operationData.operation === 'shear') { - gmInstance = gmInstance!.shear(operationData.degreesX as number, operationData.degreesY as number); - } else if (operationData.operation === 'text') { - // Split the text in multiple lines - const lines: string[] = []; - let currentLine = ''; - (operationData.text as string).split('\n').forEach((textLine: string) => { - textLine.split(' ').forEach((textPart: string) => { - if ((currentLine.length + textPart.length + 1) > (operationData.lineLength as number)) { - lines.push(currentLine.trim()); - currentLine = `${textPart} `; + if (operation === 'information') { + // Just return the information + const imageData = await new Promise((resolve, reject) => { + gmInstance = gmInstance.identify((error:any, imageData:any) => { + if (error) { + reject(error); return; } - currentLine += `${textPart} `; + resolve(imageData as unknown as IDataObject); }); - - lines.push(currentLine.trim()); - currentLine = ''; }); - // Combine the lines to a single string - const renderText = lines.join('\n'); - - const font = options.font || operationData.font; - - if (font && font !== 'default') { - gmInstance = gmInstance!.font(font as string); - } - - gmInstance = gmInstance! - .fill(operationData.fontColor as string) - .fontSize(operationData.fontSize as number) - .drawText(operationData.positionX as number, operationData.positionY as number, renderText); + item.json = imageData; + returnData.push(item); } - } - const newItem: INodeExecutionData = { - json: item.json, - binary: {}, - }; + for (let i = 0; i < operations.length; i++) { + const operationData = operations[i]; + if (operationData.operation === 'blur') { + gmInstance = gmInstance!.blur(operationData.blur as number, operationData.sigma as number); + } else if (operationData.operation === 'border') { + gmInstance = gmInstance!.borderColor(operationData.borderColor as string).border(operationData.borderWidth as number, operationData.borderHeight as number); + } else if (operationData.operation === 'composite') { + const positionX = operationData.positionX as number; + const positionY = operationData.positionY as number; - if (item.binary !== undefined) { - // Create a shallow copy of the binary data so that the old - // data references which do not get changed still stay behind - // but the incoming data does not get changed. - Object.assign(newItem.binary, item.binary); - // Make a deep copy of the binary data we change - if (newItem.binary![dataPropertyName as string]) { - newItem.binary![dataPropertyName as string] = JSON.parse(JSON.stringify(newItem.binary![dataPropertyName as string])); - } - } + const geometryString = (positionX >= 0 ? '+' : '') + positionX + (positionY >= 0 ? '+' : '') + positionY; - if (newItem.binary![dataPropertyName as string] === undefined) { - newItem.binary![dataPropertyName as string] = { - data: '', - mimeType: '', - }; - } - - if (options.quality !== undefined) { - gmInstance = gmInstance!.quality(options.quality as number); - } - - if (options.format !== undefined) { - gmInstance = gmInstance!.setFormat(options.format as string); - newItem.binary![dataPropertyName as string].fileExtension = options.format as string; - newItem.binary![dataPropertyName as string].mimeType = `image/${options.format}`; - const fileName = newItem.binary![dataPropertyName as string].fileName; - if (fileName && fileName.includes('.')) { - newItem.binary![dataPropertyName as string].fileName = fileName.split('.').slice(0, -1).join('.') + '.' + options.format; - } - } - - if (options.fileName !== undefined) { - newItem.binary![dataPropertyName as string].fileName = options.fileName as string; - } - - return new Promise((resolve, reject) => { - gmInstance - .toBuffer((error: Error | null, buffer: Buffer) => { - cleanupFunctions.forEach(async cleanup => await cleanup()); - - if (error) { - return reject(error); + if (item.binary![operationData.dataPropertyNameComposite as string] === undefined) { + throw new Error(`Item does not contain any binary data with the name "${operationData.dataPropertyNameComposite}".`); } - newItem.binary![dataPropertyName as string].data = buffer.toString(BINARY_ENCODING); + const { fd, path, cleanup } = await file(); + cleanupFunctions.push(cleanup); + await fsWriteFileAsync(fd, Buffer.from(item.binary![operationData.dataPropertyNameComposite as string].data, BINARY_ENCODING)); - return resolve(newItem); - }); - }); + if (operations[0].operation === 'create') { + // It seems like if the image gets created newly we have to create a new gm instance + // else it fails for some reason + gmInstance = gm(gmInstance!.stream('png')).geometry(geometryString).composite(path); + } else { + gmInstance = gmInstance!.geometry(geometryString).composite(path); + } + + if (operations.length !== i + 1) { + // If there are other operations after the current one create a new gm instance + // because else things do get messed up + gmInstance = gm(gmInstance.stream()); + } + } else if (operationData.operation === 'create') { + gmInstance = gm(operationData.width as number, operationData.height as number, operationData.backgroundColor as string); + if (!options.format) { + options.format = 'png'; + } + } else if (operationData.operation === 'crop') { + gmInstance = gmInstance!.crop(operationData.width as number, operationData.height as number, operationData.positionX as number, operationData.positionY as number); + } else if (operationData.operation === 'draw') { + gmInstance = gmInstance!.fill(operationData.color as string); + + if (operationData.primitive === 'line') { + gmInstance = gmInstance.drawLine(operationData.startPositionX as number, operationData.startPositionY as number, operationData.endPositionX as number, operationData.endPositionY as number); + } else if (operationData.primitive === 'rectangle') { + gmInstance = gmInstance.drawRectangle(operationData.startPositionX as number, operationData.startPositionY as number, operationData.endPositionX as number, operationData.endPositionY as number, operationData.cornerRadius as number || undefined); + } + } else if (operationData.operation === 'resize') { + const resizeOption = operationData.resizeOption as string; + + // By default use "maximumArea" + let option: gm.ResizeOption = '@'; + if (resizeOption === 'ignoreAspectRatio') { + option = '!'; + } else if (resizeOption === 'minimumArea') { + option = '^'; + } else if (resizeOption === 'onlyIfSmaller') { + option = '<'; + } else if (resizeOption === 'onlyIfLarger') { + option = '>'; + } else if (resizeOption === 'percent') { + option = '%'; + } + + gmInstance = gmInstance!.resize(operationData.width as number, operationData.height as number, option); + } else if (operationData.operation === 'rotate') { + gmInstance = gmInstance!.rotate(operationData.backgroundColor as string, operationData.rotate as number); + } else if (operationData.operation === 'shear') { + gmInstance = gmInstance!.shear(operationData.degreesX as number, operationData.degreesY as number); + } else if (operationData.operation === 'text') { + // Split the text in multiple lines + const lines: string[] = []; + let currentLine = ''; + (operationData.text as string).split('\n').forEach((textLine: string) => { + textLine.split(' ').forEach((textPart: string) => { + if ((currentLine.length + textPart.length + 1) > (operationData.lineLength as number)) { + lines.push(currentLine.trim()); + currentLine = `${textPart} `; + return; + } + currentLine += `${textPart} `; + }); + + lines.push(currentLine.trim()); + currentLine = ''; + }); + + // Combine the lines to a single string + const renderText = lines.join('\n'); + + const font = options.font || operationData.font; + + if (font && font !== 'default') { + gmInstance = gmInstance!.font(font as string); + } + + gmInstance = gmInstance! + .fill(operationData.fontColor as string) + .fontSize(operationData.fontSize as number) + .drawText(operationData.positionX as number, operationData.positionY as number, renderText); + } + } + + const newItem: INodeExecutionData = { + json: item.json, + binary: {}, + }; + + if (item.binary !== undefined) { + // Create a shallow copy of the binary data so that the old + // data references which do not get changed still stay behind + // but the incoming data does not get changed. + Object.assign(newItem.binary, item.binary); + // Make a deep copy of the binary data we change + if (newItem.binary![dataPropertyName as string]) { + newItem.binary![dataPropertyName as string] = JSON.parse(JSON.stringify(newItem.binary![dataPropertyName as string])); + } + } + + if (newItem.binary![dataPropertyName as string] === undefined) { + newItem.binary![dataPropertyName as string] = { + data: '', + mimeType: '', + }; + } + + if (options.quality !== undefined) { + gmInstance = gmInstance!.quality(options.quality as number); + } + + if (options.format !== undefined) { + gmInstance = gmInstance!.setFormat(options.format as string); + newItem.binary![dataPropertyName as string].fileExtension = options.format as string; + newItem.binary![dataPropertyName as string].mimeType = `image/${options.format}`; + const fileName = newItem.binary![dataPropertyName as string].fileName; + if (fileName && fileName.includes('.')) { + newItem.binary![dataPropertyName as string].fileName = fileName.split('.').slice(0, -1).join('.') + '.' + options.format; + } + } + + if (options.fileName !== undefined) { + newItem.binary![dataPropertyName as string].fileName = options.fileName as string; + } + + returnData.push(await (new Promise((resolve, reject) => { + gmInstance + .toBuffer((error: Error | null, buffer: Buffer) => { + cleanupFunctions.forEach(async cleanup => await cleanup()); + + if (error) { + return reject(error); + } + + newItem.binary![dataPropertyName as string].data = buffer.toString(BINARY_ENCODING); + + return resolve(newItem); + }); + }))); + + } + return this.prepareOutputData(returnData); } } From ac9b7432330adceb864e6ba92d810f7518f58a37 Mon Sep 17 00:00:00 2001 From: dali Date: Tue, 23 Feb 2021 15:33:43 +0100 Subject: [PATCH 011/137] :bug: Fix typescript issues --- packages/nodes-base/nodes/EditImage.node.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/nodes-base/nodes/EditImage.node.ts b/packages/nodes-base/nodes/EditImage.node.ts index 54589c0f56..6250bf707d 100644 --- a/packages/nodes-base/nodes/EditImage.node.ts +++ b/packages/nodes-base/nodes/EditImage.node.ts @@ -966,6 +966,7 @@ export class EditImage implements INodeType { const cleanupFunctions: Array<() => void> = []; + // @ts-ignore let gmInstance: gm.State; const requiredOperationParameters: { @@ -1134,6 +1135,7 @@ export class EditImage implements INodeType { const resizeOption = operationData.resizeOption as string; // By default use "maximumArea" + // @ts-ignore let option: gm.ResizeOption = '@'; if (resizeOption === 'ignoreAspectRatio') { option = '!'; From 0a0509a4ae86797c134c8b60b5c24409f18e3db4 Mon Sep 17 00:00:00 2001 From: Miquel Colomer Date: Thu, 25 Feb 2021 10:35:48 +0100 Subject: [PATCH 012/137] + added new tools --- .../credentials/UProcApi.credentials.ts | 2 +- .../nodes/UProc/GenericFunctions.ts | 7 +- .../nodes/UProc/GroupDescription.ts | 4 +- .../nodes-base/nodes/UProc/Json/Groups.ts | 68 ++--- packages/nodes-base/nodes/UProc/Json/Tools.ts | 2 +- .../nodes-base/nodes/UProc/ToolDescription.ts | 26 +- packages/nodes-base/nodes/UProc/UProc.node.ts | 232 +++++++++--------- packages/nodes-base/nodes/UProc/uproc.png | Bin 1248 -> 1991 bytes 8 files changed, 173 insertions(+), 168 deletions(-) diff --git a/packages/nodes-base/credentials/UProcApi.credentials.ts b/packages/nodes-base/credentials/UProcApi.credentials.ts index 197e7140de..5428bc4edb 100644 --- a/packages/nodes-base/credentials/UProcApi.credentials.ts +++ b/packages/nodes-base/credentials/UProcApi.credentials.ts @@ -7,7 +7,7 @@ export class UProcApi implements ICredentialType { name = 'uprocApi'; displayName = 'uProc API'; properties = [ - { + { displayName: 'Email', name: 'email', type: 'string' as NodePropertyTypes, diff --git a/packages/nodes-base/nodes/UProc/GenericFunctions.ts b/packages/nodes-base/nodes/UProc/GenericFunctions.ts index ca77d55f98..48629d0675 100644 --- a/packages/nodes-base/nodes/UProc/GenericFunctions.ts +++ b/packages/nodes-base/nodes/UProc/GenericFunctions.ts @@ -20,12 +20,15 @@ export async function uprocApiRequest(this: IHookFunctions | IExecuteFunctions | } const token = Buffer.from(`${credentials.email}:${credentials.apiKey}`).toString('base64'); const options: OptionsWithUri = { - headers: { Authorization: `Basic ${token}` }, + headers: { + Authorization: `Basic ${token}`, + "User-agent": "n8n" + }, method, qs, body, uri: uri || `https://api.uproc.io/api/v2/process`, - json: true, + json: true }; try { diff --git a/packages/nodes-base/nodes/UProc/GroupDescription.ts b/packages/nodes-base/nodes/UProc/GroupDescription.ts index 07d046b703..446ffba631 100644 --- a/packages/nodes-base/nodes/UProc/GroupDescription.ts +++ b/packages/nodes-base/nodes/UProc/GroupDescription.ts @@ -1,6 +1,6 @@ import { - IDataObject, INodeProperties, + IDataObject, } from 'n8n-workflow'; import { @@ -18,7 +18,7 @@ const finalGroups = { const options = []; -for (const group of (groups as IDataObject).groups as IDataObject[]) { +for(const group of (groups as IDataObject).groups as IDataObject[]){ const item = { name: group.translated, value: group.name, diff --git a/packages/nodes-base/nodes/UProc/Json/Groups.ts b/packages/nodes-base/nodes/UProc/Json/Groups.ts index 8f18c4765f..b5da15f0c0 100644 --- a/packages/nodes-base/nodes/UProc/Json/Groups.ts +++ b/packages/nodes-base/nodes/UProc/Json/Groups.ts @@ -1,36 +1,36 @@ export const groups = { - groups: [{ - 'translated': 'Audio', - 'name': 'audio', - }, { - 'translated': 'Communication', - 'name': 'communication', - }, { - 'translated': 'Company', - 'name': 'company', - }, { - 'translated': 'Finance', - 'name': 'finance', - }, { - 'translated': 'Geographical', - 'name': 'geographic', - }, { - 'translated': 'Image', - 'name': 'image', - }, { - 'translated': 'Internet', - 'name': 'internet', - }, { - 'translated': 'Personal', - 'name': 'personal', - }, { - 'translated': 'Product', - 'name': 'product', - }, { - 'translated': 'Security', - 'name': 'security', - }, { - 'translated': 'Text', - 'name': 'text', - }], + groups: [{ + "translated": "Audio", + "name": "audio" + }, { + "translated": "Communication", + "name": "communication" + }, { + "translated": "Company", + "name": "company" + }, { + "translated": "Finance", + "name": "finance" + }, { + "translated": "Geographical", + "name": "geographic" + }, { + "translated": "Image", + "name": "image" + }, { + "translated": "Internet", + "name": "internet" + }, { + "translated": "Personal", + "name": "personal" + }, { + "translated": "Product", + "name": "product" + }, { + "translated": "Security", + "name": "security" + }, { + "translated": "Text", + "name": "text" + }] }; \ No newline at end of file diff --git a/packages/nodes-base/nodes/UProc/Json/Tools.ts b/packages/nodes-base/nodes/UProc/Json/Tools.ts index 738bfcedd3..f3309ffb84 100644 --- a/packages/nodes-base/nodes/UProc/Json/Tools.ts +++ b/packages/nodes-base/nodes/UProc/Json/Tools.ts @@ -1 +1 @@ -export const tools = {processors: [{'k':'checkCreditcardChecksum','d':'Check Card Number Has Valid Format','ed':'Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getCreditcardType','d':'Get Credit Card Type By Number','ed':'Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getAddressBySearch','d':'Get Exact Address By Search','ed':'Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona, España'}]},{'k':'getCoordinateBySearch','d':'Get Coordinates By Search','ed':'Discover latitude and longitude coordinates of a postal address','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona, España'}]},{'k':'checkAddressExist','d':'Check Exact Address Exists','ed':'Check if an exact address exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressNormalized','d':'Get Normalized Address','ed':'Allow to normalize an address, removing non allowed characters','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona Spain'}]},{'k':'checkAddressNumberExist','d':'Check Street Number Exists','ed':'Check if a house number exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressSplitted','d':'Get Parsed Address','ed':'Parse postal address into separated fields, getting a basic resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'getAddressSplittedBest','d':'Get Improved Parsed Address','ed':'Parse postal address into separated fields, getting an improved resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'checkCoordinateValid','d':'Check Valid Coordinates','ed':'Check if coordinates have a valid format','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'checkAgeBetw','d':'Check Age Between','ed':'Check if age is between two numbers','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years1','r':true,'t':'number','p':'35'},{'n':'years2','r':true,'t':'number','p':'50'}]},{'k':'getAgeByDate','d':'Get Age By Date','ed':'Discover the age of a birth date (multiple formats allowed)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeEq','d':'Check Ages Are Equal','ed':'Check if ages are equal','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'45'}]},{'k':'checkAgeGe','d':'Check Age Is Greater Or Equal','ed':'Check if age is greater or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'43'}]},{'k':'checkAgeGt','d':'Check Age Is Greater','ed':'Check if age is greater than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'40'}]},{'k':'checkAgeIsAdult','d':'Check Age Is Greater Than Or Equal To 18 Years','ed':'Check if birth date belongs to an adult: 18 years old (Spain)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1950-05-20'}]},{'k':'checkAgeIsForties','d':'Check Age Is Between 40 And 49 Years','ed':'Check if date returns an age between 40 and 49 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeIsRetired','d':'Check Age Is Greater Than 64 Years','ed':'Check if birth date returns an age greater than 64 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1954-05-20'}]},{'k':'checkAgeIsTwenties','d':'Check Age Is Between 20 And 29 Years','ed':'Check if date returns an age between 20 and 29 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'2000-05-20'}]},{'k':'checkAgeLe','d':'Check Age Is Lower Or Equal','ed':'Check if age is lower or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'checkAgeLt','d':'Check Age Is Lower','ed':'Chekc if age is lower than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'getAgeRange','d':'Get Age Range By Date','ed':'Discover the age range of a person by birth date','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAsinExist','d':'Check ASIN Exists','ed':'Check if a ASIN code exists on Amazon marketplace','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkAsinValid','d':'Check ASIN Valid','ed':'Check if a ASIN code has a valid format','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'getAudioAdvancedSpeechByText','d':'Get Advanced Speech By Text','ed':'Get advanced human audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'Arabic','value':'arabic'},{'name':'Bengali','value':'bengali'},{'name':'British','value':'british'},{'name':'Czech','value':'czech'},{'name':'Danish','value':'danish'},{'name':'Dutch','value':'dutch'},{'name':'Filipino','value':'filipino'},{'name':'Finnish','value':'finnish'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Greek','value':'greek'},{'name':'Gujurati','value':'gujurati'},{'name':'Hindi','value':'hindi'},{'name':'Hungarian','value':'hungarian'},{'name':'Indonesian','value':'indonesian'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Kannada','value':'kannada'},{'name':'Korean','value':'korean'},{'name':'Malayalam','value':'malayalam'},{'name':'Mandarin','value':'mandarin'},{'name':'Norwegian','value':'norwegian'},{'name':'Polish','value':'polish'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Slovak','value':'slovak'},{'name':'Spanish','value':'spanish'},{'name':'Tamil','value':'tamil'},{'name':'Telugu','value':'telugu'},{'name':'Thai','value':'thai'},{'name':'Turkish','value':'turkish'},{'name':'Ukranian','value':'ukranian'},{'name':'Vietnamese','value':'vietnamese'}]}]},{'k':'getAudioSpeechByText','d':'Get Speech By Text','ed':'Get audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Spanish','value':'spanish'}]}]},{'k':'checkBankAccountValidEs','d':'Check Bank Account Is Valid (ES)','ed':'Discover if account number has a valid format','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'}]},{'k':'checkBankBicValid','d':'Check BIC Is Valid','ed':'Discover if BIC number has a valid format','g':'finance','p':[{'n':'bic','r':true,'t':'string','p':'DABAIE2D'}]},{'k':'getBankIbanByAccount','d':'Get IBAN By Account','ed':'Get IBAN number by account number of the country','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'},{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getBankIbanLookup','d':'Get IBAN Lookup','ed':'Get to search data bank information by IBAN account number','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'NL91ABNA0417164300'}]},{'k':'checkBankIbanValid','d':'Check IBAN Is Valid','ed':'Discover if IBAN account number has a valid format','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'ES3314650120311716144388'}]},{'k':'getBarcodeEncoded','d':'Get Encoded Barcode','ed':'Get an encoded barcode by number and required standard','g':'image','p':[{'n':'text','r':true,'t':'string','p':'0635753490879'},{'n':'bcid','r':true,'t':'options','p':'ean13','o':[{'name':'Auspost','value':'auspost'},{'name':'Azteccode','value':'azteccode'},{'name':'Azteccodecompact','value':'azteccodecompact'},{'name':'Aztecrune','value':'aztecrune'},{'name':'Bc412','value':'bc412'},{'name':'Channelcode','value':'channelcode'},{'name':'Codablockf','value':'codablockf'},{'name':'Code11','value':'code11'},{'name':'Code128','value':'code128'},{'name':'Code16k','value':'code16k'},{'name':'Code2of5','value':'code2of5'},{'name':'Code32','value':'code32'},{'name':'Code39','value':'code39'},{'name':'Code39ext','value':'code39ext'},{'name':'Code49','value':'code49'},{'name':'Code93','value':'code93'},{'name':'Code93ext','value':'code93ext'},{'name':'Codeone','value':'codeone'},{'name':'Coop2of5','value':'coop2of5'},{'name':'Daft','value':'daft'},{'name':'Databarexpanded','value':'databarexpanded'},{'name':'Databarexpandedcomposite','value':'databarexpandedcomposite'},{'name':'Databarexpandedstacked','value':'databarexpandedstacked'},{'name':'Databarexpandedstackedcomposite','value':'databarexpandedstackedcomposite'},{'name':'Databarlimited','value':'databarlimited'},{'name':'Databarlimitedcomposite','value':'databarlimitedcomposite'},{'name':'Databaromni','value':'databaromni'},{'name':'Databaromnicomposite','value':'databaromnicomposite'},{'name':'Databarstacked','value':'databarstacked'},{'name':'Databarstackedcomposite','value':'databarstackedcomposite'},{'name':'Databarstackedomni','value':'databarstackedomni'},{'name':'Databarstackedomnicomposite','value':'databarstackedomnicomposite'},{'name':'Databartruncated','value':'databartruncated'},{'name':'Databartruncatedcomposite','value':'databartruncatedcomposite'},{'name':'Datalogic2of5','value':'datalogic2of5'},{'name':'Datamatrix','value':'datamatrix'},{'name':'Datamatrixrectangular','value':'datamatrixrectangular'},{'name':'Dotcode','value':'dotcode'},{'name':'Ean13','value':'ean13'},{'name':'Ean13composite','value':'ean13composite'},{'name':'Ean14','value':'ean14'},{'name':'Ean2','value':'ean2'},{'name':'Ean5','value':'ean5'},{'name':'Ean8','value':'ean8'},{'name':'Ean8composite','value':'ean8composite'},{'name':'Flattermarken','value':'flattermarken'},{'name':'Gs1-128','value':'gs1-128'},{'name':'Gs1-128composite','value':'gs1-128composite'},{'name':'Gs1-cc','value':'gs1-cc'},{'name':'Gs1datamatrix','value':'gs1datamatrix'},{'name':'Gs1datamatrixrectangular','value':'gs1datamatrixrectangular'},{'name':'Gs1northamericancoupon','value':'gs1northamericancoupon'},{'name':'Hanxin','value':'hanxin'},{'name':'Hibcazteccode','value':'hibcazteccode'},{'name':'Hibccodablockf','value':'hibccodablockf'},{'name':'Hibccode128','value':'hibccode128'},{'name':'Hibccode39','value':'hibccode39'},{'name':'Hibcdatamatrix','value':'hibcdatamatrix'},{'name':'Hibcdatamatrixrectangular','value':'hibcdatamatrixrectangular'},{'name':'Hibcmicropdf417','value':'hibcmicropdf417'},{'name':'Hibcpdf417','value':'hibcpdf417'},{'name':'Iata2of5','value':'iata2of5'},{'name':'Identcode','value':'identcode'},{'name':'Industrial2of5','value':'industrial2of5'},{'name':'Interleaved2of5','value':'interleaved2of5'},{'name':'Isbn','value':'isbn'},{'name':'Ismn','value':'ismn'},{'name':'Issn','value':'issn'},{'name':'Itf14','value':'itf14'},{'name':'Japanpost','value':'japanpost'},{'name':'Kix','value':'kix'},{'name':'Leitcode','value':'leitcode'},{'name':'Matrix2of5','value':'matrix2of5'},{'name':'Maxicode','value':'maxicode'},{'name':'Micropdf417','value':'micropdf417'},{'name':'Msi','value':'msi'},{'name':'Onecode','value':'onecode'},{'name':'Pdf417','value':'pdf417'},{'name':'Pdf417compact','value':'pdf417compact'},{'name':'Pharmacode','value':'pharmacode'},{'name':'Pharmacode2','value':'pharmacode2'},{'name':'Planet','value':'planet'},{'name':'Plessey','value':'plessey'},{'name':'Posicode','value':'posicode'},{'name':'Postnet','value':'postnet'},{'name':'Pzn','value':'pzn'},{'name':'RationalizedCodabar','value':'rationalizedCodabar'},{'name':'Raw','value':'raw'},{'name':'Royalmail','value':'royalmail'},{'name':'Sscc18','value':'sscc18'},{'name':'Symbol','value':'symbol'},{'name':'Telepen','value':'telepen'},{'name':'Telepennumeric','value':'telepennumeric'},{'name':'Ultracode','value':'ultracode'},{'name':'Upca','value':'upca'},{'name':'Upcacomposite','value':'upcacomposite'},{'name':'Upce','value':'upce'},{'name':'Upcecomposite','value':'upcecomposite'}]}]},{'k':'getBookAuthorLookup','d':'Get Book By Author','ed':'Get book by author\'s surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookCategoryLookup','d':'Get Book By Category','ed':'Get all publications by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'checkBookIsbn','d':'Check ISBN Code Is Valid','ed':'Allow to check if an ISBN10/13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbnExist','d':'Check ISBN Code Exists','ed':'Allow to check if an ISBN book exist','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookIsbnLookup','d':'Get Book By ISBN','ed':'Get book or publication data by 10 or 13 digits ISBN code','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'checkBookIsbn10','d':'Check ISBN10 Code Is Valid','ed':'Allow to check if an ISBN10 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbn13','d':'Check ISBN13 Code Is Valid','ed':'Allow to check if an ISBN13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookListAuthorLookup','d':'Get Books By Author','ed':'Get books by author\'s surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookListCategoryLookup','d':'Get Books By Category','ed':'Get all books by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'getBookListPublisherLookup','d':'Get Books By Editor','ed':'Get all books by editor','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookListTitleLookup','d':'Get Books By Title','ed':'Get all books by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'Science'}]},{'k':'getBookPublisherLookup','d':'Get Book By Editor','ed':'Get book data by editor\'s name','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookTitleLookup','d':'Get Book By Title','ed':'Get book data by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'La empresa más feliz del mundo'}]},{'k':'getNifByDni','d':'Get NIF By DNI (ES)','ed':'Discover the letter of a dni card number','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'getCifNormalized','d':'Get Normalized CIF','ed':'Allow to normalize a CIF number, removing non allowed characters','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B 62084 959'}]},{'k':'getDniNormalized','d':'Get Normalized DNI (ES)','ed':'Allow to normalize a DNI number, removing non allowed characters','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016a116'}]},{'k':'getNieNormalized','d':'Get Normalized NIE (ES)','ed':'Allow to normalize a NIE number, removing non allowed characters','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'X402001 122g'}]},{'k':'getNifNormalized','d':'Get Normalized NIF (ES)','ed':'Allow to normalize a NIF number, removing non allowed characters','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'402001 122g'}]},{'k':'checkCifValid','d':'Check CIF Is Valid (ES)','ed':'Discover if a cif card number is valid','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'A58818501'}]},{'k':'checkDniValid','d':'Check Valid Dni (ES)','ed':'Discover if a dni card number is valid','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'checkNieValid','d':'Check NIE Is Valid (ES)','ed':'Discover if a NIE card number is valid','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'Y2918527W'}]},{'k':'checkNifValid','d':'Check NIF Is Valid (ES)','ed':'Discover if a nif card number is valid','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'44016116G'}]},{'k':'getCityByIp','d':'Get City By IP','ed':'Get city from ip','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCityByName','d':'Get City By Name (ES)','ed':'City search by partial name (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Bar'}]},{'k':'getCityByPhone','d':'Get City By Phone (ES)','ed':'Discover the city name by the local phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getCityByZipcode','d':'Get City By Zipcode (ES)','ed':'Discover the city name by the zipcode (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCityListByName','d':'Get Cities By Prefix (ES)','ed':'Get multiple cities by partial initial text (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barce'}]},{'k':'getCityListByPhone','d':'Get Cities By Phone (ES)','ed':'Get multiple cities by phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'938499145'}]},{'k':'getCityListByZipcode','d':'Get Cities By Zipcode (ES)','ed':'Get multiple cities by zipcode prefix (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'234'}]},{'k':'getCityNormalized','d':'Get Normalized City','ed':'Allow to normalize a city, removing non allowed characters','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barc3l0na'}]},{'k':'checkEan13Valid','d':'Check EAN13 Is Valid','ed':'Check if a EAN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkGtin13Valid','d':'Check GTIN13 Is Valid','ed':'Check if a GTIN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkEan14Valid','d':'Check EAN14 Is Valid','ed':'Check if a EAN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkGtin14Valid','d':'Check GTIN14 Is Valid','ed':'Check if a GTIN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkEan18Valid','d':'Check EAN18 Is Valid','ed':'Check if a EAN barcode of 18 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'000004006381333931'}]},{'k':'checkEan8Valid','d':'Check EAN8 Is Valid','ed':'Check if a EAN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtin8Valid','d':'Check GTIN8 Is Valid','ed':'Check if a GTIN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkEanExist','d':'Check EAN Exists','ed':'Check if a EAN code exists on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkUpcExist','d':'Check UPC Exists','ed':'Check if a UPC code exists','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkUpcFormat','d':'Check UPC Has Valid Format','ed':'Check if a UPC code has a valid format','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberIsin','d':'Check ISIN Code Is Valid','ed':'Check if ISIN number is valid','g':'company','p':[{'n':'isin','r':true,'t':'string','p':'US0378331005'}]},{'k':'getUpcLookup','d':'Get Product By UPC','ed':'Get product data of an UPC code on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberSsEs','d':'Check Social Security Number Is Valid (ES)','ed':'Check if SS number is valid, only for Spain','g':'company','p':[{'n':'number','r':true,'t':'string','p':'998239812282'}]},{'k':'checkNumberUuid','d':'Check UUID Number Is Valid','ed':'Check if it a valid UUID number','g':'security','p':[{'n':'uuid','r':true,'t':'string','p':'550e8400-e29b-41d4-a716-446655440000'}]},{'k':'checkEanValid','d':'Check EAN Is Valid','ed':'Check if a EAN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtinValid','d':'Check GTIN Is Valid','ed':'Check if a GTIN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getCommunityByZipcode','d':'Get Community By Zipcode (ES)','ed':'Discover the community name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCompanyByCif','d':'Get Company By CIF (ES)','ed':'Get company data by CIF','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B66998592'}]},{'k':'getCompanyByDomain','d':'Get Company By Domain','ed':'Get company data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyByDuns','d':'Get Company By DUNS (ES)','ed':'Get company data by DUNS','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'464016690'}]},{'k':'getCompanyByEmail','d':'Get Company By Email','ed':'Get company data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getCompanyByIp','d':'Get Company By IP','ed':'Get company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'getCompanyByName','d':'Get Company By Name','ed':'Get company data by name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'},{'n':'country','r':false,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D\'ivoire','value':'Cote D\'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People\'s Republic Of','value':'Korea, Democratic People\'s Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People\'s Democratic Republic','value':'Lao People\'s Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]}]},{'k':'getCompanyByPhone','d':'Get Company By Phone','ed':'Get company data by phone number','g':'company','p':[{'n':'phone','r':true,'t':'string','p':'34933197570'}]},{'k':'getCompanyByProfile','d':'Get Company By Social Profile','ed':'Get company data by social network uri (LinkedIn, Twitter, ...)','g':'company','p':[{'n':'url','r':true,'t':'string','p':'https://twitter.com/Cloudflare'}]},{'k':'getPersonByProfile','d':'Get Person By Social Profile','ed':'Get personal data by social network profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getRoleClassified','d':'Get Classified Role','ed':'Identify and classify a prospect role detecting the right area and seniority to filter later','g':'company','p':[{'n':'role','r':true,'t':'string','p':'Project Manager'}]},{'k':'checkCompanyDebtorByTaxid','d':'Check Company Is Debtor By TaxId (ES)','ed':'Check if company is debtor by TaxId','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B04363115'}]},{'k':'getPersonDecisionMaker','d':'Get Decision Maker','ed':'Get professional data of a decision maker by company name/domain and area','g':'company','p':[{'n':'company','r':true,'t':'string','p':'uproc.io'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getPersonDecisionMakerBySearch','d':'Get Decision Maker By Search Engine','ed':'Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyDomainByName','d':'Get Domain By Company Name','ed':'Get company domain by company name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonEmailsByDomainAndArea','d':'Get Decision Maker\'s Emails By Domain And Area','ed':'Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'oracle.com'},{'n':'area','r':true,'t':'options','p':'Marketing','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getCompanyExtendedByDomain','d':'Get Company (Extended) By Domain','ed':'Get company contact, social and technology data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyExtendedByEmail','d':'Get Company (Extended) By Email','ed':'Get company contact, social and technology data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getPersonExtendedByProfile','d':'Get Person (Extended) By Profile','ed':'Get personal and social data by social profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getProfileFacebookByCompany','d':'Get Facebook URI By Company','ed':'Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getCompanyFinancialByDomain','d':'Get Sales Data By Company\'s Domain','ed':'Get company sales data by company\'s domain name.

Next countries are supported: Spain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyFinancialByDuns','d':'Get Sales Data By Company\'s DUNS','ed':'Get company sales data by company\'s DUNS number.

Next countries are supported: Spain','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'461809423'}]},{'k':'getCompanyFinancialByName','d':'Get Sales Data By Company\'s Name','ed':'Get company sales data by company\'s name.

Next countries are supported: Spain','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getCompanyFinancialByTaxid','d':'Get Sales Data By Company\'s Taxid','ed':'Get company sales data by company\'s taxid (CIF).

Next countries are supported: Spain','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B62084959'}]},{'k':'getCompanyGeocodedByIp','d':'Get Geocoded Company By IP','ed':'Get geocoded company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'sendLinkedinInvitation','d':'Send Connection Request To Linkedin Profile','ed':'Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network! Thanks'}]},{'k':'sendLinkedinInvitationOrMessage','d':'Send Invitation Or Message To Linkedin Profile','ed':'Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message1','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'},{'n':'message2','r':true,'t':'string','p':'Hi {{first}}, thank you for accepting my invitation!'}]},{'k':'getProfileLinkedinByCompany','d':'Get LinkedIn URI By Company','ed':'Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonListByParams','d':'Get Employees By Parameters','ed':'Get employees by company name or domain, area, seniority and country','g':'company','p':[{'n':'country','r':true,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D\'ivoire','value':'Cote D\'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People\'s Republic Of','value':'Korea, Democratic People\'s Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People\'s Democratic Republic','value':'Lao People\'s Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]},{'n':'company','r':false,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'seniority','r':false,'t':'options','p':'','o':[{'name':'Apprentice','value':'Apprentice'},{'name':'Director','value':'Director'},{'name':'Executive','value':'Executive'},{'name':'Intermediate','value':'Intermediate'},{'name':'Manager','value':'Manager'}]},{'n':'email','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'phone','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]}]},{'k':'sendLinkedinMessage','d':'Send Message To Linkedin Profile','ed':'Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'}]},{'k':'getPersonMultipleDecisionMakerBySearch','d':'Get Decision Makers By Search Engine','ed':'Discover up to ten decision makers using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyNameByDomain','d':'Get Company\'s Name By Domain','ed':'Get company name by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyPhoneByDomain','d':'Get Phone By Company Domain','ed':'Get company phone by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getProfileTwitterByCompany','d':'Get Twitter URI By Company','ed':'Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getDistanceByAddresses','d':'Get Distance Between Addresses','ed':'Returns straight-line distance in kilometers between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'}]},{'k':'getRouteByAddresses','d':'Get Route Between Addresses','ed':'Returns driving routing time, distance, fuel consumption and cost between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByCoordinates','d':'Get Distance Between Coordinates','ed':'Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getRouteByCoordinates','d':'Get Route Between Coordinates','ed':'Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getCoordinateByIp','d':'Get Coordinates By IP','ed':'Discover latitude and longitude coordinates of an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getDistanceByIps','d':'Get Distance Between IPs','ed':'Returns straight-line distance in kilometers between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'}]},{'k':'getRouteByIps','d':'Get Route Between IPs','ed':'Returns driving routing time, distance, fuel consumption and cost between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByPhones','d':'Get Distance Between Phones','ed':'Returns straight-line distance in kilometers between two landline phones, using city and province of every phone','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getRouteByPhones','d':'Get Route Between Phones','ed':'Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getDistanceByZipcodes','d':'Get Distance Between Zipcodes','ed':'Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getRouteByZipcodes','d':'Get Route Between Zipcodes','ed':'Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getCoordinateCartesian','d':'Get Cartesian Coordinates','ed':'Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateDecimal','d':'Get Decimal Coordinates','ed':'Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'checkDistanceEq','d':'Check Distance Is Equal','ed':'Discover if the distance between two coordinates is equal to another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33.44'}]},{'k':'checkDistanceGe','d':'Check Distance Is Greater Or Equal','ed':'Discover if the distance in quilometers between two coordinates is greater or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33'}]},{'k':'checkDistanceGt','d':'Check Distance Is Greater','ed':'Discover if the distance in quilometers between two coordinates is greater than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'30'}]},{'k':'checkDistanceLe','d':'Check Distance Is Lower Or Equal','ed':'Discover if the distance in quilometers between two coordinates is lower or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'34'}]},{'k':'checkDistanceLt','d':'Check Distance Is Lower','ed':'Discover if the distance in quilometers between two coordinates is lower than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'50'}]},{'k':'getCoordinateUsng','d':'Get USNG Coordinates','ed':'Get USNG coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateUtm','d':'Get UTM Coordinates','ed':'Get UTM coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCountryByCode','d':'Get Country By ISO Code','ed':'Get country name by its ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryByCurrencyCode','d':'Get Country By Currency','ed':'Get country name by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryByIp','d':'Get Country By IP','ed':'Get country name by IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCountryByName','d':'Get Country By Name','ed':'Get country by prefix','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa'}]},{'k':'getCountryByPhone','d':'Get Country By Phone','ed':'Get country name by phone number, with worldwide coverage','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getCountryCodeByName','d':'Get Country Code By Name','ed':'Get Alpha2 code by country prefix or name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCountryListByCode','d':'Get Countries By ISO Code','ed':'Get multiple countries by ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryListByCurrencyCode','d':'Get Countries By Currency','ed':'Get multiple country names by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryListByName','d':'Get Countries By Prefix','ed':'Get multiple country names by initial name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'S'}]},{'k':'getCountryNormalized','d':'Get Normalized Country','ed':'Allow to normalize a country, removing non allowed characters','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa1n'}]},{'k':'checkCountryValidIso','d':'Check Country Code Exists','ed':'Check if country ISO code exists','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByCountry','d':'Get Currency Code By Country Name','ed':'Get ISO currency code by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyByCountryIsocode','d':'Get Currency Code By Country Code','ed':'Get ISO currency code by an ISO country code','g':'finance','p':[{'n':'country_code','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByIp','d':'Get Currency By IP','ed':'Get ISO currency code by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyByIsocode','d':'Get Currency By ISO Currency Code','ed':'Get an ISO currency code by a currency ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCurrencyConvertedBetweenIsocodeDate','d':'Get Conversion By Currencies And Date','ed':'Convert amount between supported currencies and an exchange date','g':'finance','p':[{'n':'amount','r':true,'t':'string','p':'10'},{'n':'isocode1','r':true,'t':'options','p':'EUR','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'isocode2','r':true,'t':'options','p':'USD','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'date','r':false,'t':'string','p':'2018-02-12'}]},{'k':'getCurrencyListByCountry','d':'Get Currencies By Country','ed':'Get multiple ISO currency codes by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyListByIp','d':'Get Currencies By IP','ed':'Get all ISO currency codes by an IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyListByIsocode','d':'Get Currencies By ISO Code','ed':'Get multiple ISO currency codes by a country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkCurrencyValidIso','d':'Check ISO Currency Code Is Valid','ed':'Discover if an ISO currency code is valid','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkDateBetw','d':'Check Date Is Between Dates','ed':'Discover if a date (date1) is betwen two dates (date2, date3)','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':true,'t':'string','p':'1975-05-19'},{'n':'date3','r':true,'t':'string','p':'1975-05-22'}]},{'k':'getDateDifference','d':'Get Difference Between Dates','ed':'Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'2018-10-10 00:00:00'},{'n':'date2','r':true,'t':'string','p':'2018-10-11 00:00:00'},{'n':'period','r':true,'t':'options','p':'seconds','o':[{'name':'Days','value':'days'},{'name':'Hours','value':'hours'},{'name':'Minutes','value':'minutes'},{'name':'Seconds','value':'seconds'}]}]},{'k':'checkDateEq','d':'Check Dates Are Equal','ed':'Discover if two dates are equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateGe','d':'Check Date Is Greater Or Equal','ed':'Discover if a date is greater or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateGt','d':'Check Date Is Greater','ed':'Discover if a date is greater','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateLe','d':'Check Date Is Lower Or Equal','ed':'Discover if a date is lower or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-19'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateLeap','d':'Check Date Is Leap Year','ed':'Discover if a date belongs to a leap year','g':'personal','p':[{'n':'date','r':false,'t':'string','p':'2008-05-20'}]},{'k':'checkDateLt','d':'Check Date Is Lower','ed':'Discover if a date is lower','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'getDateNormalized','d':'Get Normalized Date','ed':'Allow to normalize a date, removing non allowed characters','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20 /01/2018'}]},{'k':'getDateParsed','d':'Get Parsed Datetime','ed':'Parse datetime, without format dependency, into multiple fields','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20/01/2018'}]},{'k':'checkDateValid','d':'Check Date Is Valid','ed':'Discover if a date has a valid format','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getDeviceByUa','d':'Get Device By User Agent','ed':'Discover device features by user agent','g':'internet','p':[{'n':'useragent','r':true,'t':'string','p':'AppleTV5,3/9.1.1'}]},{'k':'getDomainBlacklists','d':'Get Domain Blacklists','ed':'Get all blacklists where a domain appears','g':'security','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getUrlByDomain','d':'Get Default URL By Domain','ed':'Get valid, existing and default URL when accessing a domain using a web browser.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getDomainByIp','d':'Get Domain By IP','ed':'Get the network name of and IP address','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainByUrl','d':'Get Root Domain By Web Address','ed':'Get root domain of any web address, removing non needed characters.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io'}]},{'k':'checkDomainCatchall','d':'Check Email Domain Is Catchall','ed':'Check if domain accepts all emails, existing or not','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'abinitio.es'}]},{'k':'checkDomainCertificate','d':'Check Domain Has Valid Certificate','ed':'Check if domain has a valid SSL certificate','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'uproc.io'}]},{'k':'getDomainCertificate','d':'Get Certificate By Domain','ed':'Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainDisposable','d':'Check Email Domain Is Temporary','ed':'Check if domain is temporary or not','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'cowstore.org'}]},{'k':'checkDomainExist','d':'Check Domain Exists','ed':'Check if domain exists','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'}]},{'k':'checkDomainFormat','d':'Check Domain Has Valid Format','ed':'Check if domain has a valid format','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainFree','d':'Check Email Domain Is Free','ed':'Check if domain is a free service domain provider','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainIsp','d':'Get ISP By Domain','ed':'Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainLogo','d':'Get Logo By Domain','ed':'Discover logo (favicon) used in domain','g':'image','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainMx','d':'Check Domain Has MX Record','ed':'Check if domain has a MX record','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getUrlPdf','d':'Get Pdf By URL','ed':'Generate a PDF file by URL provided using Chrome browser','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'checkDomainRecord','d':'Check Domain Has DNS Record','ed':'Check if domain has a record of that type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecord','d':'Get Domain Record By DNS Type','ed':'Get the domain record by its type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecords','d':'Get Domain DNS Records','ed':'Get all domain dns records','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainReverse','d':'Check Domain Has IP','ed':'Check if domain has assigned the IP address defined','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'mail.nova.es'},{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainReverseIp','d':'Get IP By Domain','ed':'Get the IPv4 address linked with a domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'www.gmail.com'}]},{'k':'getUrlScreenshot','d':'Get Screenshot By URL','ed':'Generate a screenshot by URL provided using Chrome browser','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'width','r':false,'t':'options','p':'640','o':[{'name':'1024','value':'1024'},{'name':'160','value':'160'},{'name':'320','value':'320'},{'name':'640','value':'640'},{'name':'800','value':'800'}]},{'n':'fullpage','r':false,'t':'options','p':'no','o':[{'name':'No','value':'no'},{'name':'Yes','value':'yes'}]}]},{'k':'getUrlShareableLinks','d':'Get Shareable Links','ed':'Generates shareable URIs to use on social networks and email using a content URI and a text.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'},{'n':'text','r':true,'t':'string','p':'This is an amazing title for my content'}]},{'k':'getDomainTechnologies','d':'Get Technologies By Domain','ed':'Discover client and server technologies used in domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getUrlTechnologies','d':'Get Technologies By URL','ed':'Discover client and server technologies used in web page','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'}]},{'k':'getDomainVisits','d':'Get Visits By Domain','ed':'Get Website visits and rank of any domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainWhois','d':'Get Whois By Domain','ed':'Get the domain whois data by fields','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getIpWhois','d':'Get Whois By IP Address','ed':'Get whois data fields by IP address provided.','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'140.82.118.4'}]},{'k':'sendEmailCustom','d':'Send Custom Email','ed':'Send a custom email (HTML supported) to a recipient','g':'communication','p':[{'n':'email_from','r':true,'t':'string','p':'mcolomer@killia.com'},{'n':'email_to','r':true,'t':'string','p':'mcolomer@gmail.com'},{'n':'subject','r':true,'t':'string','p':'Welcome email'},{'n':'body','r':true,'t':'string','p':'Hi!

Welcome to uProc and start improving your business processes!'}]},{'k':'checkEmailDisposable','d':'Check Email Is Disposable Domain','ed':'Check if email domain belongs to a disposable email service','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@jetable.com'}]},{'k':'getEmailDomain','d':'Get Domain By Email','ed':'Allow to get domain from an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExists','d':'Check Email Exists (Simple)','ed':'Discover if the email recipient exists, returning email status','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExistsExtended','d':'Check Email Exists (Extended)','ed':'Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getEmailFirstReferences','d':'Get First Web References Of An Email','ed':'Get three first web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'getEmailFix','d':'Get Fixed Domain Email','ed':'Allows you to fix the email domain of those misspelled emails (supports all domains)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmil.com'}]},{'k':'checkEmailFormat','d':'Check Email Has Valid Format','ed':'Check if email has a valid format','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@test.com'}]},{'k':'checkEmailFree','d':'Check Email Is Free','ed':'Check if email belongs to free service provider, like gmail, hotmail, ...','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@gmail.com'}]},{'k':'getEmailGdprListByDomain','d':'Get GDPR Emails By Domain','ed':'Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getEmailListByDomain','d':'Get Emails By Domain','ed':'Get emails list found on internet by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListByEmail','d':'Get Emails By Email','ed':'Get emails list found on internet by non-free email (similar to hunter.io)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListInSite','d':'Get Emails In Website','ed':'Get emails list found inside website by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uoc.edu'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailNormalized','d':'Get Normalized Email','ed':'Allow to normalize email address, removing non allowed characters','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test @gmail.com'}]},{'k':'getEmailRecipient','d':'Get Email By Name, Surname And Domain','ed':'Discover an email by company website or domain and prospect\'s firstname and lastname.

If \'verify\' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':false,'t':'string','p':'Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientGdpr','d':'Get Public Email By Name, Surname And Domain (GDPR)','ed':'Discover an email by company website or domain and prospect\'s firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'hello'},{'n':'lastname','r':false,'t':'string','p':''}]},{'k':'getEmailReferences','d':'Get Web References Of An Email','ed':'Get web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'checkEmailRole','d':'Check Email Is Role Based','ed':'Check if email belongs to a system or role based account','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmail.com'}]},{'k':'sendMobileSms','d':'Send Custom Sms','ed':'Send a custom sms to a recipient with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'text','r':true,'t':'string','p':'Thanks for your participation!'}]},{'k':'checkEmailSmtp','d':'Check Email Has SMTP Server','ed':'Check if email domain has an SMTP server to receive emails','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailSpamtrap','d':'Check Email Is Spam Trap','ed':'Check if email is a spam trap','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'zzzwuzhdgvrxy@yahoo.co.jp'}]},{'k':'getEmailType','d':'Get Email Type','ed':'Checks if email is personal (miquel@uproc.io) or generic (hello@uproc.io).','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getFileCopiedBetweenUrls','d':'Get File Copied Between URLs','ed':'Copy file from one URL to another URL','g':'internet','p':[{'n':'source','r':true,'t':'string','p':'http://www.pdf995.com/samples/pdf.pdf'},{'n':'destination','r':true,'t':'string','p':'s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf'}]},{'k':'getFullnameParsed','d':'Get Parsed Fullname','ed':'Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender','g':'personal','p':[{'n':'fullname','r':true,'t':'string','p':'Colomer Salas Miquel'}]},{'k':'getGenderByEmail','d':'Get Gender By Email','ed':'Discover the gender of a person by the email, if person name is included in email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel.colomer@gmail.com'}]},{'k':'getGenderByPersonalName','d':'Get Gender By Name','ed':'Discover the gender of a person or company by name','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marc'}]},{'k':'checkGenderValid','d':'Check Gender Is Valid','ed':'Discover if a gender value is valid (multilanguage)','g':'personal','p':[{'n':'gender','r':true,'t':'string','p':'male'}]},{'k':'getImageExif','d':'Get EXIF Metadata From Image','ed':'It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg'}]},{'k':'getImageWithText','d':'Get Image With Text','ed':'Generate a new image by URL and text','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg'},{'n':'text','r':true,'t':'string','p':'Hi Miquel!'},{'n':'size','r':false,'t':'string','p':'80'}]},{'k':'getQrDecoded','d':'Get Decoded QR Code','ed':'Get QR Code decoded content by an image URL','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png'}]},{'k':'getQrEncoded','d':'Get Encoded QR Code','ed':'Get QR Code encoded by a text','g':'image','p':[{'n':'text','r':true,'t':'string','p':'Sample text to encode'}]},{'k':'getIpBlacklists','d':'Get Ip Blacklists','ed':'Get all blacklists where an IP address appears','g':'security','p':[{'n':'ip','r':true,'t':'string','p':'172.217.168.165'}]},{'k':'getLinkedinConnections','d':'Get LinkedIn Last Received Connections','ed':'Extract last 80 connections from your LinkedIn profile','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-connections'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinGroupMembers','d':'Get LinkedIn Group Members','ed':'Get members in a LinkedIn group','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/groups/59923/members/'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinInvitations','d':'Get LinkedIn Last Sent Invitations','ed':'Extract last 80 invitations sent from your LinkedIn','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-invitations'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinPostComments','d':'Get LinkedIn Post Comments','ed':'Get users who comment a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinPostLikes','d':'Get LinkedIn Post Likes','ed':'Get users who like a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinProfile','d':'Get LinkedIn Profile','ed':'Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'},{'name':'Slow','value':'slow'}]}]},{'k':'checkLinkedinProfileIsContact','d':'Check LinkedIn Profile Is Contact','ed':'Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getLinkedinProfiles','d':'Get LinkedIn Profiles','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]},{'n':'amount','r':false,'t':'string','p':'10'}]},{'k':'getLinkedinProfilesByCompany','d':'Get LinkedIn Company Employees','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/company/ibm-aspera/'},{'n':'list','r':false,'t':'string','p':'employees'}]},{'k':'getLinkedinProfilesByContent','d':'Get LinkedIn Profiles By Content','ed':'Extract fastly last profiles that have published content on LinkedIn by specific keywords','g':'communication','p':[{'n':'keywords','r':false,'t':'string','p':'Growth'},{'n':'list','r':false,'t':'string','p':'content'}]},{'k':'sendLinkedinVisit','d':'Send LinkedIn Profile Visit','ed':'Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas/'}]},{'k':'checkListContains','d':'Check List Contains','ed':'Check if the list contains a specific item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'2'}]},{'k':'checkListEnds','d':'Check List Ends With','ed':'Check if the list ends with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'3'}]},{'k':'checkListLengthBetw','d':'Check Length List Between','ed':'Check if the length of a list is between two quantities','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'4'}]},{'k':'checkListLengthEq','d':'Check Length List Equal','ed':'Checks if the length of a list equals a specified quantity','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGe','d':'Check Length List Greater Or Equal','ed':'Check if the length of a list is greater than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGt','d':'Check Length List Greater','ed':'Check if the length of a list is greater than a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'2'}]},{'k':'checkListLengthLe','d':'Check Length List Lower Or Equal','ed':'Check if the length of a list is less than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthLt','d':'Check Length List Lower','ed':'','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkListMax','d':'Check Greater Element','ed':'Checks if the largest item in a list matches the provided item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,4,8,3,4,5'},{'n':'number','r':true,'t':'string','p':'8'}]},{'k':'getListMax','d':'Get Greater Element','ed':'Returns the largest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListMin','d':'Check Lower Element','ed':'Checks if the smallest element in a list matches the provided element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'5,6,1,3,7'},{'n':'number','r':true,'t':'string','p':'1'}]},{'k':'getListMin','d':'Get Lower Element','ed':'Returns the smallest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'getListSort','d':'Get Sorted List','ed':'Returns an ascending sorted list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListSorted','d':'Check List Is Sorted','ed':'Check if a list is sorted in ascending order','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'checkListStarts','d':'Check List Starts With','ed':'Check if the list starts with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'1'}]},{'k':'checkListUnique','d':'Check Unique Es List','ed':'Check if a list consists of unique elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'getListUnique','d':'Get Unique List','ed':'Returns a single list, with no repeating elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListValid','d':'Check Valid List','ed':'Check if the supplied values ​​form a valid list of elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getLocaleByIp','d':'Get Locale Data By IP','ed':'Discover locale data (currency, language) by ipv4 or ipv6 address.','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByCoordinates','d':'Get Location By Coordinates','ed':'Discover the city name, zipcode, province or country by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.619206,2.2920828'}]},{'k':'getLocationByIp','d':'Get Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getReputationByIp','d':'Get Reputation By IP','ed':'Discover reputation by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getTimeByIp','d':'Get Time Data By IP','ed':'Discover datetime data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByName','d':'Get Location By Name','ed':'Discover location data by name','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getLocationByPhone','d':'Get Location By Landline Phone (ES)','ed':'Discover the city and the province from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'848491812'}]},{'k':'getLocationByZipcode','d':'Get Location By Zipcode (ES)','ed':'Discover the city and the province from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getLocationExtendedByIp','d':'Get Extended Location By IP','ed':'Discover geographical, company, timezone and reputation data by IPv4 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationGeocodedByIp','d':'Get Geocoded Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationListByName','d':'Get Locations By Name','ed':'Get most relevants locations by name (Google Maps typical search)','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Pintores Granollers'}]},{'k':'getLocationListByParams','d':'Get Locations By Parameters','ed':'Get most relevants locations by name, category, location and radius','g':'geographic','p':[{'n':'name','r':false,'t':'string','p':'Saba'},{'n':'category','r':false,'t':'options','p':'parking','o':[{'name':'Accounting','value':'accounting'},{'name':'Airport','value':'airport'},{'name':'Amusement_park','value':'amusement_park'},{'name':'Aquarium','value':'aquarium'},{'name':'Art_gallery','value':'art_gallery'},{'name':'Atm','value':'atm'},{'name':'Bakery','value':'bakery'},{'name':'Bank','value':'bank'},{'name':'Bar','value':'bar'},{'name':'Beauty_salon','value':'beauty_salon'},{'name':'Bicycle_store','value':'bicycle_store'},{'name':'Book_store','value':'book_store'},{'name':'Bowling_alley','value':'bowling_alley'},{'name':'Bus_station','value':'bus_station'},{'name':'Cafe','value':'cafe'},{'name':'Campground','value':'campground'},{'name':'Car_dealer','value':'car_dealer'},{'name':'Car_rental','value':'car_rental'},{'name':'Car_repair','value':'car_repair'},{'name':'Car_wash','value':'car_wash'},{'name':'Casino','value':'casino'},{'name':'Cemetery','value':'cemetery'},{'name':'Church','value':'church'},{'name':'City_hall','value':'city_hall'},{'name':'Clothing_store','value':'clothing_store'},{'name':'Convenience_store','value':'convenience_store'},{'name':'Courthouse','value':'courthouse'},{'name':'Dentist','value':'dentist'},{'name':'Department_store','value':'department_store'},{'name':'Doctor','value':'doctor'},{'name':'Electrician','value':'electrician'},{'name':'Electronics_store','value':'electronics_store'},{'name':'Embassy','value':'embassy'},{'name':'Establishment','value':'establishment'},{'name':'Finance','value':'finance'},{'name':'Fire_station','value':'fire_station'},{'name':'Florist','value':'florist'},{'name':'Food','value':'food'},{'name':'Funeral_home','value':'funeral_home'},{'name':'Furniture_store','value':'furniture_store'},{'name':'Gas_station','value':'gas_station'},{'name':'General_contractor','value':'general_contractor'},{'name':'Grocery_or_supermarket','value':'grocery_or_supermarket'},{'name':'Gym','value':'gym'},{'name':'Hair_care','value':'hair_care'},{'name':'Hardware_store','value':'hardware_store'},{'name':'Health','value':'health'},{'name':'Hindu_temple','value':'hindu_temple'},{'name':'Home_goods_store','value':'home_goods_store'},{'name':'Hospital','value':'hospital'},{'name':'Insurance_agency','value':'insurance_agency'},{'name':'Jewelry_store','value':'jewelry_store'},{'name':'Laundry','value':'laundry'},{'name':'Lawyer','value':'lawyer'},{'name':'Library','value':'library'},{'name':'Liquor_store','value':'liquor_store'},{'name':'Local_government_office','value':'local_government_office'},{'name':'Locksmith','value':'locksmith'},{'name':'Lodging','value':'lodging'},{'name':'Meal_delivery','value':'meal_delivery'},{'name':'Meal_takeaway','value':'meal_takeaway'},{'name':'Mosque','value':'mosque'},{'name':'Movie_rental','value':'movie_rental'},{'name':'Movie_theater','value':'movie_theater'},{'name':'Moving_location','value':'moving_location'},{'name':'Museum','value':'museum'},{'name':'Night_club','value':'night_club'},{'name':'Painter','value':'painter'},{'name':'Park','value':'park'},{'name':'Parking','value':'parking'},{'name':'Pet_store','value':'pet_store'},{'name':'Pharmacy','value':'pharmacy'},{'name':'Physiotherapist','value':'physiotherapist'},{'name':'Place_of_worship','value':'place_of_worship'},{'name':'Plumber','value':'plumber'},{'name':'Police','value':'police'},{'name':'Post_office','value':'post_office'},{'name':'Real_estate_agency','value':'real_estate_agency'},{'name':'Restaurant','value':'restaurant'},{'name':'Roofing_contractor','value':'roofing_contractor'},{'name':'Rv_park','value':'rv_park'},{'name':'School','value':'school'},{'name':'Shoe_store','value':'shoe_store'},{'name':'Shopping_mall','value':'shopping_mall'},{'name':'Spa','value':'spa'},{'name':'Stadium','value':'stadium'},{'name':'Storage','value':'storage'},{'name':'Store','value':'store'},{'name':'Subway_station','value':'subway_station'},{'name':'Synagogue','value':'synagogue'},{'name':'Taxi_stand','value':'taxi_stand'},{'name':'Train_station','value':'train_station'},{'name':'Transit_station','value':'transit_station'},{'name':'Travel_agency','value':'travel_agency'},{'name':'University','value':'university'},{'name':'Veterinary_care','value':'veterinary_care'},{'name':'Zoo','value':'zoo'}]},{'n':'location','r':true,'t':'string','p':'41.3851,2.1734'},{'n':'radius','r':false,'t':'string','p':'250'}]},{'k':'checkMobileAlive','d':'Check Mobile Is Alive','ed':'Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don\'t return if mobile is alive (like Vodafone)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryCode','d':'Get Country ISO Code By Mobile','ed':'Allow to get country code (two chars) of a mobile phone number with international format','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryPrefix','d':'Get Phone Prefix By Country ISO Code','ed':'Allow to get country prefix number by country code (2 characters)','g':'communication','p':[{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileExist','d':'Check Mobile Exists','ed':'Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with "Mobile lookup" tool.','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileFormat','d':'Check Mobile Has Valid Format','ed':'Discover if mobile phone number has a valid format, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34623123213'},{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileFormatEs','d':'Check Mobile Has Valid Format (ES)','ed':'Discover if mobile phone number has a valid format (only Spain)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'623123213'}]},{'k':'getMobileFormatted','d':'Get Formatted Mobile','ed':'Format international mobile number by country ISO code (2 letters).','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileHlrLookup','d':'Get HLR Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileImei','d':'Check Imei Is Valid','ed':'Discover if Imei number has a valid format','g':'communication','p':[{'n':'imei','r':true,'t':'string','p':'490154203237518'}]},{'k':'getMobileLookup','d':'Get Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileMnpLookup','d':'Get Mobile Portability Lookup','ed':'Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileNormalized','d':'Get Normalized Mobile','ed':'Allow to normalize a mobile phone, removing non allowed characters','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34 62318 2 770'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileOrPhoneLookupEs','d':'Get Mobile/Landline Lookup (Spain)','ed':'Discover if mobile or landline prefix exists on Spain.','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileOrPhoneMnpEs','d':'Get Landline/Mobile Portability Lookup (ES)','ed':'Get portability data about a landline or mobile number, only for Spain','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'605281220'}]},{'k':'checkMobileSms','d':'Check Mobile Supports Sms','ed':'Discover if a mobile number can receive sms, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefix','d':'Check Mobile Has Valid Prefix','ed':'Discover if mobile phone number has a valid prefix, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefixEs','d':'Check Mobile Has Valid Prefix (ES)','ed':'Discover if spanish mobile phone number has a valid prefix','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'605281220'}]},{'k':'getNameByPrefix','d':'Get Name By Prefix (ES)','ed':'Get first personal name matching by prefix and gender from INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'checkNameExist','d':'Check Name Exists (ES)','ed':'Check if a personal name exists in INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Juan'}]},{'k':'getNameListByPrefix','d':'Get Names By Prefix','ed':'Get multiple personal names by prefix','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'getNameNormalized','d':'Get Normalized Name','ed':'Normalize name removing non allowed characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'M4rc'}]},{'k':'checkNameValid','d':'Check Name Has Valid Format','ed':'Check if name contains accepted characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getUrlAnalysis','d':'Get URL Analysis','ed':'Analyze URL\'s health status about SSL, broken links, conflictive HTTP links with SSL, and more.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'getNetAton','d':'Get Number By IP','ed':'Convert an IP address to numeric notation','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'62.12.22.11'}]},{'k':'getNetByIp','d':'Get Network By IP','ed':'Discover network data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'checkUrlContains','d':'Check URL Contains','ed':'Check if an URL contains string or regular expression (case insensitive)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'regex','r':true,'t':'string','p':'uProc'}]},{'k':'getUrlContents','d':'Get Contents From URL','ed':'Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'},{'n':'selector','r':false,'t':'string','p':'emails'}]},{'k':'getUrlContentsParsed','d':'Get Parsed Contents From URL','ed':'Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.bing.com/search?q=killia+technologies'}]},{'k':'getUrlDecode','d':'Get Decoded URL','ed':'Decode URL to recover original','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https%3A%2F%2Fgoogle.es'}]},{'k':'getUrlEncode','d':'Get Encoded URL','ed':'Encode URL to avoid problems','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://google.com'}]},{'k':'checkUrlExist','d':'Check URL Exists','ed':'Check if an URL exists','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'getNetFixip','d':'Get Fixed IP','ed':'Fix an IP address to the right format','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'212169160147'}]},{'k':'checkNetHostAlive','d':'Check Host Is Up','ed':'Discover if a computer is switched on','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.es'}]},{'k':'checkStringIp','d':'Check IP Has Valid Format','ed':'Check if IPv4 or IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'23.45.57.123'}]},{'k':'checkStringIp4','d':'Check IPv4 Has Valid Format','ed':'Check if IPv4 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'127.0.0.1'}]},{'k':'checkStringIp6','d':'Check IPv6 Has Valid Format','ed':'Check if IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'2a01:c50e:3544:bd00:4df0:7609:251a:f6d0'}]},{'k':'getUrlListContentsParsed','d':'Get Parsed Contents From Results URL','ed':'Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.bing.com/search?q=killia+technologies'}]},{'k':'getNetNtoa','d':'Get IP By Number','ed':'Convert a number to an IP address','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'1501706957'}]},{'k':'getUrlParsed','d':'Get Parsed URL','ed':'Decode URL into multiple fields','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'}]},{'k':'getNetScan','d':'Get Opened Ports In Host','ed':'Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'google.es'}]},{'k':'checkNetServiceUp','d':'Check Service Is Up','ed':'Discover if a service in a port is available','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.com'},{'n':'port','r':true,'t':'string','p':'80'}]},{'k':'getUrlTables','d':'Get Table From URL','ed':'Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2'},{'n':'table','r':false,'t':'string','p':'3'}]},{'k':'checkUrlValid','d':'Check URL Is Valid','ed':'Check that an URL has a valid format','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'checkNumberBetw','d':'Check Number Is Between','ed':'Check if number is between two values','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'21'},{'n':'number3','r':true,'t':'string','p':'24'}]},{'k':'checkNumberDecimal','d':'Check Decimal Number Is Valid','ed':'Check if value is a decimal number','p':[{'n':'number','r':true,'t':'string','p':'0.23'}]},{'k':'checkNumberEq','d':'Check Number Is Equal','ed':'Check if number is equal to another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberEven','d':'Check Even Number Is Valid','ed':'Check if number is even','p':[{'n':'number','r':true,'t':'string','p':'2'}]},{'k':'checkNumberGe','d':'Check Number Is Greater Or Equal','ed':'Check if number is greater or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberGt','d':'Check Number Is Greater','ed':'Check if number is greater than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'22'}]},{'k':'checkNumberLe','d':'Check Number Is Lower Or Equal','ed':'Check if number is lower or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLt','d':'Check Number Is Lower','ed':'Check if number is lower than another','p':[{'n':'number1','r':true,'t':'string','p':'22'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLuhn','d':'Check Luhn Number Is Valid','ed':'Check if it a valid Luhn number','g':'security','p':[{'n':'luhn','r':true,'t':'string','p':'79927398713'}]},{'k':'checkNumberMod','d':'Check Modulus Is Equals','ed':'Check if modulus between two numbers is equal to a value','p':[{'n':'number','r':true,'t':'string','p':'10'},{'n':'mod','r':true,'t':'string','p':'2'},{'n':'rest','r':true,'t':'string','p':'0'}]},{'k':'checkNumberNatural','d':'Check Natural Number Is Valid','ed':'Check if value is a natural number','p':[{'n':'number','r':true,'t':'string','p':'0'}]},{'k':'checkStringNumeric','d':'Check Numeric String Is Valid','ed':'Check if string length contains only numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'123'}]},{'k':'checkNumberOdd','d':'Check Odd Number Is Valid','ed':'Check if number is odd','p':[{'n':'number','r':true,'t':'string','p':'3'}]},{'k':'checkNumberPrime','d':'Check Prime Number Is Valid','ed':'Check if number is prime','p':[{'n':'number','r':true,'t':'string','p':'11'}]},{'k':'checkPasswordStrong','d':'Check Password Is Strong','ed':'Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters','g':'security','p':[{'n':'password','r':true,'t':'string','p':'1agdA*$#'}]},{'k':'getPersonByEmail','d':'Get Person By Email','ed':'Get personal data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonByFirstnameLastnameCompanyLocation','d':'Get Person By Firstname, Lastname, Company And Location','ed':'Get personal data by firstname, lastname, company and location','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':false,'t':'string','p':'uProc'},{'n':'location','r':false,'t':'string','p':''}]},{'k':'getPersonByMobile','d':'Get Person By Mobile','ed':'Get personal data by mobile','g':'personal','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'sendPersonEmailToList','d':'Send Email\'s Contact To List','ed':'Add a contact email to a person list','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getPersonExtendedByEmail','d':'Get Person (Extended) By Email','ed':'Get prospect\'s contact data and company\'s location and social data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonExtendedByEmailAndCompany','d':'Get Person (Extended) By Email And Company','ed':'Get contact, location and social data by email and company name and location','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'company','r':false,'t':'string','p':'uProc'}]},{'k':'getPersonFakedData','d':'Get Random Person Data','ed':'Generates random fake data','g':'personal','p':[{'n':'locality','r':true,'t':'options','p':'English','o':[{'name':'Australia (English)','value':'Australia (English)'},{'name':'Australia Ocker (English)','value':'Australia Ocker (English)'},{'name':'Azerbaijani','value':'Azerbaijani'},{'name':'Bork (English)','value':'Bork (English)'},{'name':'Canada (English)','value':'Canada (English)'},{'name':'Canada (French)','value':'Canada (French)'},{'name':'Chinese','value':'Chinese'},{'name':'Chinese (Taiwan)','value':'Chinese (Taiwan)'},{'name':'Czech','value':'Czech'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Farsi','value':'Farsi'},{'name':'French','value':'French'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'German (Austria)','value':'German (Austria)'},{'name':'German (Switzerland)','value':'German (Switzerland)'},{'name':'Great Britain (English)','value':'Great Britain (English)'},{'name':'India (English)','value':'India (English)'},{'name':'Indonesia','value':'Indonesia'},{'name':'Ireland (English)','value':'Ireland (English)'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Korean','value':'Korean'},{'name':'Nepalese','value':'Nepalese'},{'name':'Norwegian','value':'Norwegian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Brazil)','value':'Portuguese (Brazil)'},{'name':'Russian','value':'Russian'},{'name':'Slovakian','value':'Slovakian'},{'name':'Spanish','value':'Spanish'},{'name':'Spanish Mexico','value':'Spanish Mexico'},{'name':'Swedish','value':'Swedish'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'United States (English)','value':'United States (English)'},{'name':'Vietnamese','value':'Vietnamese'}]}]},{'k':'getProfileByEmployeeData','d':'Get LinkedIn URI By First, Last And Company','ed':'Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':true,'t':'string','p':'uProc'}]},{'k':'getSurnameByPrefix','d':'Get Surname By Prefix (ES)','ed':'Get first personal surname matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Col'}]},{'k':'checkSurnameExist','d':'Check Surname Is Valid (ES)','ed':'Check if a personal surname appears in INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileLinkedinByEmail','d':'Get LinkedIn URI By Email','ed':'Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getSurnameListByPrefix','d':'Get Surnames By Prefix (ES)','ed':'Get personal surnames matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Co'}]},{'k':'getSurnameNormalized','d':'Get Normalized Surname','ed':'Normalize surname','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'C0lomer'}]},{'k':'getProfileTwitterByEmployeeData','d':'Get Twitter URI By First, Last And Company','ed':'Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Carlos'},{'n':'lastname','r':true,'t':'string','p':'Blanco'},{'n':'company','r':true,'t':'string','p':'Encomenda'}]},{'k':'checkSurnameValid','d':'Check Surname Has Valid Format','ed':'Check if surname contains accepted characters','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileXingByEmployeeData','d':'Get Xing URI By First, Last And Company','ed':'Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'David'},{'n':'lastname','r':true,'t':'string','p':'Tomás'},{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPhoneFixed','d':'Get Fixed Phone','ed':'Fix the international prefix of a phone based on the ISO code of a country','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'+1605281220'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormat','d':'Check Valid Phone Format By Country','ed':'Allow to discover if landline number has a good international format, depending on country ','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormatEs','d':'Check Valid Phone Format (ES)','ed':'Discover if landline phone number is valid, with Spain coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getPhoneNormalized','d':'Get Cleaned Phone','ed':'Clean a phone removing non allowed characters','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'3493218 767o'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneOrMobileValid','d':'Check Phone Or Mobile Valid','ed':'Discover if landline or mobile number has a valid prefix','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getPhoneParsed','d':'Get Parsed And Validated Phone','ed':'Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked).','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'checkPhoneValidPrefix','d':'Check Valid Phone Prefix','ed':'Discover if a landline phone number prefix exists, with worldwide coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'getProvinceByIp','d':'Get Province By IP','ed':'Discover the province name from an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getProvinceByName','d':'Get Province By Name (ES)','ed':'You can get the first province by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceByPhone','d':'Get Province By Phone (ES)','ed':'Discover the province name from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceByZipcode','d':'Get Province By Zipcode (ES)','ed':'Discover the province name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08'}]},{'k':'getProvinceListByName','d':'Get Provinces By Name (ES)','ed':'You can get a province list by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceListByPhone','d':'Get Provinces By Phone (ES)','ed':'You can get a province list by a phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceListByZipcode','d':'Get Provinces By Zipcode (ES)','ed':'You can get a province list by a zipcode prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'0'}]},{'k':'getProvinceNormalized','d':'Get Normalized Province','ed':'Allow to normalize a province, removing non allowed characters','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'Barce lona'}]},{'k':'checkRobinsonEmailExist','d':'Check Email Is Robinson (ES)','ed':'Discover if an email exists in the Robinson list (only Spain)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'manzaned@uvigo.es'}]},{'k':'checkRobinsonNifExist','d':'Check Nif Number Is Robinson (ES)','ed':'Discover if an nif exists in the Robinson list (only Spain)','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'00002206K'}]},{'k':'checkRobinsonPhoneExist','d':'Check Phone Is Robinson (ES)','ed':'Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'917156252'}]},{'k':'getSentimentByText','d':'Get Sentiment From A Text','ed':'It allows to analyze an english text with Emojis and detect sentiment','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am very happy'}]},{'k':'checkSocialDomainExist','d':'Check Domain Has Social Activity','ed':'Discover if a domain has social network presence','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainLookup','d':'Get Social Networks By Domain','ed':'Discover if a domain or a website has social activity and returns all social network profiles found','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainParsed','d':'Get Social Networks Activity By Domain','ed':'Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'checkSocialEmailExist','d':'Check Email Has Social Activity','ed':'Discover if the email has social network presence','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@gmail.com'}]},{'k':'getSocialEmailLookup','d':'Get Social Networks By Email','ed':'Discover if an email has social activity, and get all social network profiles found','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkSocialMobileExist','d':'Check Mobile Has Social Activity','ed':'Discover if the mobile phone has social network presence','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialMobileLookup','d':'Get Social Networks By Mobile','ed':'Discover if an mobile phone has social activity, and get all social network profiles found','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialUriParsed','d':'Get Social Network Activity','ed':'This tools parses a social uri address and extracts any available indicators','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.facebook.com/uprocdataquality'}]},{'k':'checkStringAlpha','d':'Check Alphabetic String Is Valid','ed':'Check if string length contains only letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'asc'}]},{'k':'checkStringAlphanumeric','d':'Check Alphanumeric String Is','ed':'Check if string length contains only numbers and letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aa11'}]},{'k':'getStringBase64','d':'Get BASE64 Value','ed':'Convert a string to a BASE64 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'checkStringBlank','d':'Check String Is Empty','ed':'Check if string has no content','g':'text','p':[{'n':'text','r':true,'t':'string','p':''}]},{'k':'checkStringBoolean','d':'Check Boolean String Is Valid','ed':'Check if string is true or false','g':'text','p':[{'n':'text','r':true,'t':'string','p':'true'}]},{'k':'getStringByFormat','d':'Get Formatted String By Pattern','ed':'It allows to format a string using a format pattern','g':'text','p':[{'n':'text','r':true,'t':'string','p':'1122'},{'n':'format','r':true,'t':'string','p':'%09d'}]},{'k':'getStringByRegex','d':'Get Generated Text By Pattern','ed':'Generate a random string using a regular expression as a pattern','g':'text','p':[{'n':'regex','r':true,'t':'string','p':'[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*'}]},{'k':'checkStringContains','d':'Check String Contains Char','ed':'Check if string contains a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'checkStringEnds','d':'Check String Ends With','ed':'Check if string ends with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringFieldName','d':'Get Field Type By Value','ed':'Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address','g':'text','p':[{'n':'text','r':true,'t':'string','p':'myemail@mydomain.com'}]},{'k':'getStringJoin','d':'Get Merged Values By Text','ed':'Join a character or string to join two values','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'hi'},{'n':'text2','r':true,'t':'string','p':'good morning!'},{'n':'glue','r':true,'t':'string','p':','}]},{'k':'getStringLength','d':'Get String Length','ed':'Get length of a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'checkStringLengthBetw','d':'Check String Length Is Between','ed':'Check if string length is between two numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'5'}]},{'k':'checkStringLengthEq','d':'Check String Length Is Equal','ed':'Check if string length is equal to number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGe','d':'Check String Length Is Greater Or Equal','ed':'Check if string length is greater or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGt','d':'Check String Length Is Greater','ed':'Check if string length is greater than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkStringLengthLe','d':'Check String Length Is Lower Or Equal','ed':'Check if string length is lower or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthLt','d':'Check String Length Is Lower','ed':'Check if string length is lower than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'5'}]},{'k':'checkStringLowercase','d':'Check Text Is Lowercased','ed':'Check if string only contains lowercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aaa'}]},{'k':'getStringLowercase','d':'Get Lowercased Text','ed':'Convert all letters found in a string to lowercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringMd5','d':'Get MD5 String','ed':'Convert a string to a MD5 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringNormalized','d':'Get Normalized String By Field','ed':'Normalize a string depending on the field name','g':'text','p':[{'n':'field','r':true,'t':'options','p':'name','o':[{'name':'Alphabetic','value':'alphabetic'},{'name':'Alphanumeric','value':'alphanumeric'},{'name':'Cif','value':'cif'},{'name':'City','value':'city'},{'name':'Country','value':'country'},{'name':'Date','value':'date'},{'name':'Decimal','value':'decimal'},{'name':'Dni','value':'dni'},{'name':'Domain','value':'domain'},{'name':'Email','value':'email'},{'name':'Gender','value':'gender'},{'name':'Integer','value':'integer'},{'name':'Ip','value':'ip'},{'name':'Mobile','value':'mobile'},{'name':'Name','value':'name'},{'name':'Nie','value':'nie'},{'name':'Nif','value':'nif'},{'name':'Phone','value':'phone'},{'name':'Province','value':'province'},{'name':'Zipcode','value':'zipcode'}]},{'n':'text','r':true,'t':'string','p':'JMª Gº.Fco.gtez. Gro.'}]},{'k':'getStringParsed','d':'Get Parsed Text','ed':'Analyze string and return all emails, phones, zipcodes and links detected','g':'text','p':[{'n':'text','r':true,'t':'string','p':'My email is miquel@uproc.io and my phone is 34605281220'}]},{'k':'checkStringRandom','d':'Check String Is Random','ed':'Check if string contains random characters without sense','g':'text','p':[{'n':'text','r':true,'t':'string','p':'t2 chhsdfitoixcv'}]},{'k':'checkStringRegex','d':'Check String Is Valid By Pattern','ed':'Check if string contains a value that matches with a regular expression','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'regex','r':true,'t':'string','p':'^test$'}]},{'k':'getStringReplaceAll','d':'Get Texts Replaced By String','ed':'Replace all values found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringReplaceFirst','d':'Get Text Replaced By String','ed':'Replace first value found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringSha','d':'Get SHA String','ed':'Convert a string to a SHA encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringSplit','d':'Get Splitted Values By Separator','ed':'Split a value in two parts, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Texto largo, separado por coma'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getStringSplitAndJoin','d':'Get Splitted And Merged Values By Separator','ed':'Split a value in two parts and join them, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'separator','r':true,'t':'string','p':','},{'n':'glue','r':true,'t':'string','p':';'}]},{'k':'checkStringStarts','d':'Check String Starts With','ed':'Check if string starts with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringTranslated','d':'Get Translated Text','ed':'It allows to translate a text to any language','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, my name is Mike'},{'n':'language','r':true,'t':'options','p':'Spanish','o':[{'name':'Afrikaans','value':'Afrikaans'},{'name':'Albanian','value':'Albanian'},{'name':'Amharic','value':'Amharic'},{'name':'Arabic','value':'Arabic'},{'name':'Armenian','value':'Armenian'},{'name':'Azeerbaijani','value':'Azeerbaijani'},{'name':'Basque','value':'Basque'},{'name':'Belarusian','value':'Belarusian'},{'name':'Bengali','value':'Bengali'},{'name':'Bosnian','value':'Bosnian'},{'name':'Bulgarian','value':'Bulgarian'},{'name':'Catalan','value':'Catalan'},{'name':'Cebuano','value':'Cebuano'},{'name':'Chinese (Simplified)','value':'Chinese (Simplified)'},{'name':'Chinese (Traditional)','value':'Chinese (Traditional)'},{'name':'Corsican','value':'Corsican'},{'name':'Croatian','value':'Croatian'},{'name':'Czech','value':'Czech'},{'name':'Danish','value':'Danish'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Esperanto','value':'Esperanto'},{'name':'Estonian','value':'Estonian'},{'name':'Finnish','value':'Finnish'},{'name':'French','value':'French'},{'name':'Frisian','value':'Frisian'},{'name':'Galician','value':'Galician'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'Greek','value':'Greek'},{'name':'Gujarati','value':'Gujarati'},{'name':'Haitian Creole','value':'Haitian Creole'},{'name':'Hausa','value':'Hausa'},{'name':'Hawaiian','value':'Hawaiian'},{'name':'Hebrew','value':'Hebrew'},{'name':'Hindi','value':'Hindi'},{'name':'Hmong','value':'Hmong'},{'name':'Hungarian','value':'Hungarian'},{'name':'Icelandic','value':'Icelandic'},{'name':'Igbo','value':'Igbo'},{'name':'Indonesian','value':'Indonesian'},{'name':'Irish','value':'Irish'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Javanese','value':'Javanese'},{'name':'Kannada','value':'Kannada'},{'name':'Kazakh','value':'Kazakh'},{'name':'Khmer','value':'Khmer'},{'name':'Korean','value':'Korean'},{'name':'Kurdish','value':'Kurdish'},{'name':'Kyrgyz','value':'Kyrgyz'},{'name':'Lao','value':'Lao'},{'name':'Latin','value':'Latin'},{'name':'Latvian','value':'Latvian'},{'name':'Lithuanian','value':'Lithuanian'},{'name':'Luxembourgish','value':'Luxembourgish'},{'name':'Macedonian','value':'Macedonian'},{'name':'Malagasy','value':'Malagasy'},{'name':'Malay','value':'Malay'},{'name':'Malayalam','value':'Malayalam'},{'name':'Maltese','value':'Maltese'},{'name':'Maori','value':'Maori'},{'name':'Marathi','value':'Marathi'},{'name':'Mongolian','value':'Mongolian'},{'name':'Myanmar (Burmese)','value':'Myanmar (Burmese)'},{'name':'Nepali','value':'Nepali'},{'name':'Norwegian','value':'Norwegian'},{'name':'Nyanja (Chichewa)','value':'Nyanja (Chichewa)'},{'name':'Pashto','value':'Pashto'},{'name':'Persian','value':'Persian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Portugal, Brazil)','value':'Portuguese (Portugal, Brazil)'},{'name':'Punjabi','value':'Punjabi'},{'name':'Romanian','value':'Romanian'},{'name':'Russian','value':'Russian'},{'name':'Samoan','value':'Samoan'},{'name':'Scots Gaelic','value':'Scots Gaelic'},{'name':'Serbian','value':'Serbian'},{'name':'Sesotho','value':'Sesotho'},{'name':'Shona','value':'Shona'},{'name':'Sindhi','value':'Sindhi'},{'name':'Sinhala (Sinhalese)','value':'Sinhala (Sinhalese)'},{'name':'Slovak','value':'Slovak'},{'name':'Slovenian','value':'Slovenian'},{'name':'Somali','value':'Somali'},{'name':'Spanish','value':'Spanish'},{'name':'Sundanese','value':'Sundanese'},{'name':'Swahili','value':'Swahili'},{'name':'Swedish','value':'Swedish'},{'name':'Tagalog (Filipino)','value':'Tagalog (Filipino)'},{'name':'Tajik','value':'Tajik'},{'name':'Tamil','value':'Tamil'},{'name':'Telugu','value':'Telugu'},{'name':'Thai','value':'Thai'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'Urdu','value':'Urdu'},{'name':'Uzbek','value':'Uzbek'},{'name':'Vietnamese','value':'Vietnamese'},{'name':'Welsh','value':'Welsh'},{'name':'Xhosa','value':'Xhosa'},{'name':'Yiddish','value':'Yiddish'},{'name':'Yoruba','value':'Yoruba'},{'name':'Zulu','value':'Zulu'}]}]},{'k':'checkStringUppercase','d':'Check Text Is Uppercased','ed':'Check if string only contains uppercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'AAA'}]},{'k':'getStringUppercase','d':'Get Uppercased Text','ed':'Convert all letters found in a string to uppercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringVlookup','d':'Get String VLookup','ed':'Lookup string between multiple values by fuzzy logic and regex patterns','g':'text','p':[{'n':'text','r':true,'t':'string','p':'s4mple'},{'n':'texts','r':true,'t':'string','p':'sample,samples'}]},{'k':'getVatByAddress','d':'Get VAT% By Address','ed':'Get country VAT by address','g':'finance','p':[{'n':'address','r':true,'t':'string','p':'Mallorca, 120 España'}]},{'k':'getVatByCoordinates','d':'Get VAT% By Coordinates','ed':'Get country VAT by coordinates','g':'finance','p':[{'n':'coordinates','r':true,'t':'string','p':'41.61921,2.2904413'}]},{'k':'getVatByIp','d':'Get VAT% By IP','ed':'Get VAT by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getVatByIsocode','d':'Get VAT% By ISO Code','ed':'Get VAT value by country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getVatByNumber','d':'Get Data By TIN (VIES)','ed':'Get related european TIN number in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getVatByPhone','d':'Get VAT% By Phone','ed':'Get VAT by phone number, with worldwide coverage','g':'finance','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getVatByZipcode','d':'Get VAT% By Zipcode','ed':'Get VAT by zipcode','g':'finance','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkVatExist','d':'Check TIN Exists (VIES)','ed':'Check if TIN number exists in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getWordBanned','d':'Get Banned Words','ed':'Discover English banned words in the email body or subject','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am so thrilled to inform you that our new amazing feature is live!'}]},{'k':'getWordCleanAbuse','d':'Get Text Cleaned Without Abuse Words','ed':'Clean abuse words from a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'comentario de un maldito personaje'}]},{'k':'getWordCount','d':'Get Words Count','ed':'Count total words in a text','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'}]},{'k':'checkWordCountBetw','d':'Check Word Count Between','ed':'Check if the number of words in a sentence is between two determined quantities','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count1','r':true,'t':'string','p':'1'},{'n':'count2','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountEq','d':'Check Word Count Equal','ed':'Check if the number of words in a sentence equals a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGe','d':'Check Word Count Greater Or Equal','ed':'Check if the number of words in a sentence is greater than or equal to a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGt','d':'Check Word Count Greater','ed':'Check if the number of words in a sentence is greater than a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'1'}]},{'k':'checkWordCountLe','d':'Check Word Count Lower Or Equal','ed':'Check if the number of words present in a sentence is less than or equal to a quantity','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountLt','d':'Check Word Count Lower','ed':'','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'3'}]},{'k':'getZipcodeByIp','d':'Get Zipcode By IP','ed':'Discover the zipcode if you have an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getZipcodeByPrefix','d':'Get Zipcode By Prefix (ES)','ed':'Get first zipcode by prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'checkZipcodeExist','d':'Check Zipcode By Prefix Exists (ES)','ed':'Discover if a zipcode number prefix exists, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkZipcodeFormat','d':'Check Zipcode Has Valid Format (ES)','ed':'Discover if a zipcode number has a valid format, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getZipcodeListByPrefix','d':'Get Zipcodes By Prefix (ES)','ed':'Get multiple zipcodes by prefix, with worldwide coverage','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'getZipcodeNormalized','d':'Get Normalized Zipcode','ed':'Allow to normalize a zipcode, removing non allowed characters','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08i 12'}]}]}; \ No newline at end of file +export const tools = {processors: [{"k":"checkCreditcardChecksum","d":"Check Card Number Has Valid Format","ed":"Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)","g":"finance","p":[{"n":"credit_card","r":true,"t":"string","p":"4024007151839544"}]},{"k":"getCreditcardType","d":"Get Credit Card Type By Number","ed":"Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)","g":"finance","p":[{"n":"credit_card","r":true,"t":"string","p":"4024007151839544"}]},{"k":"getAddressBySearch","d":"Get Exact Address By Search","ed":"Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120, Barcelona, España"}]},{"k":"getCoordinateBySearch","d":"Get Coordinates By Search","ed":"Discover latitude and longitude coordinates of a postal address","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona, España"}]},{"k":"checkAddressExist","d":"Check Exact Address Exists","ed":"Check if an exact address exists by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getAddressNormalized","d":"Get Normalized Address","ed":"Allow to normalize an address, removing non allowed characters","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120, Barcelona Spain"}]},{"k":"checkAddressNumberExist","d":"Check Street Number Exists","ed":"Check if a house number exists by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getAddressSplitted","d":"Get Parsed Address","ed":"Parse postal address into separated fields, getting a basic resolution","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120 08036 Barcelona Barcelona Spain"}]},{"k":"getAddressSplittedBest","d":"Get Improved Parsed Address","ed":"Parse postal address into separated fields, getting an improved resolution","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120 08036 Barcelona Barcelona Spain"}]},{"k":"checkCoordinateValid","d":"Check Valid Coordinates","ed":"Check if coordinates have a valid format","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"checkAgeBetw","d":"Check Age Between","ed":"Check if age is between two numbers","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years1","r":true,"t":"number","p":"35"},{"n":"years2","r":true,"t":"number","p":"50"}]},{"k":"getAgeByDate","d":"Get Age By Date","ed":"Discover the age of a birth date (multiple formats allowed)","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"checkAgeEq","d":"Check Ages Are Equal","ed":"Check if ages are equal","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"45"}]},{"k":"checkAgeGe","d":"Check Age Is Greater Or Equal","ed":"Check if age is greater or equal than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"43"}]},{"k":"checkAgeGt","d":"Check Age Is Greater","ed":"Check if age is greater than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"40"}]},{"k":"checkAgeIsAdult","d":"Check Age Is Greater Than Or Equal To 18 Years","ed":"Check if birth date belongs to an adult: 18 years old (Spain)","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1950-05-20"}]},{"k":"checkAgeIsForties","d":"Check Age Is Between 40 And 49 Years","ed":"Check if date returns an age between 40 and 49 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"checkAgeIsRetired","d":"Check Age Is Greater Than 64 Years","ed":"Check if birth date returns an age greater than 64 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1954-05-20"}]},{"k":"checkAgeIsTwenties","d":"Check Age Is Between 20 And 29 Years","ed":"Check if date returns an age between 20 and 29 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"2000-05-20"}]},{"k":"checkAgeLe","d":"Check Age Is Lower Or Equal","ed":"Check if age is lower or equal than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"46"}]},{"k":"checkAgeLt","d":"Check Age Is Lower","ed":"Chekc if age is lower than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"46"}]},{"k":"getAgeRange","d":"Get Age Range By Date","ed":"Discover the age range of a person by birth date","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"getAsinByEan","d":"Get ASIN By EAN","ed":"Get ASIN code by EAN code querying Internet.","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"0635753490879"}]},{"k":"checkAsinExist","d":"Check ASIN Exists","ed":"Check if a ASIN code exists on Amazon marketplace","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"checkAsinValid","d":"Check ASIN Valid","ed":"Check if a ASIN code has a valid format","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"getAudioAdvancedSpeechByText","d":"Get Advanced Speech By Text","ed":"Get advanced human audio file by provided text and language","g":"audio","p":[{"n":"text","r":true,"t":"string","p":"Hi! My name is Miquel. I will read any text you type here."},{"n":"gender","r":true,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]},{"n":"language","r":true,"t":"options","p":"american","o":[{"name":"American","value":"american"},{"name":"Arabic","value":"arabic"},{"name":"Bengali","value":"bengali"},{"name":"British","value":"british"},{"name":"Czech","value":"czech"},{"name":"Danish","value":"danish"},{"name":"Dutch","value":"dutch"},{"name":"Filipino","value":"filipino"},{"name":"Finnish","value":"finnish"},{"name":"French","value":"french"},{"name":"German","value":"german"},{"name":"Greek","value":"greek"},{"name":"Gujurati","value":"gujurati"},{"name":"Hindi","value":"hindi"},{"name":"Hungarian","value":"hungarian"},{"name":"Indonesian","value":"indonesian"},{"name":"Italian","value":"italian"},{"name":"Japanese","value":"japanese"},{"name":"Kannada","value":"kannada"},{"name":"Korean","value":"korean"},{"name":"Malayalam","value":"malayalam"},{"name":"Mandarin","value":"mandarin"},{"name":"Norwegian","value":"norwegian"},{"name":"Polish","value":"polish"},{"name":"Portuguese","value":"portuguese"},{"name":"Russian","value":"russian"},{"name":"Slovak","value":"slovak"},{"name":"Spanish","value":"spanish"},{"name":"Tamil","value":"tamil"},{"name":"Telugu","value":"telugu"},{"name":"Thai","value":"thai"},{"name":"Turkish","value":"turkish"},{"name":"Ukranian","value":"ukranian"},{"name":"Vietnamese","value":"vietnamese"}]}]},{"k":"getAudioSpeechByText","d":"Get Speech By Text","ed":"Get audio file by provided text and language","g":"audio","p":[{"n":"text","r":true,"t":"string","p":"Hi! My name is Miquel. I will read any text you type here."},{"n":"gender","r":true,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]},{"n":"language","r":true,"t":"options","p":"american","o":[{"name":"American","value":"american"},{"name":"French","value":"french"},{"name":"German","value":"german"},{"name":"Italian","value":"italian"},{"name":"Japanese","value":"japanese"},{"name":"Portuguese","value":"portuguese"},{"name":"Russian","value":"russian"},{"name":"Spanish","value":"spanish"}]}]},{"k":"checkBankAccountValidEs","d":"Check Bank Account Is Valid (ES)","ed":"Discover if account number has a valid format","g":"finance","p":[{"n":"account","r":true,"t":"string","p":"14650120311716144388"}]},{"k":"checkBankBicValid","d":"Check BIC Is Valid","ed":"Discover if BIC number has a valid format","g":"finance","p":[{"n":"bic","r":true,"t":"string","p":"DABAIE2D"}]},{"k":"getBankIbanByAccount","d":"Get IBAN By Account","ed":"Get IBAN number by account number of the country","g":"finance","p":[{"n":"account","r":true,"t":"string","p":"14650120311716144388"},{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getBankIbanLookup","d":"Get IBAN Lookup","ed":"Get to search data bank information by IBAN account number","g":"finance","p":[{"n":"iban","r":true,"t":"string","p":"NL91ABNA0417164300"}]},{"k":"checkBankIbanValid","d":"Check IBAN Is Valid","ed":"Discover if IBAN account number has a valid format","g":"finance","p":[{"n":"iban","r":true,"t":"string","p":"ES3314650120311716144388"}]},{"k":"getBarcodeEncoded","d":"Get Encoded Barcode","ed":"Get an encoded barcode by number and required standard","g":"image","p":[{"n":"text","r":true,"t":"string","p":"0635753490879"},{"n":"bcid","r":true,"t":"options","p":"ean13","o":[{"name":"Auspost","value":"auspost"},{"name":"Azteccode","value":"azteccode"},{"name":"Azteccodecompact","value":"azteccodecompact"},{"name":"Aztecrune","value":"aztecrune"},{"name":"Bc412","value":"bc412"},{"name":"Channelcode","value":"channelcode"},{"name":"Codablockf","value":"codablockf"},{"name":"Code11","value":"code11"},{"name":"Code128","value":"code128"},{"name":"Code16k","value":"code16k"},{"name":"Code2of5","value":"code2of5"},{"name":"Code32","value":"code32"},{"name":"Code39","value":"code39"},{"name":"Code39ext","value":"code39ext"},{"name":"Code49","value":"code49"},{"name":"Code93","value":"code93"},{"name":"Code93ext","value":"code93ext"},{"name":"Codeone","value":"codeone"},{"name":"Coop2of5","value":"coop2of5"},{"name":"Daft","value":"daft"},{"name":"Databarexpanded","value":"databarexpanded"},{"name":"Databarexpandedcomposite","value":"databarexpandedcomposite"},{"name":"Databarexpandedstacked","value":"databarexpandedstacked"},{"name":"Databarexpandedstackedcomposite","value":"databarexpandedstackedcomposite"},{"name":"Databarlimited","value":"databarlimited"},{"name":"Databarlimitedcomposite","value":"databarlimitedcomposite"},{"name":"Databaromni","value":"databaromni"},{"name":"Databaromnicomposite","value":"databaromnicomposite"},{"name":"Databarstacked","value":"databarstacked"},{"name":"Databarstackedcomposite","value":"databarstackedcomposite"},{"name":"Databarstackedomni","value":"databarstackedomni"},{"name":"Databarstackedomnicomposite","value":"databarstackedomnicomposite"},{"name":"Databartruncated","value":"databartruncated"},{"name":"Databartruncatedcomposite","value":"databartruncatedcomposite"},{"name":"Datalogic2of5","value":"datalogic2of5"},{"name":"Datamatrix","value":"datamatrix"},{"name":"Datamatrixrectangular","value":"datamatrixrectangular"},{"name":"Dotcode","value":"dotcode"},{"name":"Ean13","value":"ean13"},{"name":"Ean13composite","value":"ean13composite"},{"name":"Ean14","value":"ean14"},{"name":"Ean2","value":"ean2"},{"name":"Ean5","value":"ean5"},{"name":"Ean8","value":"ean8"},{"name":"Ean8composite","value":"ean8composite"},{"name":"Flattermarken","value":"flattermarken"},{"name":"Gs1-128","value":"gs1-128"},{"name":"Gs1-128composite","value":"gs1-128composite"},{"name":"Gs1-cc","value":"gs1-cc"},{"name":"Gs1datamatrix","value":"gs1datamatrix"},{"name":"Gs1datamatrixrectangular","value":"gs1datamatrixrectangular"},{"name":"Gs1northamericancoupon","value":"gs1northamericancoupon"},{"name":"Hanxin","value":"hanxin"},{"name":"Hibcazteccode","value":"hibcazteccode"},{"name":"Hibccodablockf","value":"hibccodablockf"},{"name":"Hibccode128","value":"hibccode128"},{"name":"Hibccode39","value":"hibccode39"},{"name":"Hibcdatamatrix","value":"hibcdatamatrix"},{"name":"Hibcdatamatrixrectangular","value":"hibcdatamatrixrectangular"},{"name":"Hibcmicropdf417","value":"hibcmicropdf417"},{"name":"Hibcpdf417","value":"hibcpdf417"},{"name":"Iata2of5","value":"iata2of5"},{"name":"Identcode","value":"identcode"},{"name":"Industrial2of5","value":"industrial2of5"},{"name":"Interleaved2of5","value":"interleaved2of5"},{"name":"Isbn","value":"isbn"},{"name":"Ismn","value":"ismn"},{"name":"Issn","value":"issn"},{"name":"Itf14","value":"itf14"},{"name":"Japanpost","value":"japanpost"},{"name":"Kix","value":"kix"},{"name":"Leitcode","value":"leitcode"},{"name":"Matrix2of5","value":"matrix2of5"},{"name":"Maxicode","value":"maxicode"},{"name":"Micropdf417","value":"micropdf417"},{"name":"Msi","value":"msi"},{"name":"Onecode","value":"onecode"},{"name":"Pdf417","value":"pdf417"},{"name":"Pdf417compact","value":"pdf417compact"},{"name":"Pharmacode","value":"pharmacode"},{"name":"Pharmacode2","value":"pharmacode2"},{"name":"Planet","value":"planet"},{"name":"Plessey","value":"plessey"},{"name":"Posicode","value":"posicode"},{"name":"Postnet","value":"postnet"},{"name":"Pzn","value":"pzn"},{"name":"RationalizedCodabar","value":"rationalizedCodabar"},{"name":"Raw","value":"raw"},{"name":"Royalmail","value":"royalmail"},{"name":"Sscc18","value":"sscc18"},{"name":"Symbol","value":"symbol"},{"name":"Telepen","value":"telepen"},{"name":"Telepennumeric","value":"telepennumeric"},{"name":"Ultracode","value":"ultracode"},{"name":"Upca","value":"upca"},{"name":"Upcacomposite","value":"upcacomposite"},{"name":"Upce","value":"upce"},{"name":"Upcecomposite","value":"upcecomposite"}]}]},{"k":"getBookAuthorLookup","d":"Get Book By Author","ed":"Get book by author's surname","g":"product","p":[{"n":"author","r":true,"t":"string","p":"Albert Einstein"}]},{"k":"getBookCategoryLookup","d":"Get Book By Category","ed":"Get all publications by category","g":"product","p":[{"n":"category","r":true,"t":"string","p":"science"}]},{"k":"checkBookIsbn","d":"Check ISBN Code Is Valid","ed":"Allow to check if an ISBN10/13 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"0306406152"}]},{"k":"checkBookIsbnExist","d":"Check ISBN Code Exists","ed":"Allow to check if an ISBN book exist","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"getBookIsbnLookup","d":"Get Book By ISBN","ed":"Get book or publication data by 10 or 13 digits ISBN code","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"checkBookIsbn10","d":"Check ISBN10 Code Is Valid","ed":"Allow to check if an ISBN10 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"0306406152"}]},{"k":"checkBookIsbn13","d":"Check ISBN13 Code Is Valid","ed":"Allow to check if an ISBN13 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"getBookListAuthorLookup","d":"Get Books By Author","ed":"Get books by author's surname","g":"product","p":[{"n":"author","r":true,"t":"string","p":"Albert Einstein"}]},{"k":"getBookListCategoryLookup","d":"Get Books By Category","ed":"Get all books by category","g":"product","p":[{"n":"category","r":true,"t":"string","p":"science"}]},{"k":"getBookListPublisherLookup","d":"Get Books By Editor","ed":"Get all books by editor","g":"product","p":[{"n":"publisher","r":true,"t":"string","p":"Grupo RBA"}]},{"k":"getBookListTitleLookup","d":"Get Books By Title","ed":"Get all books by title","g":"product","p":[{"n":"title","r":true,"t":"string","p":"Science"}]},{"k":"getBookPublisherLookup","d":"Get Book By Editor","ed":"Get book data by editor's name","g":"product","p":[{"n":"publisher","r":true,"t":"string","p":"Grupo RBA"}]},{"k":"getBookTitleLookup","d":"Get Book By Title","ed":"Get book data by title","g":"product","p":[{"n":"title","r":true,"t":"string","p":"La empresa más feliz del mundo"}]},{"k":"getNifByDni","d":"Get NIF By DNI (ES)","ed":"Discover the letter of a dni card number","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016116"}]},{"k":"getCifNormalized","d":"Get Normalized CIF","ed":"Allow to normalize a CIF number, removing non allowed characters","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"B 62084 959"}]},{"k":"getDniNormalized","d":"Get Normalized DNI (ES)","ed":"Allow to normalize a DNI number, removing non allowed characters","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016a116"}]},{"k":"getNieNormalized","d":"Get Normalized NIE (ES)","ed":"Allow to normalize a NIE number, removing non allowed characters","g":"personal","p":[{"n":"nie","r":true,"t":"string","p":"X402001 122g"}]},{"k":"getNifNormalized","d":"Get Normalized NIF (ES)","ed":"Allow to normalize a NIF number, removing non allowed characters","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"402001 122g"}]},{"k":"checkCifValid","d":"Check CIF Is Valid (ES)","ed":"Discover if a cif card number is valid","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"A58818501"}]},{"k":"checkDniValid","d":"Check Valid Dni (ES)","ed":"Discover if a dni card number is valid","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016116"}]},{"k":"checkNieValid","d":"Check NIE Is Valid (ES)","ed":"Discover if a NIE card number is valid","g":"personal","p":[{"n":"nie","r":true,"t":"string","p":"Y2918527W"}]},{"k":"checkNifValid","d":"Check NIF Is Valid (ES)","ed":"Discover if a nif card number is valid","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"44016116G"}]},{"k":"getCityByIp","d":"Get City By IP","ed":"Get city from ip","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCityByName","d":"Get City By Name (ES)","ed":"City search by partial name (only Spain)","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Bar"}]},{"k":"getCityByPhone","d":"Get City By Phone (ES)","ed":"Discover the city name by the local phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932187670"}]},{"k":"getCityByZipcode","d":"Get City By Zipcode (ES)","ed":"Discover the city name by the zipcode (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getCityListByName","d":"Get Cities By Prefix (ES)","ed":"Get multiple cities by partial initial text (only Spain)","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Barce"}]},{"k":"getCityListByPhone","d":"Get Cities By Phone (ES)","ed":"Get multiple cities by phone prefix (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"938499145"}]},{"k":"getCityListByZipcode","d":"Get Cities By Zipcode (ES)","ed":"Get multiple cities by zipcode prefix (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"234"}]},{"k":"getCityNormalized","d":"Get Normalized City","ed":"Allow to normalize a city, removing non allowed characters","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Barc3l0na"}]},{"k":"checkEan13Valid","d":"Check EAN13 Is Valid","ed":"Check if a EAN barcode of 13 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"4006381333931"}]},{"k":"checkGtin13Valid","d":"Check GTIN13 Is Valid","ed":"Check if a GTIN barcode of 13 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"4006381333931"}]},{"k":"checkEan14Valid","d":"Check EAN14 Is Valid","ed":"Check if a EAN barcode of 14 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"04006381333931"}]},{"k":"checkGtin14Valid","d":"Check GTIN14 Is Valid","ed":"Check if a GTIN barcode of 14 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"04006381333931"}]},{"k":"checkEan18Valid","d":"Check EAN18 Is Valid","ed":"Check if a EAN barcode of 18 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"000004006381333931"}]},{"k":"checkEan8Valid","d":"Check EAN8 Is Valid","ed":"Check if a EAN barcode of 8 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"checkGtin8Valid","d":"Check GTIN8 Is Valid","ed":"Check if a GTIN barcode of 8 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"getEanByAsin","d":"Get EAN By ASIN","ed":"Get EAN code by ASIN code querying Internet.","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"checkEanExist","d":"Check EAN Exists","ed":"Check if a EAN code exists on Amazon Marketplace (.com supported)","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"0635753490879"}]},{"k":"checkUpcExist","d":"Check UPC Exists","ed":"Check if a UPC code exists","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkUpcFormat","d":"Check UPC Has Valid Format","ed":"Check if a UPC code has a valid format","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkNumberIsin","d":"Check ISIN Code Is Valid","ed":"Check if ISIN number is valid","g":"company","p":[{"n":"isin","r":true,"t":"string","p":"US0378331005"}]},{"k":"getUpcLookup","d":"Get Product By UPC","ed":"Get product data of an UPC code on Amazon Marketplace (.com supported)","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkNumberSsEs","d":"Check Social Security Number Is Valid (ES)","ed":"Check if SS number is valid, only for Spain","g":"company","p":[{"n":"number","r":true,"t":"string","p":"998239812282"}]},{"k":"checkNumberUuid","d":"Check UUID Number Is Valid","ed":"Check if it a valid UUID number","g":"security","p":[{"n":"uuid","r":true,"t":"string","p":"550e8400-e29b-41d4-a716-446655440000"}]},{"k":"checkEanValid","d":"Check EAN Is Valid","ed":"Check if a EAN barcode (8 or 13 digits) has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"checkGtinValid","d":"Check GTIN Is Valid","ed":"Check if a GTIN barcode (8 or 13 digits) has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"getCommunityByZipcode","d":"Get Community By Zipcode (ES)","ed":"Discover the community name from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getCompanyByCif","d":"Get Company By CIF (ES)","ed":"Get company data by CIF","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"B66998592"}]},{"k":"getCompanyByDomain","d":"Get Company By Domain","ed":"Get company data by domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getCompanyByDuns","d":"Get Company By DUNS (ES)","ed":"Get company data by DUNS","g":"company","p":[{"n":"duns","r":true,"t":"string","p":"464016690"}]},{"k":"getCompanyByEmail","d":"Get Company By Email","ed":"Get company data by email","g":"company","p":[{"n":"email","r":true,"t":"string","p":"hello@killia.com"}]},{"k":"getCompanyByIp","d":"Get Company By IP","ed":"Get company data by IP address","g":"company","p":[{"n":"ip","r":true,"t":"string","p":"74.125.228.72"}]},{"k":"getCompanyByName","d":"Get Company By Name","ed":"Get company data by name","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."},{"n":"country","r":false,"t":"options","p":"Spain","o":[{"name":"Afghanistan","value":"Afghanistan"},{"name":"Albania","value":"Albania"},{"name":"Algeria","value":"Algeria"},{"name":"American Samoa","value":"American Samoa"},{"name":"Andorra","value":"Andorra"},{"name":"Angola","value":"Angola"},{"name":"Anguilla","value":"Anguilla"},{"name":"Antarctica","value":"Antarctica"},{"name":"Antigua And Barbuda","value":"Antigua And Barbuda"},{"name":"Argentina","value":"Argentina"},{"name":"Armenia","value":"Armenia"},{"name":"Aruba","value":"Aruba"},{"name":"Australia","value":"Australia"},{"name":"Austria","value":"Austria"},{"name":"Azerbaijan","value":"Azerbaijan"},{"name":"Bahamas","value":"Bahamas"},{"name":"Bahrain","value":"Bahrain"},{"name":"Bangladesh","value":"Bangladesh"},{"name":"Barbados","value":"Barbados"},{"name":"Belarus","value":"Belarus"},{"name":"Belgium","value":"Belgium"},{"name":"Belize","value":"Belize"},{"name":"Benin","value":"Benin"},{"name":"Bermuda","value":"Bermuda"},{"name":"Bhutan","value":"Bhutan"},{"name":"Bolivia","value":"Bolivia"},{"name":"Bosnia And Herzegovina","value":"Bosnia And Herzegovina"},{"name":"Botswana","value":"Botswana"},{"name":"Bouvet Island","value":"Bouvet Island"},{"name":"Brazil","value":"Brazil"},{"name":"British Indian Ocean Territory","value":"British Indian Ocean Territory"},{"name":"Brunei Darussalam","value":"Brunei Darussalam"},{"name":"Bulgaria","value":"Bulgaria"},{"name":"Burkina Faso","value":"Burkina Faso"},{"name":"Burundi","value":"Burundi"},{"name":"Cambodia","value":"Cambodia"},{"name":"Cameroon","value":"Cameroon"},{"name":"Canada","value":"Canada"},{"name":"Cape Verde","value":"Cape Verde"},{"name":"Cayman Islands","value":"Cayman Islands"},{"name":"Central African Republic","value":"Central African Republic"},{"name":"Chad","value":"Chad"},{"name":"Chile","value":"Chile"},{"name":"China","value":"China"},{"name":"Christmas Island","value":"Christmas Island"},{"name":"Cocos (keeling) Islands","value":"Cocos (keeling) Islands"},{"name":"Colombia","value":"Colombia"},{"name":"Comoros","value":"Comoros"},{"name":"Congo","value":"Congo"},{"name":"Congo, The Democratic Republic Of The","value":"Congo, The Democratic Republic Of The"},{"name":"Cook Islands","value":"Cook Islands"},{"name":"Costa Rica","value":"Costa Rica"},{"name":"Cote D'ivoire","value":"Cote D'ivoire"},{"name":"Croatia","value":"Croatia"},{"name":"Cuba","value":"Cuba"},{"name":"Cyprus","value":"Cyprus"},{"name":"Czech Republic","value":"Czech Republic"},{"name":"Denmark","value":"Denmark"},{"name":"Djibouti","value":"Djibouti"},{"name":"Dominica","value":"Dominica"},{"name":"Dominican Republic","value":"Dominican Republic"},{"name":"East Timor","value":"East Timor"},{"name":"Ecuador","value":"Ecuador"},{"name":"Egypt","value":"Egypt"},{"name":"El Salvador","value":"El Salvador"},{"name":"Equatorial Guinea","value":"Equatorial Guinea"},{"name":"Eritrea","value":"Eritrea"},{"name":"Estonia","value":"Estonia"},{"name":"Ethiopia","value":"Ethiopia"},{"name":"Falkland Islands (malvinas)","value":"Falkland Islands (malvinas)"},{"name":"Faroe Islands","value":"Faroe Islands"},{"name":"Fiji","value":"Fiji"},{"name":"Finland","value":"Finland"},{"name":"France","value":"France"},{"name":"French Guiana","value":"French Guiana"},{"name":"French Polynesia","value":"French Polynesia"},{"name":"French Southern Territories","value":"French Southern Territories"},{"name":"Gabon","value":"Gabon"},{"name":"Gambia","value":"Gambia"},{"name":"Georgia","value":"Georgia"},{"name":"Germany","value":"Germany"},{"name":"Ghana","value":"Ghana"},{"name":"Gibraltar","value":"Gibraltar"},{"name":"Greece","value":"Greece"},{"name":"Greenland","value":"Greenland"},{"name":"Grenada","value":"Grenada"},{"name":"Guadeloupe","value":"Guadeloupe"},{"name":"Guam","value":"Guam"},{"name":"Guatemala","value":"Guatemala"},{"name":"Guinea","value":"Guinea"},{"name":"Guinea-bissau","value":"Guinea-bissau"},{"name":"Guyana","value":"Guyana"},{"name":"Haiti","value":"Haiti"},{"name":"Heard Island And Mcdonald Islands","value":"Heard Island And Mcdonald Islands"},{"name":"Holy See (vatican City State)","value":"Holy See (vatican City State)"},{"name":"Honduras","value":"Honduras"},{"name":"Hong Kong","value":"Hong Kong"},{"name":"Hungary","value":"Hungary"},{"name":"Iceland","value":"Iceland"},{"name":"India","value":"India"},{"name":"Indonesia","value":"Indonesia"},{"name":"Iran, Islamic Republic Of","value":"Iran, Islamic Republic Of"},{"name":"Iraq","value":"Iraq"},{"name":"Ireland","value":"Ireland"},{"name":"Israel","value":"Israel"},{"name":"Italy","value":"Italy"},{"name":"Jamaica","value":"Jamaica"},{"name":"Japan","value":"Japan"},{"name":"Jordan","value":"Jordan"},{"name":"Kazakstan","value":"Kazakstan"},{"name":"Kenya","value":"Kenya"},{"name":"Kiribati","value":"Kiribati"},{"name":"Korea, Democratic People's Republic Of","value":"Korea, Democratic People's Republic Of"},{"name":"Korea, Republic Of","value":"Korea, Republic Of"},{"name":"Kosovo","value":"Kosovo"},{"name":"Kuwait","value":"Kuwait"},{"name":"Kyrgyzstan","value":"Kyrgyzstan"},{"name":"Lao People's Democratic Republic","value":"Lao People's Democratic Republic"},{"name":"Latvia","value":"Latvia"},{"name":"Lebanon","value":"Lebanon"},{"name":"Lesotho","value":"Lesotho"},{"name":"Liberia","value":"Liberia"},{"name":"Libyan Arab Jamahiriya","value":"Libyan Arab Jamahiriya"},{"name":"Liechtenstein","value":"Liechtenstein"},{"name":"Lithuania","value":"Lithuania"},{"name":"Luxembourg","value":"Luxembourg"},{"name":"Macau","value":"Macau"},{"name":"Macedonia, The Former Yugoslav Republic Of","value":"Macedonia, The Former Yugoslav Republic Of"},{"name":"Madagascar","value":"Madagascar"},{"name":"Malawi","value":"Malawi"},{"name":"Malaysia","value":"Malaysia"},{"name":"Maldives","value":"Maldives"},{"name":"Mali","value":"Mali"},{"name":"Malta","value":"Malta"},{"name":"Marshall Islands","value":"Marshall Islands"},{"name":"Martinique","value":"Martinique"},{"name":"Mauritania","value":"Mauritania"},{"name":"Mauritius","value":"Mauritius"},{"name":"Mayotte","value":"Mayotte"},{"name":"Mexico","value":"Mexico"},{"name":"Micronesia, Federated States Of","value":"Micronesia, Federated States Of"},{"name":"Moldova, Republic Of","value":"Moldova, Republic Of"},{"name":"Monaco","value":"Monaco"},{"name":"Mongolia","value":"Mongolia"},{"name":"Montenegro","value":"Montenegro"},{"name":"Montserrat","value":"Montserrat"},{"name":"Morocco","value":"Morocco"},{"name":"Mozambique","value":"Mozambique"},{"name":"Myanmar","value":"Myanmar"},{"name":"Namibia","value":"Namibia"},{"name":"Nauru","value":"Nauru"},{"name":"Nepal","value":"Nepal"},{"name":"Netherlands","value":"Netherlands"},{"name":"Netherlands Antilles","value":"Netherlands Antilles"},{"name":"New Caledonia","value":"New Caledonia"},{"name":"New Zealand","value":"New Zealand"},{"name":"Nicaragua","value":"Nicaragua"},{"name":"Niger","value":"Niger"},{"name":"Nigeria","value":"Nigeria"},{"name":"Niue","value":"Niue"},{"name":"Norfolk Island","value":"Norfolk Island"},{"name":"Northern Mariana Islands","value":"Northern Mariana Islands"},{"name":"Norway","value":"Norway"},{"name":"Oman","value":"Oman"},{"name":"Pakistan","value":"Pakistan"},{"name":"Palau","value":"Palau"},{"name":"Palestinian Territory, Occupied","value":"Palestinian Territory, Occupied"},{"name":"Panama","value":"Panama"},{"name":"Papua New Guinea","value":"Papua New Guinea"},{"name":"Paraguay","value":"Paraguay"},{"name":"Peru","value":"Peru"},{"name":"Philippines","value":"Philippines"},{"name":"Pitcairn","value":"Pitcairn"},{"name":"Poland","value":"Poland"},{"name":"Portugal","value":"Portugal"},{"name":"Puerto Rico","value":"Puerto Rico"},{"name":"Qatar","value":"Qatar"},{"name":"Reunion","value":"Reunion"},{"name":"Romania","value":"Romania"},{"name":"Russian Federation","value":"Russian Federation"},{"name":"Rwanda","value":"Rwanda"},{"name":"Saint Helena","value":"Saint Helena"},{"name":"Saint Kitts And Nevis","value":"Saint Kitts And Nevis"},{"name":"Saint Lucia","value":"Saint Lucia"},{"name":"Saint Pierre And Miquelon","value":"Saint Pierre And Miquelon"},{"name":"Saint Vincent And The Grenadines","value":"Saint Vincent And The Grenadines"},{"name":"Samoa","value":"Samoa"},{"name":"San Marino","value":"San Marino"},{"name":"Sao Tome And Principe","value":"Sao Tome And Principe"},{"name":"Saudi Arabia","value":"Saudi Arabia"},{"name":"Senegal","value":"Senegal"},{"name":"Serbia","value":"Serbia"},{"name":"Seychelles","value":"Seychelles"},{"name":"Sierra Leone","value":"Sierra Leone"},{"name":"Singapore","value":"Singapore"},{"name":"Slovakia","value":"Slovakia"},{"name":"Slovenia","value":"Slovenia"},{"name":"Solomon Islands","value":"Solomon Islands"},{"name":"Somalia","value":"Somalia"},{"name":"South Africa","value":"South Africa"},{"name":"South Georgia And The South Sandwich Islands","value":"South Georgia And The South Sandwich Islands"},{"name":"Spain","value":"Spain"},{"name":"Sri Lanka","value":"Sri Lanka"},{"name":"Sudan","value":"Sudan"},{"name":"Suriname","value":"Suriname"},{"name":"Svalbard And Jan Mayen","value":"Svalbard And Jan Mayen"},{"name":"Swaziland","value":"Swaziland"},{"name":"Sweden","value":"Sweden"},{"name":"Switzerland","value":"Switzerland"},{"name":"Syrian Arab Republic","value":"Syrian Arab Republic"},{"name":"Taiwan, Province Of China","value":"Taiwan, Province Of China"},{"name":"Tajikistan","value":"Tajikistan"},{"name":"Tanzania, United Republic Of","value":"Tanzania, United Republic Of"},{"name":"Thailand","value":"Thailand"},{"name":"Togo","value":"Togo"},{"name":"Tokelau","value":"Tokelau"},{"name":"Tonga","value":"Tonga"},{"name":"Trinidad And Tobago","value":"Trinidad And Tobago"},{"name":"Tunisia","value":"Tunisia"},{"name":"Turkey","value":"Turkey"},{"name":"Turkmenistan","value":"Turkmenistan"},{"name":"Turks And Caicos Islands","value":"Turks And Caicos Islands"},{"name":"Tuvalu","value":"Tuvalu"},{"name":"Uganda","value":"Uganda"},{"name":"Ukraine","value":"Ukraine"},{"name":"United Arab Emirates","value":"United Arab Emirates"},{"name":"United Kingdom","value":"United Kingdom"},{"name":"United States","value":"United States"},{"name":"United States Minor Outlying Islands","value":"United States Minor Outlying Islands"},{"name":"Uruguay","value":"Uruguay"},{"name":"Uzbekistan","value":"Uzbekistan"},{"name":"Vanuatu","value":"Vanuatu"},{"name":"Venezuela","value":"Venezuela"},{"name":"Viet Nam","value":"Viet Nam"},{"name":"Virgin Islands, British","value":"Virgin Islands, British"},{"name":"Virgin Islands, U.s.","value":"Virgin Islands, U.s."},{"name":"Wallis And Futuna","value":"Wallis And Futuna"},{"name":"Western Sahara","value":"Western Sahara"},{"name":"Yemen","value":"Yemen"},{"name":"Zambia","value":"Zambia"},{"name":"Zimbabwe","value":"Zimbabwe"}]}]},{"k":"getCompanyByPhone","d":"Get Company By Phone","ed":"Get company data by phone number","g":"company","p":[{"n":"phone","r":true,"t":"string","p":"34933197570"}]},{"k":"getCompanyByProfile","d":"Get Company By Social Profile","ed":"Get company data by social network uri (LinkedIn, Twitter, ...)","g":"company","p":[{"n":"url","r":true,"t":"string","p":"https://twitter.com/Cloudflare"}]},{"k":"getPersonByProfile","d":"Get Person By Social Profile","ed":"Get personal data by social network profile","g":"personal","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getRoleClassified","d":"Get Classified Role","ed":"Identify and classify a prospect role detecting the right area and seniority to filter later","g":"company","p":[{"n":"role","r":true,"t":"string","p":"Project Manager"}]},{"k":"checkCompanyDebtorByTaxid","d":"Check Company Is Debtor By TaxId (ES)","ed":"Check if company is debtor by TaxId","g":"company","p":[{"n":"taxid","r":true,"t":"string","p":"B04363115"}]},{"k":"getPersonDecisionMaker","d":"Get Decision Maker","ed":"Get professional data of a decision maker by company name/domain and area","g":"company","p":[{"n":"company","r":true,"t":"string","p":"uproc.io"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]}]},{"k":"getPersonDecisionMakerBySearch","d":"Get Decision Maker By Search Engine","ed":"Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)","g":"company","p":[{"n":"company","r":true,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Ecommerce","value":"Ecommerce"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"clevel","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"location","r":false,"t":"string","p":""},{"n":"keyword","r":false,"t":"string","p":""}]},{"k":"getCompanyDomainByName","d":"Get Domain By Company Name","ed":"Get company domain by company name","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPersonEmailsByDomainAndArea","d":"Get Decision Maker's Emails By Domain And Area","ed":"Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"oracle.com"},{"n":"area","r":true,"t":"options","p":"Marketing","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]}]},{"k":"getCompanyExtendedByDomain","d":"Get Company (Extended) By Domain","ed":"Get company contact, social and technology data by domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getCompanyExtendedByEmail","d":"Get Company (Extended) By Email","ed":"Get company contact, social and technology data by email","g":"company","p":[{"n":"email","r":true,"t":"string","p":"hello@killia.com"}]},{"k":"getPersonExtendedByProfile","d":"Get Person (Extended) By Profile","ed":"Get personal and social data by social profile","g":"personal","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getProfileFacebookByCompany","d":"Get Facebook URI By Company","ed":"Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getCompanyFinancialByDomain","d":"Get Sales Data By Company's Domain","ed":"Get company sales data by company's domain name.

Next countries are supported: Spain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getCompanyFinancialByDuns","d":"Get Sales Data By Company's DUNS","ed":"Get company sales data by company's DUNS number.

Next countries are supported: Spain","g":"company","p":[{"n":"duns","r":true,"t":"string","p":"461809423"}]},{"k":"getCompanyFinancialByName","d":"Get Sales Data By Company's Name","ed":"Get company sales data by company's name.

Next countries are supported: Spain","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."}]},{"k":"getCompanyFinancialByTaxid","d":"Get Sales Data By Company's Taxid","ed":"Get company sales data by company's taxid (CIF).

Next countries are supported: Spain","g":"company","p":[{"n":"taxid","r":true,"t":"string","p":"B62084959"}]},{"k":"getCompanyGeocodedByIp","d":"Get Geocoded Company By IP","ed":"Get geocoded company data by IP address","g":"company","p":[{"n":"ip","r":true,"t":"string","p":"74.125.228.72"}]},{"k":"sendLinkedinInvitation","d":"Send Connection Request To Linkedin Profile","ed":"Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network! Thanks"}]},{"k":"sendLinkedinInvitationOrMessage","d":"Send Invitation Or Message To Linkedin Profile","ed":"Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message1","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network? Thanks"},{"n":"message2","r":true,"t":"string","p":"Hi {{first}}, thank you for accepting my invitation!"}]},{"k":"getProfileLinkedinByCompany","d":"Get LinkedIn URI By Company","ed":"Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPersonListByParams","d":"Get Employees By Parameters","ed":"Get employees by company name or domain, area, seniority and country","g":"company","p":[{"n":"country","r":true,"t":"options","p":"Spain","o":[{"name":"Afghanistan","value":"Afghanistan"},{"name":"Albania","value":"Albania"},{"name":"Algeria","value":"Algeria"},{"name":"American Samoa","value":"American Samoa"},{"name":"Andorra","value":"Andorra"},{"name":"Angola","value":"Angola"},{"name":"Anguilla","value":"Anguilla"},{"name":"Antarctica","value":"Antarctica"},{"name":"Antigua And Barbuda","value":"Antigua And Barbuda"},{"name":"Argentina","value":"Argentina"},{"name":"Armenia","value":"Armenia"},{"name":"Aruba","value":"Aruba"},{"name":"Australia","value":"Australia"},{"name":"Austria","value":"Austria"},{"name":"Azerbaijan","value":"Azerbaijan"},{"name":"Bahamas","value":"Bahamas"},{"name":"Bahrain","value":"Bahrain"},{"name":"Bangladesh","value":"Bangladesh"},{"name":"Barbados","value":"Barbados"},{"name":"Belarus","value":"Belarus"},{"name":"Belgium","value":"Belgium"},{"name":"Belize","value":"Belize"},{"name":"Benin","value":"Benin"},{"name":"Bermuda","value":"Bermuda"},{"name":"Bhutan","value":"Bhutan"},{"name":"Bolivia","value":"Bolivia"},{"name":"Bosnia And Herzegovina","value":"Bosnia And Herzegovina"},{"name":"Botswana","value":"Botswana"},{"name":"Bouvet Island","value":"Bouvet Island"},{"name":"Brazil","value":"Brazil"},{"name":"British Indian Ocean Territory","value":"British Indian Ocean Territory"},{"name":"Brunei Darussalam","value":"Brunei Darussalam"},{"name":"Bulgaria","value":"Bulgaria"},{"name":"Burkina Faso","value":"Burkina Faso"},{"name":"Burundi","value":"Burundi"},{"name":"Cambodia","value":"Cambodia"},{"name":"Cameroon","value":"Cameroon"},{"name":"Canada","value":"Canada"},{"name":"Cape Verde","value":"Cape Verde"},{"name":"Cayman Islands","value":"Cayman Islands"},{"name":"Central African Republic","value":"Central African Republic"},{"name":"Chad","value":"Chad"},{"name":"Chile","value":"Chile"},{"name":"China","value":"China"},{"name":"Christmas Island","value":"Christmas Island"},{"name":"Cocos (keeling) Islands","value":"Cocos (keeling) Islands"},{"name":"Colombia","value":"Colombia"},{"name":"Comoros","value":"Comoros"},{"name":"Congo","value":"Congo"},{"name":"Congo, The Democratic Republic Of The","value":"Congo, The Democratic Republic Of The"},{"name":"Cook Islands","value":"Cook Islands"},{"name":"Costa Rica","value":"Costa Rica"},{"name":"Cote D'ivoire","value":"Cote D'ivoire"},{"name":"Croatia","value":"Croatia"},{"name":"Cuba","value":"Cuba"},{"name":"Cyprus","value":"Cyprus"},{"name":"Czech Republic","value":"Czech Republic"},{"name":"Denmark","value":"Denmark"},{"name":"Djibouti","value":"Djibouti"},{"name":"Dominica","value":"Dominica"},{"name":"Dominican Republic","value":"Dominican Republic"},{"name":"East Timor","value":"East Timor"},{"name":"Ecuador","value":"Ecuador"},{"name":"Egypt","value":"Egypt"},{"name":"El Salvador","value":"El Salvador"},{"name":"Equatorial Guinea","value":"Equatorial Guinea"},{"name":"Eritrea","value":"Eritrea"},{"name":"Estonia","value":"Estonia"},{"name":"Ethiopia","value":"Ethiopia"},{"name":"Falkland Islands (malvinas)","value":"Falkland Islands (malvinas)"},{"name":"Faroe Islands","value":"Faroe Islands"},{"name":"Fiji","value":"Fiji"},{"name":"Finland","value":"Finland"},{"name":"France","value":"France"},{"name":"French Guiana","value":"French Guiana"},{"name":"French Polynesia","value":"French Polynesia"},{"name":"French Southern Territories","value":"French Southern Territories"},{"name":"Gabon","value":"Gabon"},{"name":"Gambia","value":"Gambia"},{"name":"Georgia","value":"Georgia"},{"name":"Germany","value":"Germany"},{"name":"Ghana","value":"Ghana"},{"name":"Gibraltar","value":"Gibraltar"},{"name":"Greece","value":"Greece"},{"name":"Greenland","value":"Greenland"},{"name":"Grenada","value":"Grenada"},{"name":"Guadeloupe","value":"Guadeloupe"},{"name":"Guam","value":"Guam"},{"name":"Guatemala","value":"Guatemala"},{"name":"Guinea","value":"Guinea"},{"name":"Guinea-bissau","value":"Guinea-bissau"},{"name":"Guyana","value":"Guyana"},{"name":"Haiti","value":"Haiti"},{"name":"Heard Island And Mcdonald Islands","value":"Heard Island And Mcdonald Islands"},{"name":"Holy See (vatican City State)","value":"Holy See (vatican City State)"},{"name":"Honduras","value":"Honduras"},{"name":"Hong Kong","value":"Hong Kong"},{"name":"Hungary","value":"Hungary"},{"name":"Iceland","value":"Iceland"},{"name":"India","value":"India"},{"name":"Indonesia","value":"Indonesia"},{"name":"Iran, Islamic Republic Of","value":"Iran, Islamic Republic Of"},{"name":"Iraq","value":"Iraq"},{"name":"Ireland","value":"Ireland"},{"name":"Israel","value":"Israel"},{"name":"Italy","value":"Italy"},{"name":"Jamaica","value":"Jamaica"},{"name":"Japan","value":"Japan"},{"name":"Jordan","value":"Jordan"},{"name":"Kazakstan","value":"Kazakstan"},{"name":"Kenya","value":"Kenya"},{"name":"Kiribati","value":"Kiribati"},{"name":"Korea, Democratic People's Republic Of","value":"Korea, Democratic People's Republic Of"},{"name":"Korea, Republic Of","value":"Korea, Republic Of"},{"name":"Kosovo","value":"Kosovo"},{"name":"Kuwait","value":"Kuwait"},{"name":"Kyrgyzstan","value":"Kyrgyzstan"},{"name":"Lao People's Democratic Republic","value":"Lao People's Democratic Republic"},{"name":"Latvia","value":"Latvia"},{"name":"Lebanon","value":"Lebanon"},{"name":"Lesotho","value":"Lesotho"},{"name":"Liberia","value":"Liberia"},{"name":"Libyan Arab Jamahiriya","value":"Libyan Arab Jamahiriya"},{"name":"Liechtenstein","value":"Liechtenstein"},{"name":"Lithuania","value":"Lithuania"},{"name":"Luxembourg","value":"Luxembourg"},{"name":"Macau","value":"Macau"},{"name":"Macedonia, The Former Yugoslav Republic Of","value":"Macedonia, The Former Yugoslav Republic Of"},{"name":"Madagascar","value":"Madagascar"},{"name":"Malawi","value":"Malawi"},{"name":"Malaysia","value":"Malaysia"},{"name":"Maldives","value":"Maldives"},{"name":"Mali","value":"Mali"},{"name":"Malta","value":"Malta"},{"name":"Marshall Islands","value":"Marshall Islands"},{"name":"Martinique","value":"Martinique"},{"name":"Mauritania","value":"Mauritania"},{"name":"Mauritius","value":"Mauritius"},{"name":"Mayotte","value":"Mayotte"},{"name":"Mexico","value":"Mexico"},{"name":"Micronesia, Federated States Of","value":"Micronesia, Federated States Of"},{"name":"Moldova, Republic Of","value":"Moldova, Republic Of"},{"name":"Monaco","value":"Monaco"},{"name":"Mongolia","value":"Mongolia"},{"name":"Montenegro","value":"Montenegro"},{"name":"Montserrat","value":"Montserrat"},{"name":"Morocco","value":"Morocco"},{"name":"Mozambique","value":"Mozambique"},{"name":"Myanmar","value":"Myanmar"},{"name":"Namibia","value":"Namibia"},{"name":"Nauru","value":"Nauru"},{"name":"Nepal","value":"Nepal"},{"name":"Netherlands","value":"Netherlands"},{"name":"Netherlands Antilles","value":"Netherlands Antilles"},{"name":"New Caledonia","value":"New Caledonia"},{"name":"New Zealand","value":"New Zealand"},{"name":"Nicaragua","value":"Nicaragua"},{"name":"Niger","value":"Niger"},{"name":"Nigeria","value":"Nigeria"},{"name":"Niue","value":"Niue"},{"name":"Norfolk Island","value":"Norfolk Island"},{"name":"Northern Mariana Islands","value":"Northern Mariana Islands"},{"name":"Norway","value":"Norway"},{"name":"Oman","value":"Oman"},{"name":"Pakistan","value":"Pakistan"},{"name":"Palau","value":"Palau"},{"name":"Palestinian Territory, Occupied","value":"Palestinian Territory, Occupied"},{"name":"Panama","value":"Panama"},{"name":"Papua New Guinea","value":"Papua New Guinea"},{"name":"Paraguay","value":"Paraguay"},{"name":"Peru","value":"Peru"},{"name":"Philippines","value":"Philippines"},{"name":"Pitcairn","value":"Pitcairn"},{"name":"Poland","value":"Poland"},{"name":"Portugal","value":"Portugal"},{"name":"Puerto Rico","value":"Puerto Rico"},{"name":"Qatar","value":"Qatar"},{"name":"Reunion","value":"Reunion"},{"name":"Romania","value":"Romania"},{"name":"Russian Federation","value":"Russian Federation"},{"name":"Rwanda","value":"Rwanda"},{"name":"Saint Helena","value":"Saint Helena"},{"name":"Saint Kitts And Nevis","value":"Saint Kitts And Nevis"},{"name":"Saint Lucia","value":"Saint Lucia"},{"name":"Saint Pierre And Miquelon","value":"Saint Pierre And Miquelon"},{"name":"Saint Vincent And The Grenadines","value":"Saint Vincent And The Grenadines"},{"name":"Samoa","value":"Samoa"},{"name":"San Marino","value":"San Marino"},{"name":"Sao Tome And Principe","value":"Sao Tome And Principe"},{"name":"Saudi Arabia","value":"Saudi Arabia"},{"name":"Senegal","value":"Senegal"},{"name":"Serbia","value":"Serbia"},{"name":"Seychelles","value":"Seychelles"},{"name":"Sierra Leone","value":"Sierra Leone"},{"name":"Singapore","value":"Singapore"},{"name":"Slovakia","value":"Slovakia"},{"name":"Slovenia","value":"Slovenia"},{"name":"Solomon Islands","value":"Solomon Islands"},{"name":"Somalia","value":"Somalia"},{"name":"South Africa","value":"South Africa"},{"name":"South Georgia And The South Sandwich Islands","value":"South Georgia And The South Sandwich Islands"},{"name":"Spain","value":"Spain"},{"name":"Sri Lanka","value":"Sri Lanka"},{"name":"Sudan","value":"Sudan"},{"name":"Suriname","value":"Suriname"},{"name":"Svalbard And Jan Mayen","value":"Svalbard And Jan Mayen"},{"name":"Swaziland","value":"Swaziland"},{"name":"Sweden","value":"Sweden"},{"name":"Switzerland","value":"Switzerland"},{"name":"Syrian Arab Republic","value":"Syrian Arab Republic"},{"name":"Taiwan, Province Of China","value":"Taiwan, Province Of China"},{"name":"Tajikistan","value":"Tajikistan"},{"name":"Tanzania, United Republic Of","value":"Tanzania, United Republic Of"},{"name":"Thailand","value":"Thailand"},{"name":"Togo","value":"Togo"},{"name":"Tokelau","value":"Tokelau"},{"name":"Tonga","value":"Tonga"},{"name":"Trinidad And Tobago","value":"Trinidad And Tobago"},{"name":"Tunisia","value":"Tunisia"},{"name":"Turkey","value":"Turkey"},{"name":"Turkmenistan","value":"Turkmenistan"},{"name":"Turks And Caicos Islands","value":"Turks And Caicos Islands"},{"name":"Tuvalu","value":"Tuvalu"},{"name":"Uganda","value":"Uganda"},{"name":"Ukraine","value":"Ukraine"},{"name":"United Arab Emirates","value":"United Arab Emirates"},{"name":"United Kingdom","value":"United Kingdom"},{"name":"United States","value":"United States"},{"name":"United States Minor Outlying Islands","value":"United States Minor Outlying Islands"},{"name":"Uruguay","value":"Uruguay"},{"name":"Uzbekistan","value":"Uzbekistan"},{"name":"Vanuatu","value":"Vanuatu"},{"name":"Venezuela","value":"Venezuela"},{"name":"Viet Nam","value":"Viet Nam"},{"name":"Virgin Islands, British","value":"Virgin Islands, British"},{"name":"Virgin Islands, U.s.","value":"Virgin Islands, U.s."},{"name":"Wallis And Futuna","value":"Wallis And Futuna"},{"name":"Western Sahara","value":"Western Sahara"},{"name":"Yemen","value":"Yemen"},{"name":"Zambia","value":"Zambia"},{"name":"Zimbabwe","value":"Zimbabwe"}]},{"n":"company","r":false,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"seniority","r":false,"t":"options","p":"","o":[{"name":"Apprentice","value":"Apprentice"},{"name":"Director","value":"Director"},{"name":"Executive","value":"Executive"},{"name":"Intermediate","value":"Intermediate"},{"name":"Manager","value":"Manager"}]},{"n":"email","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"phone","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]}]},{"k":"sendLinkedinMessage","d":"Send Message To Linkedin Profile","ed":"Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network? Thanks"}]},{"k":"getPersonMultipleDecisionMakerBySearch","d":"Get Decision Makers By Search Engine","ed":"Discover up to ten decision makers using search engines (Bing) by company name and area (optional)","g":"company","p":[{"n":"company","r":true,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Ecommerce","value":"Ecommerce"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"clevel","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"location","r":false,"t":"string","p":""},{"n":"keyword","r":false,"t":"string","p":""}]},{"k":"getCompanyNameByDomain","d":"Get Company's Name By Domain","ed":"Get company name by company domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getCompanyPhoneByDomain","d":"Get Phone By Company Domain","ed":"Get company phone by company domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getProfileTwitterByCompany","d":"Get Twitter URI By Company","ed":"Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getDistanceByAddresses","d":"Get Distance Between Addresses","ed":"Returns straight-line distance in kilometers between two addresses","g":"geographic","p":[{"n":"address1","r":true,"t":"string","p":"Mallorca 120, 08036, Barcelona"},{"n":"address2","r":true,"t":"string","p":"Mallorca 70, 08036, Barcelona"}]},{"k":"getRouteByAddresses","d":"Get Route Between Addresses","ed":"Returns driving routing time, distance, fuel consumption and cost between two addresses","g":"geographic","p":[{"n":"address1","r":true,"t":"string","p":"Mallorca 120, 08036, Barcelona"},{"n":"address2","r":true,"t":"string","p":"Mallorca 70, 08036, Barcelona"},{"n":"fuel_consumption","r":true,"t":"string","p":"5"},{"n":"price_liter","r":true,"t":"string","p":"1.2"}]},{"k":"getDistanceByCoordinates","d":"Get Distance Between Coordinates","ed":"Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"getRouteByCoordinates","d":"Get Route Between Coordinates","ed":"Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"getCoordinateByIp","d":"Get Coordinates By IP","ed":"Discover latitude and longitude coordinates of an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getDistanceByIps","d":"Get Distance Between IPs","ed":"Returns straight-line distance in kilometers between two IP addresses","g":"geographic","p":[{"n":"ip1","r":true,"t":"string","p":"95.23.100.79"},{"n":"ip2","r":true,"t":"string","p":"88.190.16.36"}]},{"k":"getRouteByIps","d":"Get Route Between IPs","ed":"Returns driving routing time, distance, fuel consumption and cost between two IP addresses","g":"geographic","p":[{"n":"ip1","r":true,"t":"string","p":"95.23.100.79"},{"n":"ip2","r":true,"t":"string","p":"88.190.16.36"},{"n":"fuel_consumption","r":true,"t":"string","p":"5"},{"n":"price_liter","r":true,"t":"string","p":"1.2"}]},{"k":"getDistanceByPhones","d":"Get Distance Between Phones","ed":"Returns straight-line distance in kilometers between two landline phones, using city and province of every phone","g":"geographic","p":[{"n":"phone1","r":true,"t":"string","p":"932187670"},{"n":"phone2","r":true,"t":"string","p":"91213111111"}]},{"k":"getRouteByPhones","d":"Get Route Between Phones","ed":"Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)","g":"geographic","p":[{"n":"phone1","r":true,"t":"string","p":"932187670"},{"n":"phone2","r":true,"t":"string","p":"91213111111"}]},{"k":"getDistanceByZipcodes","d":"Get Distance Between Zipcodes","ed":"Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode","g":"geographic","p":[{"n":"zipcode1","r":true,"t":"string","p":"08012"},{"n":"zipcode2","r":true,"t":"string","p":"28080"}]},{"k":"getRouteByZipcodes","d":"Get Route Between Zipcodes","ed":"Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode","g":"geographic","p":[{"n":"zipcode1","r":true,"t":"string","p":"08012"},{"n":"zipcode2","r":true,"t":"string","p":"28080"}]},{"k":"getCoordinateCartesian","d":"Get Cartesian Coordinates","ed":"Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCoordinateDecimal","d":"Get Decimal Coordinates","ed":"Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"checkDistanceEq","d":"Check Distance Is Equal","ed":"Discover if the distance between two coordinates is equal to another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"33.44"}]},{"k":"checkDistanceGe","d":"Check Distance Is Greater Or Equal","ed":"Discover if the distance in quilometers between two coordinates is greater or equal than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"33"}]},{"k":"checkDistanceGt","d":"Check Distance Is Greater","ed":"Discover if the distance in quilometers between two coordinates is greater than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"30"}]},{"k":"checkDistanceLe","d":"Check Distance Is Lower Or Equal","ed":"Discover if the distance in quilometers between two coordinates is lower or equal than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"34"}]},{"k":"checkDistanceLt","d":"Check Distance Is Lower","ed":"Discover if the distance in quilometers between two coordinates is lower than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"50"}]},{"k":"getCoordinateUsng","d":"Get USNG Coordinates","ed":"Get USNG coordinates by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCoordinateUtm","d":"Get UTM Coordinates","ed":"Get UTM coordinates by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCountryByCode","d":"Get Country By ISO Code","ed":"Get country name by its ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCountryByCurrencyCode","d":"Get Country By Currency","ed":"Get country name by currency ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCountryByIp","d":"Get Country By IP","ed":"Get country name by IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCountryByName","d":"Get Country By Name","ed":"Get country by prefix","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spa"}]},{"k":"getCountryByPhone","d":"Get Country By Phone","ed":"Get country name by phone number, with worldwide coverage","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"57122000111"}]},{"k":"getCountryCodeByName","d":"Get Country Code By Name","ed":"Get Alpha2 code by country prefix or name","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCountryListByCode","d":"Get Countries By ISO Code","ed":"Get multiple countries by ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCountryListByCurrencyCode","d":"Get Countries By Currency","ed":"Get multiple country names by currency ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCountryListByName","d":"Get Countries By Prefix","ed":"Get multiple country names by initial name","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"S"}]},{"k":"getCountryNormalized","d":"Get Normalized Country","ed":"Allow to normalize a country, removing non allowed characters","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spa1n"}]},{"k":"checkCountryValidIso","d":"Check Country Code Exists","ed":"Check if country ISO code exists","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCurrencyByCountry","d":"Get Currency Code By Country Name","ed":"Get ISO currency code by a country name","g":"finance","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCurrencyByCountryIsocode","d":"Get Currency Code By Country Code","ed":"Get ISO currency code by an ISO country code","g":"finance","p":[{"n":"country_code","r":true,"t":"string","p":"ES"}]},{"k":"getCurrencyByIp","d":"Get Currency By IP","ed":"Get ISO currency code by IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCurrencyByIsocode","d":"Get Currency By ISO Currency Code","ed":"Get an ISO currency code by a currency ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCurrencyConvertedBetweenIsocodeDate","d":"Get Conversion By Currencies And Date","ed":"Convert amount between supported currencies and an exchange date","g":"finance","p":[{"n":"amount","r":true,"t":"string","p":"10"},{"n":"isocode1","r":true,"t":"options","p":"EUR","o":[{"name":"AUD","value":"AUD"},{"name":"BGN","value":"BGN"},{"name":"BRL","value":"BRL"},{"name":"CAD","value":"CAD"},{"name":"CHF","value":"CHF"},{"name":"CNY","value":"CNY"},{"name":"CZK","value":"CZK"},{"name":"DKK","value":"DKK"},{"name":"EUR","value":"EUR"},{"name":"GBP","value":"GBP"},{"name":"HKD","value":"HKD"},{"name":"HRK","value":"HRK"},{"name":"HUF","value":"HUF"},{"name":"IDR","value":"IDR"},{"name":"ILS","value":"ILS"},{"name":"INR","value":"INR"},{"name":"ISK","value":"ISK"},{"name":"JPY","value":"JPY"},{"name":"KRW","value":"KRW"},{"name":"MXN","value":"MXN"},{"name":"MYR","value":"MYR"},{"name":"NOK","value":"NOK"},{"name":"NZD","value":"NZD"},{"name":"PHP","value":"PHP"},{"name":"PLN","value":"PLN"},{"name":"RON","value":"RON"},{"name":"RUB","value":"RUB"},{"name":"SEK","value":"SEK"},{"name":"SGD","value":"SGD"},{"name":"THB","value":"THB"},{"name":"TRY","value":"TRY"},{"name":"USD","value":"USD"},{"name":"ZAR","value":"ZAR"}]},{"n":"isocode2","r":true,"t":"options","p":"USD","o":[{"name":"AUD","value":"AUD"},{"name":"BGN","value":"BGN"},{"name":"BRL","value":"BRL"},{"name":"CAD","value":"CAD"},{"name":"CHF","value":"CHF"},{"name":"CNY","value":"CNY"},{"name":"CZK","value":"CZK"},{"name":"DKK","value":"DKK"},{"name":"EUR","value":"EUR"},{"name":"GBP","value":"GBP"},{"name":"HKD","value":"HKD"},{"name":"HRK","value":"HRK"},{"name":"HUF","value":"HUF"},{"name":"IDR","value":"IDR"},{"name":"ILS","value":"ILS"},{"name":"INR","value":"INR"},{"name":"ISK","value":"ISK"},{"name":"JPY","value":"JPY"},{"name":"KRW","value":"KRW"},{"name":"MXN","value":"MXN"},{"name":"MYR","value":"MYR"},{"name":"NOK","value":"NOK"},{"name":"NZD","value":"NZD"},{"name":"PHP","value":"PHP"},{"name":"PLN","value":"PLN"},{"name":"RON","value":"RON"},{"name":"RUB","value":"RUB"},{"name":"SEK","value":"SEK"},{"name":"SGD","value":"SGD"},{"name":"THB","value":"THB"},{"name":"TRY","value":"TRY"},{"name":"USD","value":"USD"},{"name":"ZAR","value":"ZAR"}]},{"n":"date","r":false,"t":"string","p":"2018-02-12"}]},{"k":"getCurrencyListByCountry","d":"Get Currencies By Country","ed":"Get multiple ISO currency codes by a country name","g":"finance","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCurrencyListByIp","d":"Get Currencies By IP","ed":"Get all ISO currency codes by an IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCurrencyListByIsocode","d":"Get Currencies By ISO Code","ed":"Get multiple ISO currency codes by a country ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"checkCurrencyValidIso","d":"Check ISO Currency Code Is Valid","ed":"Discover if an ISO currency code is valid","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"checkDateBetw","d":"Check Date Is Between Dates","ed":"Discover if a date (date1) is betwen two dates (date2, date3)","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":true,"t":"string","p":"1975-05-19"},{"n":"date3","r":true,"t":"string","p":"1975-05-22"}]},{"k":"getDateDifference","d":"Get Difference Between Dates","ed":"Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"2018-10-10 00:00:00"},{"n":"date2","r":true,"t":"string","p":"2018-10-11 00:00:00"},{"n":"period","r":true,"t":"options","p":"seconds","o":[{"name":"Days","value":"days"},{"name":"Hours","value":"hours"},{"name":"Minutes","value":"minutes"},{"name":"Seconds","value":"seconds"}]}]},{"k":"checkDateEq","d":"Check Dates Are Equal","ed":"Discover if two dates are equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":false,"t":"string","p":"1975-05-20"}]},{"k":"checkDateGe","d":"Check Date Is Greater Or Equal","ed":"Discover if a date is greater or equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-22"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"checkDateGt","d":"Check Date Is Greater","ed":"Discover if a date is greater","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-22"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"checkDateLe","d":"Check Date Is Lower Or Equal","ed":"Discover if a date is lower or equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-19"},{"n":"date2","r":false,"t":"string","p":"1975-05-20"}]},{"k":"checkDateLeap","d":"Check Date Is Leap Year","ed":"Discover if a date belongs to a leap year","g":"personal","p":[{"n":"date","r":false,"t":"string","p":"2008-05-20"}]},{"k":"checkDateLt","d":"Check Date Is Lower","ed":"Discover if a date is lower","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"getDateNormalized","d":"Get Normalized Date","ed":"Allow to normalize a date, removing non allowed characters","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"20 /01/2018"}]},{"k":"getDateParsed","d":"Get Parsed Datetime","ed":"Parse datetime, without format dependency, into multiple fields","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"20/01/2018"}]},{"k":"checkDateValid","d":"Check Date Is Valid","ed":"Discover if a date has a valid format","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"getDeviceByUa","d":"Get Device By User Agent","ed":"Discover device features by user agent","g":"internet","p":[{"n":"useragent","r":true,"t":"string","p":"AppleTV5,3/9.1.1"}]},{"k":"getDomainBlacklists","d":"Get Domain Blacklists","ed":"Get all blacklists where a domain appears","g":"security","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getUrlByDomain","d":"Get Default URL By Domain","ed":"Get valid, existing and default URL when accessing a domain using a web browser.","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"getDomainByIp","d":"Get Domain By IP","ed":"Get the domain name related with the IP address","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"212.85.34.20"}]},{"k":"getDomainByUrl","d":"Get Root Domain By Web Address","ed":"Get root domain of any web address, removing non needed characters.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io"}]},{"k":"checkDomainCatchall","d":"Check Email Domain Is Catchall","ed":"Check if domain accepts all emails, existing or not","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"abinitio.es"}]},{"k":"checkDomainCertificate","d":"Check Domain Has Valid Certificate","ed":"Check if domain has a valid SSL certificate","g":"internet","p":[{"n":"domain","r":false,"t":"string","p":"uproc.io"}]},{"k":"getDomainCertificate","d":"Get Certificate By Domain","ed":"Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"checkDomainDisposable","d":"Check Email Domain Is Temporary","ed":"Check if domain is temporary or not","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cowstore.org"}]},{"k":"checkDomainExist","d":"Check Domain Exists","ed":"Check if domain exists","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"mydomain.com"}]},{"k":"checkDomainFormat","d":"Check Domain Has Valid Format","ed":"Check if domain has a valid format","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"checkDomainFree","d":"Check Email Domain Is Free","ed":"Check if domain is a free service domain provider","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainIsp","d":"Get ISP By Domain","ed":"Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainLogo","d":"Get Logo By Domain","ed":"Discover logo (favicon) used in domain","g":"image","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"checkDomainMx","d":"Check Domain Has MX Record","ed":"Check if domain has a MX record","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"getUrlPdf","d":"Get Pdf By URL","ed":"Generate a PDF file by URL provided using Chrome browser","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"}]},{"k":"checkDomainRecord","d":"Check Domain Has DNS Record","ed":"Check if domain has a record of that type","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"mydomain.com"},{"n":"type","r":false,"t":"options","p":"A","o":[{"name":"A","value":"A"},{"name":"AAAA","value":"AAAA"},{"name":"CNAME","value":"CNAME"},{"name":"MX","value":"MX"},{"name":"NS","value":"NS"},{"name":"TXT","value":"TXT"}]}]},{"k":"getDomainRecord","d":"Get Domain Record By DNS Type","ed":"Get the domain record by its type","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"},{"n":"type","r":false,"t":"options","p":"A","o":[{"name":"A","value":"A"},{"name":"AAAA","value":"AAAA"},{"name":"CNAME","value":"CNAME"},{"name":"MX","value":"MX"},{"name":"NS","value":"NS"},{"name":"TXT","value":"TXT"}]}]},{"k":"getDomainRecords","d":"Get Domain DNS Records","ed":"Get all domain dns records","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"checkDomainReverse","d":"Check Domain Has IP","ed":"Check if domain has assigned the IP address defined","g":"internet","p":[{"n":"domain","r":false,"t":"string","p":"mail.nova.es"},{"n":"ip","r":true,"t":"string","p":"212.85.34.20"}]},{"k":"getDomainReverseIp","d":"Get IP By Domain","ed":"Get the IPv4 address linked with a domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"www.gmail.com"}]},{"k":"getUrlScreenshot","d":"Get Screenshot By URL","ed":"Generate a screenshot by URL provided using Chrome browser","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"},{"n":"width","r":false,"t":"options","p":"640","o":[{"name":"1024","value":"1024"},{"name":"160","value":"160"},{"name":"320","value":"320"},{"name":"640","value":"640"},{"name":"800","value":"800"}]},{"n":"fullpage","r":false,"t":"options","p":"no","o":[{"name":"No","value":"no"},{"name":"Yes","value":"yes"}]},{"n":"useragent","r":false,"t":"string","p":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36"},{"n":"selector","r":false,"t":"string","p":"h1.mt-4"}]},{"k":"getUrlShareableLinks","d":"Get Shareable Links","ed":"Generates shareable URIs to use on social networks and email using a content URI and a text.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io/"},{"n":"text","r":true,"t":"string","p":"This is an amazing title for my content"}]},{"k":"getDomainTechnologies","d":"Get Technologies By Domain","ed":"Discover client and server technologies used in domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"getUrlTechnologies","d":"Get Technologies By URL","ed":"Discover client and server technologies used in web page","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io/"}]},{"k":"getDomainVisits","d":"Get Visits By Domain","ed":"Get Website visits and rank of any domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainWhois","d":"Get Whois By Domain","ed":"Get the domain whois data by fields","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getIpWhois","d":"Get Whois By IP Address","ed":"Get whois data fields by IP address provided.","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"140.82.118.4"}]},{"k":"sendEmailCustom","d":"Send Custom Email","ed":"Send a custom email (HTML supported) to a recipient","g":"communication","p":[{"n":"email_from","r":true,"t":"string","p":"mcolomer@killia.com"},{"n":"email_to","r":true,"t":"string","p":"mcolomer@gmail.com"},{"n":"subject","r":true,"t":"string","p":"Welcome email"},{"n":"body","r":true,"t":"string","p":"Hi!

Welcome to uProc and start improving your business processes!"}]},{"k":"checkEmailDisposable","d":"Check Email Is Disposable Domain","ed":"Check if email domain belongs to a disposable email service","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"info@jetable.com"}]},{"k":"getEmailDomain","d":"Get Domain By Email","ed":"Get domain part from an email","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailExists","d":"Check Email Exists (Simple)","ed":"Discover if the email recipient exists, returning email status","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailExistsExtended","d":"Check Email Exists (Extended)","ed":"Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getEmailFirstReferences","d":"Get First Web References Of An Email","ed":"Get three first web references of an email published on Internet","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@killia.com"}]},{"k":"getEmailFix","d":"Get Fixed Domain Email","ed":"Fix the email domain of those misspelled emails (supports all domains)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@gmil.com"}]},{"k":"checkEmailFormat","d":"Check Email Has Valid Format","ed":"Check if email has a valid format","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@test.com"}]},{"k":"checkEmailFree","d":"Check Email Is Free","ed":"Check if email belongs to free service provider, like gmail, hotmail, ...","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"info@gmail.com"}]},{"k":"getEmailGdprListByDomain","d":"Get GDPR Emails By Domain","ed":"Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"getEmailListByDomain","d":"Get Emails By Domain","ed":"Get emails list found on internet by domain or URI (similar to hunter.io)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailListByEmail","d":"Get Emails By Email","ed":"Get emails list found on internet by non-free email (similar to hunter.io)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailListInSite","d":"Get Emails In Website","ed":"Get emails list found inside website by domain or URI (similar to hunter.io)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uoc.edu"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailNormalized","d":"Get Normalized Email","ed":"Normalize email address, removing non allowed characters","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test @gmail.com"}]},{"k":"getEmailRecipient","d":"Get Email By Name, Surname And Domain","ed":"Discover an email by company website or domain and prospect's firstname and lastname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":false,"t":"string","p":"Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByCompanyAndFullname","d":"Get Email By Fullname And Company","ed":"Discover an email by company's name and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"company","r":true,"t":"string","p":"uproc"},{"n":"fullname","r":true,"t":"string","p":"Miquel Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByDomainAndFullname","d":"Get Email By Fullname And Domain","ed":"Discover an email by company website or domain and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"fullname","r":true,"t":"string","p":"Miquel Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByProfile","d":"Get Email By Social Network Profile","ed":"Discover an email by contact's LinkedIn profile URI","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getEmailRecipientGdpr","d":"Get Public Email By Name, Surname And Domain (GDPR)","ed":"Discover an email by company website or domain and prospect's firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"firstname","r":true,"t":"string","p":"hello"},{"n":"lastname","r":false,"t":"string","p":""}]},{"k":"getEmailReferences","d":"Get Web References Of An Email","ed":"Get web references of an email published on Internet","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@killia.com"}]},{"k":"checkEmailRole","d":"Check Email Is Role Based","ed":"Check if email belongs to a system or role based account","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@gmail.com"}]},{"k":"sendMobileSms","d":"Send Custom Sms","ed":"Send a custom sms to a recipient with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"},{"n":"text","r":true,"t":"string","p":"Thanks for your participation!"}]},{"k":"checkEmailSmtp","d":"Check Email Has SMTP Server","ed":"Check if email domain has an SMTP server to receive emails","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailSpamtrap","d":"Check Email Is Spam Trap","ed":"Check if email is a spam trap","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"zzzwuzhdgvrxy@yahoo.co.jp"}]},{"k":"getEmailType","d":"Get Email Type","ed":"Get email type","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getFileCopiedBetweenUrls","d":"Get File Copied Between URLs","ed":"Copy file from one URL to another URL","g":"internet","p":[{"n":"source","r":true,"t":"string","p":"http://www.pdf995.com/samples/pdf.pdf"},{"n":"destination","r":true,"t":"string","p":"s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf"}]},{"k":"getFullnameParsed","d":"Get Parsed Fullname","ed":"Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender","g":"personal","p":[{"n":"fullname","r":true,"t":"string","p":"Colomer Salas Miquel"}]},{"k":"getGenderByEmail","d":"Get Gender By Email","ed":"Discover the gender of a person by the email, if person name is included in email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel.colomer@gmail.com"}]},{"k":"getGenderByPersonalName","d":"Get Gender By Name","ed":"Discover the gender of a person or company by name","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Marc"}]},{"k":"checkGenderValid","d":"Check Gender Is Valid","ed":"Discover if a gender value is valid (multilanguage)","g":"personal","p":[{"n":"gender","r":true,"t":"string","p":"male"}]},{"k":"getImageExif","d":"Get EXIF Metadata From Image","ed":"It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg"}]},{"k":"getImageWithText","d":"Get Image With Text","ed":"Generate a new image by URL and text","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg"},{"n":"text","r":true,"t":"string","p":"Hi Miquel!"},{"n":"size","r":false,"t":"string","p":"80"}]},{"k":"getQrDecoded","d":"Get Decoded QR Code","ed":"Get QR Code decoded content by an image URL","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png"}]},{"k":"getQrEncoded","d":"Get Encoded QR Code","ed":"Get QR Code encoded by a text","g":"image","p":[{"n":"text","r":true,"t":"string","p":"Sample text to encode"}]},{"k":"getIpBlacklists","d":"Get Ip Blacklists","ed":"Get all blacklists where an IP address appears","g":"security","p":[{"n":"ip","r":true,"t":"string","p":"172.217.168.165"}]},{"k":"getLinkedinConnections","d":"Get LinkedIn Last Received Connections","ed":"Extract last 80 connections from your LinkedIn profile","g":"communication","p":[{"n":"list","r":false,"t":"string","p":"last-connections"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]}]},{"k":"getLinkedinGroupMembers","d":"Get LinkedIn Group Members","ed":"Get members in a LinkedIn group","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/groups/59923/members/"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinInvitations","d":"Get LinkedIn Last Sent Invitations","ed":"Extract last 80 invitations sent from your LinkedIn","g":"communication","p":[{"n":"list","r":false,"t":"string","p":"last-invitations"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]}]},{"k":"getLinkedinPostComments","d":"Get LinkedIn Post Comments","ed":"Get users who comment a post on LinkedIn","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinPostLikes","d":"Get LinkedIn Post Likes","ed":"Get users who like a post on LinkedIn","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinProfile","d":"Get LinkedIn Profile","ed":"Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"list","r":false,"t":"string","p":"my-list"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"},{"name":"Slow","value":"slow"}]}]},{"k":"checkLinkedinProfileIsContact","d":"Check LinkedIn Profile Is Contact","ed":"Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getLinkedinProfiles","d":"Get LinkedIn Profiles","ed":"Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona"},{"n":"list","r":false,"t":"string","p":"my-list"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]},{"n":"amount","r":false,"t":"string","p":"10"}]},{"k":"getLinkedinProfilesByCompany","d":"Get LinkedIn Company Employees","ed":"Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/company/ibm/"},{"n":"list","r":false,"t":"string","p":"employees"}]},{"k":"getLinkedinProfilesByContent","d":"Get LinkedIn Profiles By Content","ed":"Extract fastly last profiles that have published content on LinkedIn by specific keywords","g":"communication","p":[{"n":"keywords","r":false,"t":"string","p":"Growth"},{"n":"list","r":false,"t":"string","p":"content"}]},{"k":"sendLinkedinVisit","d":"Send LinkedIn Profile Visit","ed":"Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas/"}]},{"k":"checkListContains","d":"Check List Contains","ed":"Check if the list contains a specific item","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"2"}]},{"k":"checkListEnds","d":"Check List Ends With","ed":"Check if the list ends with a specific element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"3"}]},{"k":"checkListLengthBetw","d":"Check Length List Between","ed":"Check if the length of a list is between two quantities","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length1","r":true,"t":"number","p":"3"},{"n":"length2","r":true,"t":"number","p":"4"}]},{"k":"checkListLengthEq","d":"Check Length List Equal","ed":"Checks if the length of a list equals a specified quantity","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthGe","d":"Check Length List Greater Or Equal","ed":"Check if the length of a list is greater than or equal to a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthGt","d":"Check Length List Greater","ed":"Check if the length of a list is greater than a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"2"}]},{"k":"checkListLengthLe","d":"Check Length List Lower Or Equal","ed":"Check if the length of a list is less than or equal to a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthLt","d":"Check Length List Lower","ed":"","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkListMax","d":"Check Greater Element","ed":"Checks if the largest item in a list matches the provided item","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,4,8,3,4,5"},{"n":"number","r":true,"t":"string","p":"8"}]},{"k":"getListMax","d":"Get Greater Element","ed":"Returns the largest item in a list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListMin","d":"Check Lower Element","ed":"Checks if the smallest element in a list matches the provided element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"5,6,1,3,7"},{"n":"number","r":true,"t":"string","p":"1"}]},{"k":"getListMin","d":"Get Lower Element","ed":"Returns the smallest item in a list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"getListSort","d":"Get Sorted List","ed":"Returns an ascending sorted list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListSorted","d":"Check List Is Sorted","ed":"Check if a list is sorted in ascending order","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3,4,5"}]},{"k":"checkListStarts","d":"Check List Starts With","ed":"Check if the list starts with a specific element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"1"}]},{"k":"checkListUnique","d":"Check Unique Es List","ed":"Check if a list consists of unique elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3,4,5"}]},{"k":"getListUnique","d":"Get Unique List","ed":"Returns a single list, with no repeating elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListValid","d":"Check Valid List","ed":"Check if the supplied values ​​form a valid list of elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"separator","r":true,"t":"string","p":","}]},{"k":"getLocaleByIp","d":"Get Locale Data By IP","ed":"Discover locale data (currency, language) by ipv4 or ipv6 address.","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationByCoordinates","d":"Get Location By Coordinates","ed":"Discover the city name, zipcode, province or country by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.619206,2.2920828"}]},{"k":"getLocationByIp","d":"Get Location By IP","ed":"Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getReputationByIp","d":"Get Reputation By IP","ed":"Discover reputation by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getTimeByIp","d":"Get Time Data By IP","ed":"Discover datetime data by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationByName","d":"Get Location By Name","ed":"Discover location data by name","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."}]},{"k":"getLocationByPhone","d":"Get Location By Landline Phone (ES)","ed":"Discover the city and the province from a landline phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"848491812"}]},{"k":"getLocationByZipcode","d":"Get Location By Zipcode (ES)","ed":"Discover the city and the province from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getLocationExtendedByIp","d":"Get Extended Location By IP","ed":"Discover geographical, company, timezone and reputation data by IPv4 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationGeocodedByIp","d":"Get Geocoded Location By IP","ed":"Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationListByName","d":"Get Locations By Name","ed":"Get most relevants locations by name (Google Maps typical search)","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Pintores Granollers"}]},{"k":"getLocationListByParams","d":"Get Locations By Parameters","ed":"Get most relevants locations by name, category, location and radius","g":"geographic","p":[{"n":"name","r":false,"t":"string","p":"Saba"},{"n":"category","r":false,"t":"options","p":"parking","o":[{"name":"Accounting","value":"accounting"},{"name":"Airport","value":"airport"},{"name":"Amusement_park","value":"amusement_park"},{"name":"Aquarium","value":"aquarium"},{"name":"Art_gallery","value":"art_gallery"},{"name":"Atm","value":"atm"},{"name":"Bakery","value":"bakery"},{"name":"Bank","value":"bank"},{"name":"Bar","value":"bar"},{"name":"Beauty_salon","value":"beauty_salon"},{"name":"Bicycle_store","value":"bicycle_store"},{"name":"Book_store","value":"book_store"},{"name":"Bowling_alley","value":"bowling_alley"},{"name":"Bus_station","value":"bus_station"},{"name":"Cafe","value":"cafe"},{"name":"Campground","value":"campground"},{"name":"Car_dealer","value":"car_dealer"},{"name":"Car_rental","value":"car_rental"},{"name":"Car_repair","value":"car_repair"},{"name":"Car_wash","value":"car_wash"},{"name":"Casino","value":"casino"},{"name":"Cemetery","value":"cemetery"},{"name":"Church","value":"church"},{"name":"City_hall","value":"city_hall"},{"name":"Clothing_store","value":"clothing_store"},{"name":"Convenience_store","value":"convenience_store"},{"name":"Courthouse","value":"courthouse"},{"name":"Dentist","value":"dentist"},{"name":"Department_store","value":"department_store"},{"name":"Doctor","value":"doctor"},{"name":"Electrician","value":"electrician"},{"name":"Electronics_store","value":"electronics_store"},{"name":"Embassy","value":"embassy"},{"name":"Establishment","value":"establishment"},{"name":"Finance","value":"finance"},{"name":"Fire_station","value":"fire_station"},{"name":"Florist","value":"florist"},{"name":"Food","value":"food"},{"name":"Funeral_home","value":"funeral_home"},{"name":"Furniture_store","value":"furniture_store"},{"name":"Gas_station","value":"gas_station"},{"name":"General_contractor","value":"general_contractor"},{"name":"Grocery_or_supermarket","value":"grocery_or_supermarket"},{"name":"Gym","value":"gym"},{"name":"Hair_care","value":"hair_care"},{"name":"Hardware_store","value":"hardware_store"},{"name":"Health","value":"health"},{"name":"Hindu_temple","value":"hindu_temple"},{"name":"Home_goods_store","value":"home_goods_store"},{"name":"Hospital","value":"hospital"},{"name":"Insurance_agency","value":"insurance_agency"},{"name":"Jewelry_store","value":"jewelry_store"},{"name":"Laundry","value":"laundry"},{"name":"Lawyer","value":"lawyer"},{"name":"Library","value":"library"},{"name":"Liquor_store","value":"liquor_store"},{"name":"Local_government_office","value":"local_government_office"},{"name":"Locksmith","value":"locksmith"},{"name":"Lodging","value":"lodging"},{"name":"Meal_delivery","value":"meal_delivery"},{"name":"Meal_takeaway","value":"meal_takeaway"},{"name":"Mosque","value":"mosque"},{"name":"Movie_rental","value":"movie_rental"},{"name":"Movie_theater","value":"movie_theater"},{"name":"Moving_location","value":"moving_location"},{"name":"Museum","value":"museum"},{"name":"Night_club","value":"night_club"},{"name":"Painter","value":"painter"},{"name":"Park","value":"park"},{"name":"Parking","value":"parking"},{"name":"Pet_store","value":"pet_store"},{"name":"Pharmacy","value":"pharmacy"},{"name":"Physiotherapist","value":"physiotherapist"},{"name":"Place_of_worship","value":"place_of_worship"},{"name":"Plumber","value":"plumber"},{"name":"Police","value":"police"},{"name":"Post_office","value":"post_office"},{"name":"Real_estate_agency","value":"real_estate_agency"},{"name":"Restaurant","value":"restaurant"},{"name":"Roofing_contractor","value":"roofing_contractor"},{"name":"Rv_park","value":"rv_park"},{"name":"School","value":"school"},{"name":"Shoe_store","value":"shoe_store"},{"name":"Shopping_mall","value":"shopping_mall"},{"name":"Spa","value":"spa"},{"name":"Stadium","value":"stadium"},{"name":"Storage","value":"storage"},{"name":"Store","value":"store"},{"name":"Subway_station","value":"subway_station"},{"name":"Synagogue","value":"synagogue"},{"name":"Taxi_stand","value":"taxi_stand"},{"name":"Train_station","value":"train_station"},{"name":"Transit_station","value":"transit_station"},{"name":"Travel_agency","value":"travel_agency"},{"name":"University","value":"university"},{"name":"Veterinary_care","value":"veterinary_care"},{"name":"Zoo","value":"zoo"}]},{"n":"location","r":true,"t":"string","p":"41.3851,2.1734"},{"n":"radius","r":false,"t":"string","p":"250"}]},{"k":"checkMobileAlive","d":"Check Mobile Is Alive","ed":"Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don't return if mobile is alive (like Vodafone)","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileCountryCode","d":"Get Country ISO Code By Mobile","ed":"Allow to get country code (two chars) of a mobile phone number with international format","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileCountryPrefix","d":"Get Phone Prefix By Country ISO Code","ed":"Allow to get country prefix number by country code (2 characters)","g":"communication","p":[{"n":"country","r":true,"t":"string","p":"ES"}]},{"k":"checkMobileExist","d":"Check Mobile Exists","ed":"Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with \"Mobile lookup\" tool.","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileFormat","d":"Check Mobile Has Valid Format","ed":"Discover if mobile phone number has a valid format, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34623123213"},{"n":"country","r":true,"t":"string","p":"ES"}]},{"k":"checkMobileFormatEs","d":"Check Mobile Has Valid Format (ES)","ed":"Discover if mobile phone number has a valid format (only Spain)","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"623123213"}]},{"k":"getMobileFormatted","d":"Get Formatted Mobile","ed":"Format international mobile number by country ISO code (2 letters).","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"getMobileHlrLookup","d":"Get HLR Mobile Lookup","ed":"Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileImei","d":"Check Imei Is Valid","ed":"Discover if Imei number has a valid format","g":"communication","p":[{"n":"imei","r":true,"t":"string","p":"490154203237518"}]},{"k":"getMobileLookup","d":"Get Mobile Lookup","ed":"Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileMnpLookup","d":"Get Mobile Portability Lookup","ed":"Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileNormalized","d":"Get Normalized Mobile","ed":"Allow to normalize a mobile phone, removing non allowed characters","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34 62318 2 770"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"getMobileOrPhoneLookupEs","d":"Get Mobile/Landline Lookup (Spain)","ed":"Discover if mobile or landline prefix exists on Spain.","g":"communication","p":[{"n":"number","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileOrPhoneMnpEs","d":"Get Landline/Mobile Portability Lookup (ES)","ed":"Get portability data about a landline or mobile number, only for Spain","g":"communication","p":[{"n":"number","r":true,"t":"string","p":"605281220"}]},{"k":"checkMobileSms","d":"Check Mobile Supports Sms","ed":"Discover if a mobile number can receive sms, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileValidPrefix","d":"Check Mobile Has Valid Prefix","ed":"Discover if mobile phone number has a valid prefix, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileValidPrefixEs","d":"Check Mobile Has Valid Prefix (ES)","ed":"Discover if spanish mobile phone number has a valid prefix","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"605281220"}]},{"k":"getNameByPrefix","d":"Get Name By Prefix (ES)","ed":"Get first personal name matching by prefix and gender from INE data source (only Spain)","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Marce"},{"n":"gender","r":false,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]}]},{"k":"checkNameExist","d":"Check Name Exists (ES)","ed":"Check if a personal name exists in INE data source (only Spain)","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Juan"}]},{"k":"getNameListByPrefix","d":"Get Names By Prefix","ed":"Get multiple personal names by prefix","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Marce"},{"n":"gender","r":false,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]}]},{"k":"getNameNormalized","d":"Get Normalized Name","ed":"Normalize name removing non allowed characters","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"M4rc"}]},{"k":"checkNameValid","d":"Check Name Has Valid Format","ed":"Check if name contains accepted characters","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getUrlAnalysis","d":"Get URL Analysis","ed":"Analyze URL's health status about SSL, broken links, conflictive HTTP links with SSL, and more.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"}]},{"k":"getNetAton","d":"Get Number By IP","ed":"Convert an IP address to numeric notation","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"62.12.22.11"}]},{"k":"getNetByIp","d":"Get Network By IP","ed":"Discover network data by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"checkUrlContains","d":"Check URL Contains","ed":"Check if an URL contains string or regular expression (case insensitive)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"},{"n":"regex","r":true,"t":"string","p":"uProc"}]},{"k":"getUrlContents","d":"Get Contents From URL","ed":"Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf"},{"n":"selector","r":false,"t":"string","p":"emails"}]},{"k":"getUrlContentsParsed","d":"Get Parsed Contents From URL","ed":"Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.bing.com/search?q=killia+technologies"}]},{"k":"getUrlDecode","d":"Get Decoded URL","ed":"Decode URL to recover original","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https%3A%2F%2Fgoogle.es"}]},{"k":"getUrlEncode","d":"Get Encoded URL","ed":"Encode URL to avoid problems","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://google.com"}]},{"k":"checkUrlExist","d":"Check URL Exists","ed":"Check if an URL exists","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://www.google.com"}]},{"k":"getNetFixip","d":"Get Fixed IP","ed":"Fix an IP address to the right format","g":"internet","p":[{"n":"number","r":true,"t":"string","p":"212169160147"}]},{"k":"checkNetHostAlive","d":"Check Host Is Up","ed":"Discover if a computer is switched on","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"www.google.es"}]},{"k":"checkStringIp","d":"Check IP Has Valid Format","ed":"Check if IPv4 or IPv6 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"23.45.57.123"}]},{"k":"checkStringIp4","d":"Check IPv4 Has Valid Format","ed":"Check if IPv4 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"127.0.0.1"}]},{"k":"checkStringIp6","d":"Check IPv6 Has Valid Format","ed":"Check if IPv6 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"2a01:c50e:3544:bd00:4df0:7609:251a:f6d0"}]},{"k":"getUrlListContentsParsed","d":"Get Parsed Contents From Results URL","ed":"Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.bing.com/search?q=killia+technologies"}]},{"k":"getNetNtoa","d":"Get IP By Number","ed":"Convert a number to an IP address","g":"internet","p":[{"n":"number","r":true,"t":"string","p":"1501706957"}]},{"k":"getUrlParsed","d":"Get Parsed URL","ed":"Decode URL into multiple fields","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf"}]},{"k":"getNetScan","d":"Get Opened Ports In Host","ed":"Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"google.es"}]},{"k":"checkNetServiceUp","d":"Check Service Is Up","ed":"Discover if a service in a port is available","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"www.google.com"},{"n":"port","r":true,"t":"string","p":"80"}]},{"k":"getUrlTables","d":"Get Table From URL","ed":"Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2"},{"n":"table","r":false,"t":"string","p":"3"}]},{"k":"checkUrlValid","d":"Check URL Is Valid","ed":"Check that an URL has a valid format","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://www.google.com"}]},{"k":"checkNumberBetw","d":"Check Number Is Between","ed":"Check if number is between two values","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"21"},{"n":"number3","r":true,"t":"string","p":"24"}]},{"k":"checkNumberDecimal","d":"Check Decimal Number Is Valid","ed":"Check if value is a decimal number","p":[{"n":"number","r":true,"t":"string","p":"0.23"}]},{"k":"checkNumberEq","d":"Check Number Is Equal","ed":"Check if number is equal to another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberEven","d":"Check Even Number Is Valid","ed":"Check if number is even","p":[{"n":"number","r":true,"t":"string","p":"2"}]},{"k":"checkNumberGe","d":"Check Number Is Greater Or Equal","ed":"Check if number is greater or equal than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberGt","d":"Check Number Is Greater","ed":"Check if number is greater than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"22"}]},{"k":"checkNumberLe","d":"Check Number Is Lower Or Equal","ed":"Check if number is lower or equal than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberLt","d":"Check Number Is Lower","ed":"Check if number is lower than another","p":[{"n":"number1","r":true,"t":"string","p":"22"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberLuhn","d":"Check Luhn Number Is Valid","ed":"Check if it a valid Luhn number","g":"security","p":[{"n":"luhn","r":true,"t":"string","p":"79927398713"}]},{"k":"checkNumberMod","d":"Check Modulus Is Equals","ed":"Check if modulus between two numbers is equal to a value","p":[{"n":"number","r":true,"t":"string","p":"10"},{"n":"mod","r":true,"t":"string","p":"2"},{"n":"rest","r":true,"t":"string","p":"0"}]},{"k":"checkNumberNatural","d":"Check Natural Number Is Valid","ed":"Check if value is a natural number","p":[{"n":"number","r":true,"t":"string","p":"0"}]},{"k":"checkStringNumeric","d":"Check Numeric String Is Valid","ed":"Check if string length contains only numbers","g":"text","p":[{"n":"text","r":true,"t":"string","p":"123"}]},{"k":"checkNumberOdd","d":"Check Odd Number Is Valid","ed":"Check if number is odd","p":[{"n":"number","r":true,"t":"string","p":"3"}]},{"k":"checkNumberPrime","d":"Check Prime Number Is Valid","ed":"Check if number is prime","p":[{"n":"number","r":true,"t":"string","p":"11"}]},{"k":"checkPasswordStrong","d":"Check Password Is Strong","ed":"Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters","g":"security","p":[{"n":"password","r":true,"t":"string","p":"1agdA*$#"}]},{"k":"getPersonByEmail","d":"Get Person By Email","ed":"Get personal data by email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getPersonByFirstnameLastnameCompanyLocation","d":"Get Person By Firstname, Lastname, Company And Location","ed":"Get personal data by firstname, lastname, company and location","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":true,"t":"string","p":"Colomer"},{"n":"company","r":false,"t":"string","p":"uProc"},{"n":"location","r":false,"t":"string","p":""}]},{"k":"getPersonByMobile","d":"Get Person By Mobile","ed":"Get personal data by mobile","g":"personal","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"sendPersonEmailToList","d":"Send Email's Contact To List","ed":"Add a contact email to a person list","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getPersonExtendedByEmail","d":"Get Person (Extended) By Email","ed":"Get prospect's contact data and company's location and social data by email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getPersonExtendedByEmailAndCompany","d":"Get Person (Extended) By Email And Company","ed":"Get contact, location and social data by email and company name and location","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"company","r":false,"t":"string","p":"uProc"}]},{"k":"getPersonFakedData","d":"Get Random Person Data","ed":"Generates random fake data","g":"personal","p":[{"n":"locality","r":true,"t":"options","p":"English","o":[{"name":"Australia (English)","value":"Australia (English)"},{"name":"Australia Ocker (English)","value":"Australia Ocker (English)"},{"name":"Azerbaijani","value":"Azerbaijani"},{"name":"Bork (English)","value":"Bork (English)"},{"name":"Canada (English)","value":"Canada (English)"},{"name":"Canada (French)","value":"Canada (French)"},{"name":"Chinese","value":"Chinese"},{"name":"Chinese (Taiwan)","value":"Chinese (Taiwan)"},{"name":"Czech","value":"Czech"},{"name":"Dutch","value":"Dutch"},{"name":"English","value":"English"},{"name":"Farsi","value":"Farsi"},{"name":"French","value":"French"},{"name":"Georgian","value":"Georgian"},{"name":"German","value":"German"},{"name":"German (Austria)","value":"German (Austria)"},{"name":"German (Switzerland)","value":"German (Switzerland)"},{"name":"Great Britain (English)","value":"Great Britain (English)"},{"name":"India (English)","value":"India (English)"},{"name":"Indonesia","value":"Indonesia"},{"name":"Ireland (English)","value":"Ireland (English)"},{"name":"Italian","value":"Italian"},{"name":"Japanese","value":"Japanese"},{"name":"Korean","value":"Korean"},{"name":"Nepalese","value":"Nepalese"},{"name":"Norwegian","value":"Norwegian"},{"name":"Polish","value":"Polish"},{"name":"Portuguese (Brazil)","value":"Portuguese (Brazil)"},{"name":"Russian","value":"Russian"},{"name":"Slovakian","value":"Slovakian"},{"name":"Spanish","value":"Spanish"},{"name":"Spanish Mexico","value":"Spanish Mexico"},{"name":"Swedish","value":"Swedish"},{"name":"Turkish","value":"Turkish"},{"name":"Ukrainian","value":"Ukrainian"},{"name":"United States (English)","value":"United States (English)"},{"name":"Vietnamese","value":"Vietnamese"}]}]},{"k":"getProfileByEmployeeData","d":"Get LinkedIn URI By First, Last And Company","ed":"Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":true,"t":"string","p":"Colomer"},{"n":"company","r":true,"t":"string","p":"uProc"}]},{"k":"getSurnameByPrefix","d":"Get Surname By Prefix (ES)","ed":"Get first personal surname matching by prefix from INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Col"}]},{"k":"checkSurnameExist","d":"Check Surname Is Valid (ES)","ed":"Check if a personal surname appears in INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getProfileLinkedinByEmail","d":"Get LinkedIn URI By Email","ed":"Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getSurnameListByPrefix","d":"Get Surnames By Prefix (ES)","ed":"Get personal surnames matching by prefix from INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Co"}]},{"k":"getSurnameNormalized","d":"Get Normalized Surname","ed":"Normalize surname","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"C0lomer"}]},{"k":"getProfileTwitterByEmployeeData","d":"Get Twitter URI By First, Last And Company","ed":"Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Carlos"},{"n":"lastname","r":true,"t":"string","p":"Blanco"},{"n":"company","r":true,"t":"string","p":"Encomenda"}]},{"k":"checkSurnameValid","d":"Check Surname Has Valid Format","ed":"Check if surname contains accepted characters","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getProfileXingByEmployeeData","d":"Get Xing URI By First, Last And Company","ed":"Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"David"},{"n":"lastname","r":true,"t":"string","p":"Tomás"},{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPhoneFixed","d":"Get Fixed Phone","ed":"Fix the international prefix of a phone based on the ISO code of a country","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"+1605281220"},{"n":"country","r":true,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneFormat","d":"Check Valid Phone Format By Country","ed":"Allow to discover if landline number has a good international format, depending on country ","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"},{"n":"country","r":true,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneFormatEs","d":"Check Valid Phone Format (ES)","ed":"Discover if landline phone number is valid, with Spain coverage","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"932187670"}]},{"k":"getPhoneNormalized","d":"Get Cleaned Phone","ed":"Clean a phone removing non allowed characters","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"3493218 767o"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneOrMobileValid","d":"Check Phone Or Mobile Valid","ed":"Discover if landline or mobile number has a valid prefix","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getPhoneParsed","d":"Get Parsed And Validated Phone","ed":"Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked)","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"}]},{"k":"checkPhoneValidPrefix","d":"Check Valid Phone Prefix","ed":"Discover if a landline phone number prefix exists, with worldwide coverage","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"}]},{"k":"getProvinceByIp","d":"Get Province By IP","ed":"Discover the province name from an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getProvinceByName","d":"Get Province By Name (ES)","ed":"You can get the first province by a name prefix (only Spain)","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"B"}]},{"k":"getProvinceByPhone","d":"Get Province By Phone (ES)","ed":"Discover the province name from a landline phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932"}]},{"k":"getProvinceByZipcode","d":"Get Province By Zipcode (ES)","ed":"Discover the province name from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08"}]},{"k":"getProvinceListByName","d":"Get Provinces By Name (ES)","ed":"You can get a province list by a name prefix (only Spain)","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"B"}]},{"k":"getProvinceListByPhone","d":"Get Provinces By Phone (ES)","ed":"You can get a province list by a phone prefix (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932"}]},{"k":"getProvinceListByZipcode","d":"Get Provinces By Zipcode (ES)","ed":"You can get a province list by a zipcode prefix, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"0"}]},{"k":"getProvinceNormalized","d":"Get Normalized Province","ed":"Allow to normalize a province, removing non allowed characters","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"Barce lona"}]},{"k":"checkRobinsonEmailExist","d":"Check Email Is Robinson (ES)","ed":"Discover if an email exists in the Robinson list (only Spain)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"manzaned@uvigo.es"}]},{"k":"checkRobinsonNifExist","d":"Check Nif Number Is Robinson (ES)","ed":"Discover if an nif exists in the Robinson list (only Spain)","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"00002206K"}]},{"k":"checkRobinsonPhoneExist","d":"Check Phone Is Robinson (ES)","ed":"Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"917156252"}]},{"k":"getSentimentByText","d":"Get Sentiment From A Text","ed":"It allows to analyze an english text with Emojis and detect sentiment","g":"text","p":[{"n":"text","r":true,"t":"string","p":"I am very happy"}]},{"k":"checkSocialDomainExist","d":"Check Domain Has Social Activity","ed":"Discover if a domain has social network presence","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getSocialDomainLookup","d":"Get Social Networks By Domain","ed":"Discover if a domain or a website has social activity and returns all social network profiles found","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getSocialDomainParsed","d":"Get Social Networks Activity By Domain","ed":"Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"checkSocialEmailExist","d":"Check Email Has Social Activity","ed":"Discover if the email has social network presence","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@gmail.com"}]},{"k":"getSocialEmailLookup","d":"Get Social Networks By Email","ed":"Discover if an email has social activity, and get all social network profiles found","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkSocialMobileExist","d":"Check Mobile Has Social Activity","ed":"Discover if the mobile phone has social network presence","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getSocialMobileLookup","d":"Get Social Networks By Mobile","ed":"Discover if an mobile phone has social activity, and get all social network profiles found","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getSocialUriParsed","d":"Get Social Network Activity","ed":"This tools parses a social uri address and extracts any available indicators","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.facebook.com/uprocdataquality"}]},{"k":"checkStringAlpha","d":"Check Alphabetic String Is Valid","ed":"Check if string length contains only letters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"asc"}]},{"k":"checkStringAlphanumeric","d":"Check Alphanumeric String Is Valid","ed":"Check if string length contains only numbers and letters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"aa11"}]},{"k":"getStringBase64","d":"Get BASE64 Value","ed":"Convert a string to a BASE64 encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"checkStringBlank","d":"Check String Is Empty","ed":"Check if string has no content","g":"text","p":[{"n":"text","r":true,"t":"string","p":""}]},{"k":"checkStringBoolean","d":"Check Boolean String Is Valid","ed":"Check if string is true or false","g":"text","p":[{"n":"text","r":true,"t":"string","p":"true"}]},{"k":"getStringByFormat","d":"Get Formatted String By Pattern","ed":"It allows to format a string using a format pattern","g":"text","p":[{"n":"text","r":true,"t":"string","p":"1122"},{"n":"format","r":true,"t":"string","p":"%09d"}]},{"k":"getStringByRegex","d":"Get Generated Text By Pattern","ed":"Generate a random string using a regular expression as a pattern","g":"text","p":[{"n":"regex","r":true,"t":"string","p":"[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*"}]},{"k":"checkStringContains","d":"Check String Contains Char","ed":"Check if string contains a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"checkStringEnds","d":"Check String Ends With","ed":"Check if string ends with a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"getStringFieldName","d":"Get Field Type By Value","ed":"Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address","g":"text","p":[{"n":"text","r":true,"t":"string","p":"myemail@mydomain.com"}]},{"k":"getStringJoin","d":"Get Merged Values By Text","ed":"Join a character or string to join two values","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"hi"},{"n":"text2","r":true,"t":"string","p":"good morning!"},{"n":"glue","r":true,"t":"string","p":","}]},{"k":"getStringLength","d":"Get String Length","ed":"Get length of a string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"checkStringLengthBetw","d":"Check String Length Is Between","ed":"Check if string length is between two numbers","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length1","r":true,"t":"number","p":"3"},{"n":"length2","r":true,"t":"number","p":"5"}]},{"k":"checkStringLengthEq","d":"Check String Length Is Equal","ed":"Check if string length is equal to number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthGe","d":"Check String Length Is Greater Or Equal","ed":"Check if string length is greater or equal than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthGt","d":"Check String Length Is Greater","ed":"Check if string length is greater than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkStringLengthLe","d":"Check String Length Is Lower Or Equal","ed":"Check if string length is lower or equal than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthLt","d":"Check String Length Is Lower","ed":"Check if string length is lower than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"5"}]},{"k":"checkStringLowercase","d":"Check Text Is Lowercased","ed":"Check if string only contains lowercase characters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"aaa"}]},{"k":"getStringLowercase","d":"Get Lowercased Text","ed":"Convert all letters found in a string to lowercase","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"getStringMd5","d":"Get MD5 String","ed":"Convert a string to a MD5 encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"getStringNormalized","d":"Get Normalized String By Field","ed":"Normalize a string depending on the field name","g":"text","p":[{"n":"field","r":true,"t":"options","p":"name","o":[{"name":"Alphabetic","value":"alphabetic"},{"name":"Alphanumeric","value":"alphanumeric"},{"name":"Cif","value":"cif"},{"name":"City","value":"city"},{"name":"Country","value":"country"},{"name":"Date","value":"date"},{"name":"Decimal","value":"decimal"},{"name":"Dni","value":"dni"},{"name":"Domain","value":"domain"},{"name":"Email","value":"email"},{"name":"Gender","value":"gender"},{"name":"Integer","value":"integer"},{"name":"Ip","value":"ip"},{"name":"Mobile","value":"mobile"},{"name":"Name","value":"name"},{"name":"Nie","value":"nie"},{"name":"Nif","value":"nif"},{"name":"Phone","value":"phone"},{"name":"Province","value":"province"},{"name":"Zipcode","value":"zipcode"}]},{"n":"text","r":true,"t":"string","p":"JMª Gº.Fco.gtez. Gro."}]},{"k":"getStringParsed","d":"Get Parsed Text","ed":"Analyze string and return all emails, phones, zipcodes and links detected","g":"text","p":[{"n":"text","r":true,"t":"string","p":"My email is miquel@uproc.io and my phone is 34605281220"}]},{"k":"checkStringRandom","d":"Check String Is Random","ed":"Check if string contains random characters without sense","g":"text","p":[{"n":"text","r":true,"t":"string","p":"t2 chhsdfitoixcv"}]},{"k":"checkStringRegex","d":"Check String Is Valid By Pattern","ed":"Check if string contains a value that matches with a regular expression","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"regex","r":true,"t":"string","p":"^test$"}]},{"k":"getStringReplaceAll","d":"Get Texts Replaced By String","ed":"Replace all values found in a string by another","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"find","r":true,"t":"string","p":"o"},{"n":"replace","r":true,"t":"string","p":"u"}]},{"k":"getStringReplaceFirst","d":"Get Text Replaced By String","ed":"Replace first value found in a string by another","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"find","r":true,"t":"string","p":"o"},{"n":"replace","r":true,"t":"string","p":"u"}]},{"k":"getStringSha","d":"Get SHA String","ed":"Convert a string to a SHA encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"getStringSplit","d":"Get Splitted Values By Separator","ed":"Split a value in two parts, using a separator present in the original string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Texto largo, separado por coma"},{"n":"separator","r":true,"t":"string","p":","}]},{"k":"getStringSplitAndJoin","d":"Get Splitted And Merged Values By Separator","ed":"Split a value in two parts and join them, using a separator present in the original string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"separator","r":true,"t":"string","p":","},{"n":"glue","r":true,"t":"string","p":";"}]},{"k":"checkStringStarts","d":"Check String Starts With","ed":"Check if string starts with a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"getStringTranslated","d":"Get Translated Text","ed":"It allows to translate a text to any language","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, my name is Mike"},{"n":"language","r":true,"t":"options","p":"Spanish","o":[{"name":"Afrikaans","value":"Afrikaans"},{"name":"Albanian","value":"Albanian"},{"name":"Amharic","value":"Amharic"},{"name":"Arabic","value":"Arabic"},{"name":"Armenian","value":"Armenian"},{"name":"Azeerbaijani","value":"Azeerbaijani"},{"name":"Basque","value":"Basque"},{"name":"Belarusian","value":"Belarusian"},{"name":"Bengali","value":"Bengali"},{"name":"Bosnian","value":"Bosnian"},{"name":"Bulgarian","value":"Bulgarian"},{"name":"Catalan","value":"Catalan"},{"name":"Cebuano","value":"Cebuano"},{"name":"Chinese (Simplified)","value":"Chinese (Simplified)"},{"name":"Chinese (Traditional)","value":"Chinese (Traditional)"},{"name":"Corsican","value":"Corsican"},{"name":"Croatian","value":"Croatian"},{"name":"Czech","value":"Czech"},{"name":"Danish","value":"Danish"},{"name":"Dutch","value":"Dutch"},{"name":"English","value":"English"},{"name":"Esperanto","value":"Esperanto"},{"name":"Estonian","value":"Estonian"},{"name":"Finnish","value":"Finnish"},{"name":"French","value":"French"},{"name":"Frisian","value":"Frisian"},{"name":"Galician","value":"Galician"},{"name":"Georgian","value":"Georgian"},{"name":"German","value":"German"},{"name":"Greek","value":"Greek"},{"name":"Gujarati","value":"Gujarati"},{"name":"Haitian Creole","value":"Haitian Creole"},{"name":"Hausa","value":"Hausa"},{"name":"Hawaiian","value":"Hawaiian"},{"name":"Hebrew","value":"Hebrew"},{"name":"Hindi","value":"Hindi"},{"name":"Hmong","value":"Hmong"},{"name":"Hungarian","value":"Hungarian"},{"name":"Icelandic","value":"Icelandic"},{"name":"Igbo","value":"Igbo"},{"name":"Indonesian","value":"Indonesian"},{"name":"Irish","value":"Irish"},{"name":"Italian","value":"Italian"},{"name":"Japanese","value":"Japanese"},{"name":"Javanese","value":"Javanese"},{"name":"Kannada","value":"Kannada"},{"name":"Kazakh","value":"Kazakh"},{"name":"Khmer","value":"Khmer"},{"name":"Korean","value":"Korean"},{"name":"Kurdish","value":"Kurdish"},{"name":"Kyrgyz","value":"Kyrgyz"},{"name":"Lao","value":"Lao"},{"name":"Latin","value":"Latin"},{"name":"Latvian","value":"Latvian"},{"name":"Lithuanian","value":"Lithuanian"},{"name":"Luxembourgish","value":"Luxembourgish"},{"name":"Macedonian","value":"Macedonian"},{"name":"Malagasy","value":"Malagasy"},{"name":"Malay","value":"Malay"},{"name":"Malayalam","value":"Malayalam"},{"name":"Maltese","value":"Maltese"},{"name":"Maori","value":"Maori"},{"name":"Marathi","value":"Marathi"},{"name":"Mongolian","value":"Mongolian"},{"name":"Myanmar (Burmese)","value":"Myanmar (Burmese)"},{"name":"Nepali","value":"Nepali"},{"name":"Norwegian","value":"Norwegian"},{"name":"Nyanja (Chichewa)","value":"Nyanja (Chichewa)"},{"name":"Pashto","value":"Pashto"},{"name":"Persian","value":"Persian"},{"name":"Polish","value":"Polish"},{"name":"Portuguese (Portugal, Brazil)","value":"Portuguese (Portugal, Brazil)"},{"name":"Punjabi","value":"Punjabi"},{"name":"Romanian","value":"Romanian"},{"name":"Russian","value":"Russian"},{"name":"Samoan","value":"Samoan"},{"name":"Scots Gaelic","value":"Scots Gaelic"},{"name":"Serbian","value":"Serbian"},{"name":"Sesotho","value":"Sesotho"},{"name":"Shona","value":"Shona"},{"name":"Sindhi","value":"Sindhi"},{"name":"Sinhala (Sinhalese)","value":"Sinhala (Sinhalese)"},{"name":"Slovak","value":"Slovak"},{"name":"Slovenian","value":"Slovenian"},{"name":"Somali","value":"Somali"},{"name":"Spanish","value":"Spanish"},{"name":"Sundanese","value":"Sundanese"},{"name":"Swahili","value":"Swahili"},{"name":"Swedish","value":"Swedish"},{"name":"Tagalog (Filipino)","value":"Tagalog (Filipino)"},{"name":"Tajik","value":"Tajik"},{"name":"Tamil","value":"Tamil"},{"name":"Telugu","value":"Telugu"},{"name":"Thai","value":"Thai"},{"name":"Turkish","value":"Turkish"},{"name":"Ukrainian","value":"Ukrainian"},{"name":"Urdu","value":"Urdu"},{"name":"Uzbek","value":"Uzbek"},{"name":"Vietnamese","value":"Vietnamese"},{"name":"Welsh","value":"Welsh"},{"name":"Xhosa","value":"Xhosa"},{"name":"Yiddish","value":"Yiddish"},{"name":"Yoruba","value":"Yoruba"},{"name":"Zulu","value":"Zulu"}]}]},{"k":"checkStringUppercase","d":"Check Text Is Uppercased","ed":"Check if string only contains uppercase characters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"AAA"}]},{"k":"getStringUppercase","d":"Get Uppercased Text","ed":"Convert all letters found in a string to uppercase","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"getStringVlookup","d":"Get String VLookup","ed":"Lookup string between multiple values by fuzzy logic and regex patterns","g":"text","p":[{"n":"text","r":true,"t":"string","p":"s4mple"},{"n":"texts","r":true,"t":"string","p":"sample,samples"}]},{"k":"getVatByAddress","d":"Get VAT% By Address","ed":"Get country VAT by address","g":"finance","p":[{"n":"address","r":true,"t":"string","p":"Mallorca, 120 España"}]},{"k":"getVatByCoordinates","d":"Get VAT% By Coordinates","ed":"Get country VAT by coordinates","g":"finance","p":[{"n":"coordinates","r":true,"t":"string","p":"41.61921,2.2904413"}]},{"k":"getVatByIp","d":"Get VAT% By IP","ed":"Get VAT by IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getVatByIsocode","d":"Get VAT% By ISO Code","ed":"Get VAT value by country ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getVatByNumber","d":"Get Data By TIN (VIES)","ed":"Get related european TIN number in Europe","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"},{"n":"tin","r":true,"t":"string","p":"44016116G"}]},{"k":"getVatByPhone","d":"Get VAT% By Phone","ed":"Get VAT by phone number, with worldwide coverage","g":"finance","p":[{"n":"phone","r":true,"t":"string","p":"57122000111"}]},{"k":"getVatByZipcode","d":"Get VAT% By Zipcode","ed":"Get VAT by zipcode","g":"finance","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"checkVatExist","d":"Check TIN Exists (VIES)","ed":"Check if TIN number exists in Europe","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"},{"n":"tin","r":true,"t":"string","p":"44016116G"}]},{"k":"getWordBanned","d":"Get Banned Words","ed":"Discover English banned words in the email body or subject","g":"text","p":[{"n":"text","r":true,"t":"string","p":"I am so thrilled to inform you that our new amazing feature is live!"}]},{"k":"getWordCleanAbuse","d":"Get Text Cleaned Without Abuse Words","ed":"Clean abuse words from a string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"comentario de un maldito personaje"}]},{"k":"getWordCount","d":"Get Words Count","ed":"Count total words in a text","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"}]},{"k":"checkWordCountBetw","d":"Check Word Count Between","ed":"Check if the number of words in a sentence is between two determined quantities","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count1","r":true,"t":"string","p":"1"},{"n":"count2","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountEq","d":"Check Word Count Equal","ed":"Check if the number of words in a sentence equals a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountGe","d":"Check Word Count Greater Or Equal","ed":"Check if the number of words in a sentence is greater than or equal to a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountGt","d":"Check Word Count Greater","ed":"Check if the number of words in a sentence is greater than a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"1"}]},{"k":"checkWordCountLe","d":"Check Word Count Lower Or Equal","ed":"Check if the number of words present in a sentence is less than or equal to a quantity","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountLt","d":"Check Word Count Lower","ed":"","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"3"}]},{"k":"getZipcodeByIp","d":"Get Zipcode By IP","ed":"Discover the zipcode if you have an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getZipcodeByPrefix","d":"Get Zipcode By Prefix (ES)","ed":"Get first zipcode by prefix, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"080"}]},{"k":"checkZipcodeExist","d":"Check Zipcode By Prefix Exists (ES)","ed":"Discover if a zipcode number prefix exists, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"checkZipcodeFormat","d":"Check Zipcode Has Valid Format (ES)","ed":"Discover if a zipcode number has a valid format, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getZipcodeListByPrefix","d":"Get Zipcodes By Prefix (ES)","ed":"Get multiple zipcodes by prefix, with worldwide coverage","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"080"}]},{"k":"getZipcodeNormalized","d":"Get Normalized Zipcode","ed":"Allow to normalize a zipcode, removing non allowed characters","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08i 12"}]}]}; \ No newline at end of file diff --git a/packages/nodes-base/nodes/UProc/ToolDescription.ts b/packages/nodes-base/nodes/UProc/ToolDescription.ts index 2073a2915d..a65ec7225d 100644 --- a/packages/nodes-base/nodes/UProc/ToolDescription.ts +++ b/packages/nodes-base/nodes/UProc/ToolDescription.ts @@ -1,6 +1,6 @@ import { - IDataObject, INodeProperties, + IDataObject, } from 'n8n-workflow'; import { @@ -21,7 +21,7 @@ function capitalize(str: string): string { const operations = []; -for (const group of (groups as IDataObject).groups as IDataObject[]) { +for(const group of (groups as IDataObject).groups as IDataObject[]) { const item = { displayName: 'Operation', name: 'tool', @@ -30,30 +30,30 @@ for (const group of (groups as IDataObject).groups as IDataObject[]) { displayOptions: { show: { group: [ - group.name, + group.name ], }, }, default: '', - options: [], + options: [] }; const options = []; - for (const tool of (tools as IDataObject).processors as IDataObject[]) { + for(const tool of (tools as IDataObject).processors as IDataObject[]){ if (tool.g === group.name) { - const link = 'https://app.uproc.io/#/tools/processor/' + (tool.k as string).replace(/([A-Z]+)/g, '-$1').toLowerCase().replace('-', '/').replace('-', '/'); + const link = 'https://app.uproc.io/#/tools/processor/' + (tool.k as string).replace(/([A-Z]+)/g, "-$1").toLowerCase().replace('-', '/').replace('-', '/'); const option = { name: tool.d as string, value: tool.k, - description: (tool.ed as string) + ` Info`, + description: (tool.ed as string) + " Info" }; options.push(option); } } //Tool - item.options = (options.sort((a, b) => (a.name > b.name) ? 1 : -1) as any); // tslint:disable-line:no-any - item.default = (options[0].value as string); + item.options = options.sort((a, b) => (a.name > b.name) ? 1 : -1); + item.default = options[0].value; operations.push(item); } @@ -61,12 +61,12 @@ export const toolOperations = operations as INodeProperties[]; let parameters = []; //all tools -for (const tool of (tools as IDataObject).processors as IDataObject[]) { +for(const tool of (tools as IDataObject).processors as IDataObject[]) { //all parameters in tool for (const param of (tool as IDataObject).p as IDataObject[]) { const displayName = param.n as string; - const capitalizedDisplayName = capitalize(displayName.replace(/_/g, ' ')); - const description = `The "${capitalizedDisplayName}" value to use as a parameter for this Operation`; + const capitalizedDisplayName = capitalize(displayName.replace(/_/g, " ")); + const description = "The '" + capitalizedDisplayName + "' value to use as a parameter for this Operation"; const parameter = { displayName: capitalizedDisplayName, name: param.n, @@ -82,7 +82,7 @@ for (const tool of (tools as IDataObject).processors as IDataObject[]) { tool.g, ], tool: [ - tool.k, + tool.k ], }, }, diff --git a/packages/nodes-base/nodes/UProc/UProc.node.ts b/packages/nodes-base/nodes/UProc/UProc.node.ts index 99f0af76f9..21704b2f18 100644 --- a/packages/nodes-base/nodes/UProc/UProc.node.ts +++ b/packages/nodes-base/nodes/UProc/UProc.node.ts @@ -1,143 +1,145 @@ import { - IExecuteFunctions, + IExecuteFunctions, } from 'n8n-core'; import { - IDataObject, - INodeExecutionData, - INodeType, - INodeTypeDescription, + IDataObject, + INodeExecutionData, + INodeType, + INodeTypeDescription, } from 'n8n-workflow'; import { - uprocApiRequest, + uprocApiRequest, } from './GenericFunctions'; import { - groupOptions, + groupOptions, } from './GroupDescription'; import { - toolOperations, - toolParameters, + toolOperations, + toolParameters, } from './ToolDescription'; export class UProc implements INodeType { - description: INodeTypeDescription = { - displayName: 'uProc', - name: 'uproc', - icon: 'file:uproc.png', - group: ['output'], - version: 1, - subtitle: '={{$parameter["tool"]}}', - description: 'Consume uProc API', - defaults: { - name: 'uProc', - color: '#219ef9', - }, - inputs: ['main'], - outputs: ['main'], - credentials: [ - { - name: 'uprocApi', - required: true, - }, - ], - properties: [ - ...groupOptions, - ...toolOperations, - ...toolParameters, - { - displayName: 'Additional Options', - name: 'additionalOptions', - type: 'collection', - placeholder: 'Add Option', - default: {}, - displayOptions: { - show: { - group: [ - 'audio', - 'communication', - 'company', - 'finance', - 'geographic', - 'image', - 'internet', - 'personal', - 'product', - 'security', - 'text', - ], - }, - }, - options: [ - { - displayName: 'Data Webhook', - name: 'dataWebhook', - type: 'string', - description: 'URL to send tool response when tool has resolved your request. You can create your own webhook at Beeceptor, Integromat, Zapier or n8n', - default: '', - }, - ], - }, - ], - }; + description: INodeTypeDescription = { + displayName: 'uProc', + name: 'uproc', + icon: 'file:uproc.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["tool"]}}', + description: 'Consume uProc API', + defaults: { + name: 'uProc', + color: '#219ef9', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'uprocApi', + required: true, + }, + ], + properties: [ + ...groupOptions, + ...toolOperations, + ...toolParameters, + { + displayName: 'Additional Options', + name: 'additionalOptions', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + group: [ + 'audio', + 'communication', + 'company', + 'finance', + 'geographic', + 'image', + 'internet', + 'personal', + 'product', + 'security', + 'text', + ], + }, + }, + options: [ + { + displayName: 'Data Webhook', + name: 'dataWebhook', + type: 'string', + description: 'URL to send tool response when tool has resolved your request. You can create your own webhook at en Beeceptor, Integromat, Zapier or n8n', + default: '', + } + ] + } + ], + }; - async execute(this: IExecuteFunctions): Promise { - const items = this.getInputData(); - const returnData: IDataObject[] = []; - const length = items.length as unknown as number; - let responseData; - const group = this.getNodeParameter('group', 0) as string; - const tool = this.getNodeParameter('tool', 0) as string; - const additionalOptions = this.getNodeParameter('additionalOptions', 0) as IDataObject; + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + const length = items.length as unknown as number; + let responseData; + const group = this.getNodeParameter('group', 0) as string; + const tool = this.getNodeParameter('tool', 0) as string; + const additionalOptions = this.getNodeParameter('additionalOptions', 0) as IDataObject; - const dataWebhook = additionalOptions.dataWebhook as string; + const dataWebhook = additionalOptions.dataWebhook as string; - interface LooseObject { - [key: string]: any; // tslint:disable-line:no-any - } + interface LooseObject { + [key: string]: any; + } - const fields = toolParameters.filter((field) => { - return field && field.displayOptions && field.displayOptions.show && field.displayOptions.show.group && field.displayOptions.show.tool && - field.displayOptions.show.group.indexOf(group) !== -1 && field.displayOptions.show.tool.indexOf(tool) !== -1; - }).map((field) => { - return field.name; - }); + const fields = toolParameters.filter((field) => { + return field && field.displayOptions && field.displayOptions.show && field.displayOptions.show.group && field.displayOptions.show.tool && + field.displayOptions.show.group.indexOf(group) !== -1 && field.displayOptions.show.tool.indexOf(tool) !== -1; + }).map((field) => { + return field.name; + }); - const requestPromises = []; - for (let i = 0; i < length; i++) { - const toolKey = tool.replace(/([A-Z]+)/g, '-$1').toLowerCase(); - const body: LooseObject = { - processor: toolKey, - params: {}, - }; + const requestPromises = []; + for (let i = 0; i < length; i++) { + const toolKey = tool.replace(/([A-Z]+)/g, "-$1").toLowerCase(); + const body: LooseObject = { + processor: toolKey, + params: {} + }; - fields.forEach((field) => { - if (field && field.length) { - const data = this.getNodeParameter(field, i) as string; - body.params[field] = data + ''; - } - }); + //console.log(fields); + fields.forEach((field) => { + if (field && field.length) { + const data = this.getNodeParameter(field, i) as string; + //console.log(field, data); + body.params[field] = data + ""; + } + }); - if (dataWebhook && dataWebhook.length) { - body.callback = {}; - } + if (dataWebhook && dataWebhook.length) { + body.callback = {}; + } - if (dataWebhook && dataWebhook.length) { - body.callback.data = dataWebhook; - } + if (dataWebhook && dataWebhook.length) { + body.callback.data = dataWebhook; + } - //Change to multiple requests - responseData = await uprocApiRequest.call(this, 'POST', body); + //Change to multiple requests + responseData = await uprocApiRequest.call(this, 'POST', body); - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } - } - return [this.helpers.returnJsonArray(returnData)]; - } + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else { + returnData.push(responseData as IDataObject); + } + } + return [this.helpers.returnJsonArray(returnData)]; + } } diff --git a/packages/nodes-base/nodes/UProc/uproc.png b/packages/nodes-base/nodes/UProc/uproc.png index 1358a6c3c3c958a8050968f63eb1f0f8d6229951..071e993f01687c396d5c49d619d4c73a1f0562e6 100644 GIT binary patch delta 1988 zcmV;#2Rr!S3C9nR8Gi-<0027t*>V5?00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF->u76UBX~8~f}pW{IFT(R8bq`4*Zy#e8CDmEn6YJ9<~F+}V}Cjpkm?d*x@4HF=;lWp zuxyEfa|0~dlF@}xEfbYG5DIa;tw_p7DK1M3jgO8>_Lgp9v&- ziX%dkRxw4!QkrzZ{t%%GQk+Qb7ROHjw(h~-}3Un>#&Cq%F z&O3YLop+K_fSfyUAknaNY0o0)oO$_4&Rwj+t*WmFeK)WNXajx*%(5&{s-PLHI)2=F z;`C|fT~Kd=UJ3dJ?<+fRXlv|{I=EmJ=vBZUfo5R2X@8#yg@z_=8L%JN3Hm z58ZFS?#Jz9lP#bh$X1bAS>pCKzhVk8Ipyb|7mpUt)+j|qDewSrJCj##1HK8me57lS zmZiVw&CsNmdY@%9;Gwv!o5HjO__{VhIOOBqf9+n z4|;lFWh=wFmB6>BAn-##Rbb^HhAm)e{tE&VUY3ClWoGGVQ!H7Hlpg?*OyCHxY6=6d z07^2G){RVk`2uKV`9=4#&j9dpU*CJ*TuNSOTbU$U+I+>bg@L*kYkl zsDH3!DS#T+m2v9H^A|CwQYfS<02NkB6yvab6NxB_iwhegod#2$7XXH3=+LZ%D=HM_ z<%P}T;Gm1+nAOV?S43Qio3*b{Q)4k}R$-Ou#fw5JWkw@c5D~<3TyR`IHto{Y)fUsH z6=vb?ZXq5wV`0aYQ;sWG;*lRQi)&F;ReyLNqP1hprN!l4*F`Kpc>inCo#)L9v3PN~ z;E@IgjovGd0AkhDSW;1;T1}3;WJ#D6D+)`|?d=YookkN@D@2tiKD8I_xu=K+A1oaoX4x361QhKQ3l?ELv*Hf@?tMMdFOIdLLIDrL;2UjkA? z3jnbgiPBQFqoEE+{AsSTx z9hH^V|F&+OPSf@oELc$FgO3I;{(s9M8dcQSNBQ$#D!Jp1A|u*0H>YT6Nt=q_Q^3c; zW0!C!q=G{Iyi)uk8da}+>)}%FT@~TP35R|Ak{tY3iZf@@^bbH$5nOkj#lnSQ?!SK; zbLWPz?NBgj1xqX@w6-Sw2{kh2lR&R`Xb&GzMCRe`mYE%#i^sicC!N03y?=zmP+aWQ z%F1xtv1`{Lb#)g=B#aE#1>6nxvEW452Ss_B9|xWSnt~scl&FGlF*&Ew3od*2CP^fW zS@)Md6Ty>F3kYCQO1Z#4fR<~~q&GJwdH(r+Q?UO5-Ud4zxbsk!9@aN1)eby+wP8Q_ zAkD^&MmLc@3-*VfuJVV+aDQ;P=W0TK@`gQl#z6?o&4D`x>#N(J#82VMmJ zIo`0T6#Qvdoadg4p_Gvg2mkhTxBG{0sJqOfQ;@_&%iVU8tkYsoMCCDl=>_1W8j==*#3T@scC>UYkC1Au)V-fe1BM#Z5L10I#4Mk zzNKFikqGc>V3rBkW9?~P*gn9PEf+DgZ{{3O5B4j5%x0awoC;s1)bB+kj<=0zPTuQE zF6`Vn$Zxj|aG*JkQXvzT?Eszt`?X7_?CdO8?16lZd^f)j_!01xv1+wvcY?p~P0-jl z;4j-4$;SJEXTW|d+keixF#~6SE8orM;yqP=>Pr7Pf8OQw*ApB(m}K`G2|7+YCL8)+ zd0mj*p35%UF$0gt-eKR$-vd@>v{34!j~osiO48DjukZe)8F{P`{5 zH{QFQ%9f3d0FS7<5s@2{Nx6OBzQmJFP4OjKJM{HIPmfD?w}0!0gE5P?;cXQ@1op|y z`gkmo|CDEdZ{FNDd&7p<&5pxQLEUTk4z?e78aM{_seC~T1|B_|>q-%3;5~ePl>E0* zyzLh}2fh2N-D^xoGsBFWaUH_jHxdGBfLlNoSQa;wms>L<5ml~04JITOi@80n%NbA~ z0!M*v!10!3Y&|FYHMsT`9$hKzUq@8Pg6S2OibNC&7)%I#eXckTfb!Rk>>S3-U;YpF WM?eqm){@Qu000002tu>~$=|<$1VTF_BSH(%5V#aX9L|MEfpmfakSi+s60ZK&FOcY; zKOhn)h>UQZ$Y5Z2dhz0KF|n5x7H<|U`UZ3)E9;BTpZ}$$eE{12_U+$WxBkqT^G#LtwXE!` z@8AD@`0x*C>GI{@7cBTTWy;s2qz`_6@9gZ}nwh;37JkXi{o>K1Ki9AS-nQ+>`t{%2 z+rLy-e=aZoR8a5<=;q+ycl!EotgK#ZYrVd6_s^wEzfPb2b>P6y-MfFRUj4nN=SxJy zdsmlt*K9KO0wX4*B*-tAfrW{A53dlnujspDy3bE9o;|%ZQbm!A@yWw0llq%$Qez{+ zf}QO()#RjJKRmX5sX{4*!z)W$J~pU0#lJBRFqp$hchT^gNh!dx^xs z8xa|{OEWmatMb+^X6sFSv)i_eTk7bIN%dZ~#|p2X{Ve7BSi-&N+B5U!+MU7MwbKly z#YSH2Tvo8yVZ-4pzTL7cw=c@LSs#?!T;apA@tjVbXTj7+83D%)vySF5vaFAMqf`+m z9+&=ckCfm0K#Q%5<@4VLRW$d@e=4Y%d8l1dZ{3rJ%AK!V9CvXwRZqAqFZF-w#C6^b z8>bmpd=&599ucF=WMTQE$F8Vo_EBFJe?7(6H0MQD3gRE_c3QlVp0sxL>wcH5jZ#I8u4y)e$+OR&8yj;@bI!`CzHbY{ zC!Y;_k|LX?v3=#H2~#I6G}_%*pSrCueZ#Hmci*n&vpSy3$JnF#jCt!n=06VkL7l9! RM}Rqk!PC{xWt~$(69A^RZZ7}; From 4851cb806e7609f895ed983b15b7ec305a355485 Mon Sep 17 00:00:00 2001 From: Miquel Colomer Date: Thu, 25 Feb 2021 10:47:36 +0100 Subject: [PATCH 013/137] + added new tools --- .../nodes/UProc/GroupDescription.ts | 4 ++-- .../nodes-base/nodes/UProc/ToolDescription.ts | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/nodes-base/nodes/UProc/GroupDescription.ts b/packages/nodes-base/nodes/UProc/GroupDescription.ts index 446ffba631..f1483a0dac 100644 --- a/packages/nodes-base/nodes/UProc/GroupDescription.ts +++ b/packages/nodes-base/nodes/UProc/GroupDescription.ts @@ -1,6 +1,6 @@ import { - INodeProperties, IDataObject, + INodeProperties } from 'n8n-workflow'; import { @@ -18,7 +18,7 @@ const finalGroups = { const options = []; -for(const group of (groups as IDataObject).groups as IDataObject[]){ +for (const group of (groups as IDataObject).groups as IDataObject[]) { const item = { name: group.translated, value: group.name, diff --git a/packages/nodes-base/nodes/UProc/ToolDescription.ts b/packages/nodes-base/nodes/UProc/ToolDescription.ts index a65ec7225d..6fa7bf7d01 100644 --- a/packages/nodes-base/nodes/UProc/ToolDescription.ts +++ b/packages/nodes-base/nodes/UProc/ToolDescription.ts @@ -1,6 +1,6 @@ import { - INodeProperties, IDataObject, + INodeProperties } from 'n8n-workflow'; import { @@ -21,7 +21,7 @@ function capitalize(str: string): string { const operations = []; -for(const group of (groups as IDataObject).groups as IDataObject[]) { +for (const group of (groups as IDataObject).groups as IDataObject[]) { const item = { displayName: 'Operation', name: 'tool', @@ -39,21 +39,21 @@ for(const group of (groups as IDataObject).groups as IDataObject[]) { }; const options = []; - for(const tool of (tools as IDataObject).processors as IDataObject[]){ + for (const tool of (tools as IDataObject).processors as IDataObject[]) { if (tool.g === group.name) { - const link = 'https://app.uproc.io/#/tools/processor/' + (tool.k as string).replace(/([A-Z]+)/g, "-$1").toLowerCase().replace('-', '/').replace('-', '/'); + const link = 'https://app.uproc.io/#/tools/processor/' + (tool.k as string).replace(/([A-Z]+)/g, '-$1').toLowerCase().replace('-', '/').replace('-', '/'); const option = { name: tool.d as string, value: tool.k, - description: (tool.ed as string) + " Info" + description: (tool.ed as string) + ` Info` }; options.push(option); } } //Tool - item.options = options.sort((a, b) => (a.name > b.name) ? 1 : -1); - item.default = options[0].value; + item.options = (options.sort((a, b) => (a.name > b.name) ? 1 : -1) as any); // tslint:disable-line:no-any + item.default = (options[0].value as string); operations.push(item); } @@ -61,12 +61,12 @@ export const toolOperations = operations as INodeProperties[]; let parameters = []; //all tools -for(const tool of (tools as IDataObject).processors as IDataObject[]) { +for (const tool of (tools as IDataObject).processors as IDataObject[]) { //all parameters in tool for (const param of (tool as IDataObject).p as IDataObject[]) { const displayName = param.n as string; - const capitalizedDisplayName = capitalize(displayName.replace(/_/g, " ")); - const description = "The '" + capitalizedDisplayName + "' value to use as a parameter for this Operation"; + const capitalizedDisplayName = capitalize(displayName.replace(/_/g, ' ')); + const description = `The "${capitalizedDisplayName}" value to use as a parameter for this Operation`; const parameter = { displayName: capitalizedDisplayName, name: param.n, From bf50cbdad3ff9e33c1c9ddea4c4e8ac75c2e3351 Mon Sep 17 00:00:00 2001 From: Miquel Colomer Date: Thu, 25 Feb 2021 10:48:43 +0100 Subject: [PATCH 014/137] + added new tools --- packages/nodes-base/nodes/UProc/uProc.node.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/UProc/uProc.node.json b/packages/nodes-base/nodes/UProc/uProc.node.json index 90a6a8b9b8..a64480d3c0 100644 --- a/packages/nodes-base/nodes/UProc/uProc.node.json +++ b/packages/nodes-base/nodes/UProc/uProc.node.json @@ -17,4 +17,4 @@ } ] } -} \ No newline at end of file +} From 3d80129a28169043a2ab20feae7a7141c1e820cf Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Wed, 10 Mar 2021 10:50:07 +0100 Subject: [PATCH 015/137] :bug: Fix performance and crashes with latest updates (#1524) * Removing unnecessary data from process communication * Wrapping progress save in a try ... catch block to prevent crashes * Migration to fix mysql problems with big data on executions * :zap: Minor formatting fixes Co-authored-by: Jan Oberhauser --- .../cli/src/WorkflowExecuteAdditionalData.ts | 98 ++++++++++--------- packages/cli/src/WorkflowRunnerProcess.ts | 4 +- .../1615306975123-ChangeDataSize.ts | 18 ++++ .../src/databases/mysqldb/migrations/index.ts | 2 + 4 files changed, 76 insertions(+), 46 deletions(-) create mode 100644 packages/cli/src/databases/mysqldb/migrations/1615306975123-ChangeDataSize.ts diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/WorkflowExecuteAdditionalData.ts index d1ef25985e..b40491cea4 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/WorkflowExecuteAdditionalData.ts @@ -230,54 +230,64 @@ export function hookFunctionsPreExecute(parentProcessMode?: string): IWorkflowEx return; } - const execution = await Db.collections.Execution!.findOne(this.executionId); + try { + const execution = await Db.collections.Execution!.findOne(this.executionId); - if (execution === undefined) { - // Something went badly wrong if this happens. - // This check is here mostly to make typescript happy. - return undefined; - } - const fullExecutionData: IExecutionResponse = ResponseHelper.unflattenExecutionData(execution); + if (execution === undefined) { + // Something went badly wrong if this happens. + // This check is here mostly to make typescript happy. + return undefined; + } + const fullExecutionData: IExecutionResponse = ResponseHelper.unflattenExecutionData(execution); - if (fullExecutionData.finished) { - // We already received ´workflowExecuteAfter´ webhook, so this is just an async call - // that was left behind. We skip saving because the other call should have saved everything - // so this one is safe to ignore - return; + if (fullExecutionData.finished) { + // We already received ´workflowExecuteAfter´ webhook, so this is just an async call + // that was left behind. We skip saving because the other call should have saved everything + // so this one is safe to ignore + return; + } + + + if (fullExecutionData.data === undefined) { + fullExecutionData.data = { + startData: { + }, + resultData: { + runData: {}, + }, + executionData: { + contextData: {}, + nodeExecutionStack: [], + waitingExecution: {}, + }, + }; + } + + if (Array.isArray(fullExecutionData.data.resultData.runData[nodeName])) { + // Append data if array exists + fullExecutionData.data.resultData.runData[nodeName].push(data); + } else { + // Initialize array and save data + fullExecutionData.data.resultData.runData[nodeName] = [data]; + } + + fullExecutionData.data.executionData = executionData.executionData; + + // Set last executed node so that it may resume on failure + fullExecutionData.data.resultData.lastNodeExecuted = nodeName; + + const flattenedExecutionData = ResponseHelper.flattenExecutionData(fullExecutionData); + + await Db.collections.Execution!.update(this.executionId, flattenedExecutionData as IExecutionFlattedDb); + } catch (err) { + // TODO: Improve in the future! + // Errors here might happen because of database access + // For busy machines, we may get "Database is locked" errors. + + // We do this to prevent crashes and executions ending in `unknown` state. + console.log(`Failed saving execution progress to database for execution ID ${this.executionId}`, err); } - - if (fullExecutionData.data === undefined) { - fullExecutionData.data = { - startData: { - }, - resultData: { - runData: {}, - }, - executionData: { - contextData: {}, - nodeExecutionStack: [], - waitingExecution: {}, - }, - }; - } - - if (Array.isArray(fullExecutionData.data.resultData.runData[nodeName])) { - // Append data if array exists - fullExecutionData.data.resultData.runData[nodeName].push(data); - } else { - // Initialize array and save data - fullExecutionData.data.resultData.runData[nodeName] = [data]; - } - - fullExecutionData.data.executionData = executionData.executionData; - - // Set last executed node so that it may resume on failure - fullExecutionData.data.resultData.lastNodeExecuted = nodeName; - - const flattenedExecutionData = ResponseHelper.flattenExecutionData(fullExecutionData); - - await Db.collections.Execution!.update(this.executionId, flattenedExecutionData as IExecutionFlattedDb); }, ], }; diff --git a/packages/cli/src/WorkflowRunnerProcess.ts b/packages/cli/src/WorkflowRunnerProcess.ts index 95b9bf5adb..50c623beef 100644 --- a/packages/cli/src/WorkflowRunnerProcess.ts +++ b/packages/cli/src/WorkflowRunnerProcess.ts @@ -174,8 +174,8 @@ export class WorkflowRunnerProcess { }, ], nodeExecuteAfter: [ - async (nodeName: string, data: ITaskData, executionData: IRunExecutionData): Promise => { - this.sendHookToParentProcess('nodeExecuteAfter', [nodeName, data, executionData]); + async (nodeName: string, data: ITaskData): Promise => { + this.sendHookToParentProcess('nodeExecuteAfter', [nodeName, data]); }, ], workflowExecuteBefore: [ diff --git a/packages/cli/src/databases/mysqldb/migrations/1615306975123-ChangeDataSize.ts b/packages/cli/src/databases/mysqldb/migrations/1615306975123-ChangeDataSize.ts new file mode 100644 index 0000000000..793b178ef3 --- /dev/null +++ b/packages/cli/src/databases/mysqldb/migrations/1615306975123-ChangeDataSize.ts @@ -0,0 +1,18 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; +import * as config from '../../../../config'; + +export class ChangeDataSize1615306975123 implements MigrationInterface { + name = 'ChangeDataSize1615306975123'; + + async up(queryRunner: QueryRunner): Promise { + const tablePrefix = config.get('database.tablePrefix'); + + await queryRunner.query('ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY COLUMN `data` MEDIUMTEXT NOT NULL'); + } + + async down(queryRunner: QueryRunner): Promise { + const tablePrefix = config.get('database.tablePrefix'); + + await queryRunner.query('ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY COLUMN `data` TEXT NOT NULL'); + } +} diff --git a/packages/cli/src/databases/mysqldb/migrations/index.ts b/packages/cli/src/databases/mysqldb/migrations/index.ts index 4c736d57ed..08ca45edbf 100644 --- a/packages/cli/src/databases/mysqldb/migrations/index.ts +++ b/packages/cli/src/databases/mysqldb/migrations/index.ts @@ -3,6 +3,7 @@ import { WebhookModel1592447867632 } from './1592447867632-WebhookModel'; import { CreateIndexStoppedAt1594902918301 } from './1594902918301-CreateIndexStoppedAt'; import { AddWebhookId1611149998770 } from './1611149998770-AddWebhookId'; import { MakeStoppedAtNullable1607431743767 } from './1607431743767-MakeStoppedAtNullable'; +import { ChangeDataSize1615306975123 } from './1615306975123-ChangeDataSize'; export const mysqlMigrations = [ InitialMigration1588157391238, @@ -10,4 +11,5 @@ export const mysqlMigrations = [ CreateIndexStoppedAt1594902918301, AddWebhookId1611149998770, MakeStoppedAtNullable1607431743767, + ChangeDataSize1615306975123, ]; From d6d57c2df6c2b6e1a48273030666192b09e5f509 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Wed, 10 Mar 2021 15:51:18 +0100 Subject: [PATCH 016/137] :bug: Fixed an issue with queue mode for executions that should not be saved (#1509) * Fixed an issue with queue mode for executions that should not be saved * :zap: Minimal change Co-authored-by: Jan Oberhauser --- packages/cli/commands/worker.ts | 2 +- .../cli/src/WorkflowExecuteAdditionalData.ts | 89 ++++++++++++++++++- packages/cli/src/WorkflowRunner.ts | 20 +++++ packages/cli/src/WorkflowRunnerProcess.ts | 10 +++ .../src/components/ExecutionsList.vue | 21 +++++ 5 files changed, 140 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/worker.ts b/packages/cli/commands/worker.ts index aeb3b2ba08..b2b78c4c7a 100644 --- a/packages/cli/commands/worker.ts +++ b/packages/cli/commands/worker.ts @@ -132,7 +132,7 @@ export class Worker extends Command { const credentials = await WorkflowCredentials(currentExecutionDb.workflowData.nodes); const additionalData = await WorkflowExecuteAdditionalData.getBase(credentials); - additionalData.hooks = WorkflowExecuteAdditionalData.getWorkflowHooksIntegrated(currentExecutionDb.mode, job.data.executionId, currentExecutionDb.workflowData, { retryOf: currentExecutionDb.retryOf as string }); + additionalData.hooks = WorkflowExecuteAdditionalData.getWorkflowHooksWorkerExecuter(currentExecutionDb.mode, job.data.executionId, currentExecutionDb.workflowData, { retryOf: currentExecutionDb.retryOf as string }); let workflowExecute: WorkflowExecute; let workflowRun: PCancelable; diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/WorkflowExecuteAdditionalData.ts index b40491cea4..562169980b 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/WorkflowExecuteAdditionalData.ts @@ -353,7 +353,7 @@ function hookFunctionsSave(parentProcessMode?: string): IWorkflowExecuteHooks { executeErrorWorkflow(this.workflowData, fullRunData, this.mode, undefined, this.retryOf); } // Data is always saved, so we remove from database - Db.collections.Execution!.delete(this.executionId); + await Db.collections.Execution!.delete(this.executionId); return; } @@ -399,6 +399,77 @@ function hookFunctionsSave(parentProcessMode?: string): IWorkflowExecuteHooks { } +/** + * Returns hook functions to save workflow execution and call error workflow + * for running with queues. Manual executions should never run on queues as + * they are always executed in the main process. + * + * @returns {IWorkflowExecuteHooks} + */ +function hookFunctionsSaveWorker(): IWorkflowExecuteHooks { + return { + nodeExecuteBefore: [], + nodeExecuteAfter: [], + workflowExecuteBefore: [], + workflowExecuteAfter: [ + async function (this: WorkflowHooks, fullRunData: IRun, newStaticData: IDataObject): Promise { + try { + if (WorkflowHelpers.isWorkflowIdValid(this.workflowData.id as string) === true && newStaticData) { + // Workflow is saved so update in database + try { + await WorkflowHelpers.saveStaticDataById(this.workflowData.id as string, newStaticData); + } catch (e) { + // TODO: Add proper logging! + console.error(`There was a problem saving the workflow with id "${this.workflowData.id}" to save changed staticData: ${e.message}`); + } + } + + // Check config to know if execution should be saved or not + let saveDataErrorExecution = config.get('executions.saveDataOnError') as string; + if (this.workflowData.settings !== undefined) { + saveDataErrorExecution = (this.workflowData.settings.saveDataErrorExecution as string) || saveDataErrorExecution; + } + + const workflowDidSucceed = !fullRunData.data.resultData.error; + if (workflowDidSucceed === false && saveDataErrorExecution === 'none') { + executeErrorWorkflow(this.workflowData, fullRunData, this.mode, undefined, this.retryOf); + } + + const fullExecutionData: IExecutionDb = { + data: fullRunData.data, + mode: fullRunData.mode, + finished: fullRunData.finished ? fullRunData.finished : false, + startedAt: fullRunData.startedAt, + stoppedAt: fullRunData.stoppedAt, + workflowData: this.workflowData, + }; + + if (this.retryOf !== undefined) { + fullExecutionData.retryOf = this.retryOf.toString(); + } + + if (this.workflowData.id !== undefined && WorkflowHelpers.isWorkflowIdValid(this.workflowData.id.toString()) === true) { + fullExecutionData.workflowId = this.workflowData.id.toString(); + } + + const executionData = ResponseHelper.flattenExecutionData(fullExecutionData); + + // Save the Execution in DB + await Db.collections.Execution!.update(this.executionId, executionData as IExecutionFlattedDb); + + if (fullRunData.finished === true && this.retryOf !== undefined) { + // If the retry was successful save the reference it on the original execution + // await Db.collections.Execution!.save(executionData as IExecutionFlattedDb); + await Db.collections.Execution!.update(this.retryOf, { retrySuccessId: this.executionId }); + } + } catch (error) { + executeErrorWorkflow(this.workflowData, fullRunData, this.mode, undefined, this.retryOf); + } + }, + ], + }; +} + export async function getRunData(workflowData: IWorkflowBase, inputData?: INodeExecutionData[]): Promise { const mode = 'integrated'; @@ -613,6 +684,22 @@ export function getWorkflowHooksIntegrated(mode: WorkflowExecuteMode, executionI return new WorkflowHooks(hookFunctions, mode, executionId, workflowData, optionalParameters); } +/** + * Returns WorkflowHooks instance for running integrated workflows + * (Workflows which get started inside of another workflow) + */ +export function getWorkflowHooksWorkerExecuter(mode: WorkflowExecuteMode, executionId: string, workflowData: IWorkflowBase, optionalParameters?: IWorkflowHooksOptionalParameters): WorkflowHooks { + optionalParameters = optionalParameters || {}; + const hookFunctions = hookFunctionsSaveWorker(); + const preExecuteFunctions = hookFunctionsPreExecute(optionalParameters.parentProcessMode); + for (const key of Object.keys(preExecuteFunctions)) { + if (hookFunctions[key] === undefined) { + hookFunctions[key] = []; + } + hookFunctions[key]!.push.apply(hookFunctions[key], preExecuteFunctions[key]); + } + return new WorkflowHooks(hookFunctions, mode, executionId, workflowData, optionalParameters); +} /** * Returns WorkflowHooks instance for main process if workflow runs via worker diff --git a/packages/cli/src/WorkflowRunner.ts b/packages/cli/src/WorkflowRunner.ts index 0cf3a560f6..f884ac5dcc 100644 --- a/packages/cli/src/WorkflowRunner.ts +++ b/packages/cli/src/WorkflowRunner.ts @@ -346,7 +346,27 @@ export class WorkflowRunner { // Normally also static data should be supplied here but as it only used for sending // data to editor-UI is not needed. hooks.executeHookFunctions('workflowExecuteAfter', [runData]); + try { + // Check if this execution data has to be removed from database + // based on workflow settings. + let saveDataErrorExecution = config.get('executions.saveDataOnError') as string; + let saveDataSuccessExecution = config.get('executions.saveDataOnSuccess') as string; + if (data.workflowData.settings !== undefined) { + saveDataErrorExecution = (data.workflowData.settings.saveDataErrorExecution as string) || saveDataErrorExecution; + saveDataSuccessExecution = (data.workflowData.settings.saveDataSuccessExecution as string) || saveDataSuccessExecution; + } + const workflowDidSucceed = !runData.data.resultData.error; + if (workflowDidSucceed === true && saveDataSuccessExecution === 'none' || + workflowDidSucceed === false && saveDataErrorExecution === 'none' + ) { + await Db.collections.Execution!.delete(executionId); + } + } catch (err) { + // We don't want errors here to crash n8n. Just log and proceed. + console.log('Error removing saved execution from database. More details: ', err); + } + resolve(runData); }); diff --git a/packages/cli/src/WorkflowRunnerProcess.ts b/packages/cli/src/WorkflowRunnerProcess.ts index 50c623beef..f5305e29e8 100644 --- a/packages/cli/src/WorkflowRunnerProcess.ts +++ b/packages/cli/src/WorkflowRunnerProcess.ts @@ -41,8 +41,18 @@ export class WorkflowRunnerProcess { workflowExecute: WorkflowExecute | undefined; executionIdCallback: (executionId: string) => void | undefined; + static async stopProcess() { + setTimeout(() => { + // Attempt a graceful shutdown, giving executions 30 seconds to finish + process.exit(0); + }, 30000); + } + async runWorkflow(inputData: IWorkflowExecutionDataProcessWithExecution): Promise { + process.on('SIGTERM', WorkflowRunnerProcess.stopProcess); + process.on('SIGINT', WorkflowRunnerProcess.stopProcess); + this.data = inputData; let className: string; let tempNode: INodeType; diff --git a/packages/editor-ui/src/components/ExecutionsList.vue b/packages/editor-ui/src/components/ExecutionsList.vue index 051f85513c..1c0dfd80e3 100644 --- a/packages/editor-ui/src/components/ExecutionsList.vue +++ b/packages/editor-ui/src/components/ExecutionsList.vue @@ -175,6 +175,10 @@ import { IDataObject, } from 'n8n-workflow'; +import { + range as _range, +} from 'lodash'; + import mixins from 'vue-typed-mixins'; export default mixins( @@ -433,8 +437,24 @@ export default mixins( this.$store.commit('setActiveExecutions', results[1]); const alreadyPresentExecutionIds = this.finishedExecutions.map(exec => exec.id); + let lastId = 0; + const gaps = [] as number[]; for(let i = results[0].results.length - 1; i >= 0; i--) { const currentItem = results[0].results[i]; + const currentId = parseInt(currentItem.id, 10); + if (lastId !== 0 && isNaN(currentId) === false) { + // We are doing this iteration to detect possible gaps. + // The gaps are used to remove executions that finished + // and were deleted from database but were displaying + // in this list while running. + if (currentId - lastId > 1) { + // We have some gaps. + const range = _range(lastId + 1, currentId); + gaps.push(...range); + } + } + lastId = parseInt(currentItem.id, 10) || 0; + // Check new results from end to start // Add new items accordingly. const executionIndex = alreadyPresentExecutionIds.indexOf(currentItem.id); @@ -464,6 +484,7 @@ export default mixins( this.finishedExecutions.unshift(currentItem); } } + this.finishedExecutions = this.finishedExecutions.filter(execution => !gaps.includes(parseInt(execution.id, 10)) && lastId >= parseInt(execution.id, 10)); this.finishedExecutionsCount = results[0].count; }, async loadFinishedExecutions (): Promise { From ef9178d9540a78f300da2ec542c29f69df72deb2 Mon Sep 17 00:00:00 2001 From: ricardo Date: Wed, 10 Mar 2021 11:01:03 -0500 Subject: [PATCH 017/137] :zap: Add "Date Fields" parameter to the insert & update operations MongoDB --- .../nodes-base/nodes/MongoDb/MongoDb.node.ts | 37 +++++++++++--- .../nodes/MongoDb/mongo.node.options.ts | 48 +++++++++++++++--- .../nodes/MongoDb/mongo.node.utils.ts | 11 ++++ packages/nodes-base/nodes/MongoDb/mongoDb.png | Bin 1018 -> 0 bytes packages/nodes-base/nodes/MongoDb/mongodb.svg | 1 + 5 files changed, 84 insertions(+), 13 deletions(-) delete mode 100644 packages/nodes-base/nodes/MongoDb/mongoDb.png create mode 100644 packages/nodes-base/nodes/MongoDb/mongodb.svg diff --git a/packages/nodes-base/nodes/MongoDb/MongoDb.node.ts b/packages/nodes-base/nodes/MongoDb/MongoDb.node.ts index e9abdc2bd2..c03a62816f 100644 --- a/packages/nodes-base/nodes/MongoDb/MongoDb.node.ts +++ b/packages/nodes-base/nodes/MongoDb/MongoDb.node.ts @@ -1,14 +1,26 @@ -import { IExecuteFunctions } from 'n8n-core'; +import { + IExecuteFunctions, +} from 'n8n-core'; + import { IDataObject, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow'; -import { nodeDescription } from './mongo.node.options'; -import { MongoClient } from 'mongodb'; + +import { + nodeDescription, +} from './mongo.node.options'; + +import { + MongoClient, + ObjectID, +} from 'mongodb'; + import { getItemCopy, + handleDateFields, validateAndResolveMongoCredentials } from './mongo.node.utils'; @@ -65,8 +77,13 @@ export class MongoDb implements INodeType { .map(f => f.trim()) .filter(f => !!f); + const options = this.getNodeParameter('options', 0) as IDataObject; const insertItems = getItemCopy(items, fields); + if (options.dateFields) { + handleDateFields(insertItems, options.dateFields as string); + } + const { insertedIds } = await mdb .collection(this.getNodeParameter('collection', 0) as string) .insertMany(insertItems); @@ -90,6 +107,8 @@ export class MongoDb implements INodeType { .map(f => f.trim()) .filter(f => !!f); + const options = this.getNodeParameter('options', 0) as IDataObject; + let updateKey = this.getNodeParameter('updateKey', 0) as string; updateKey = updateKey.trim(); @@ -100,19 +119,25 @@ export class MongoDb implements INodeType { // Prepare the data to update and copy it to be returned const updateItems = getItemCopy(items, fields); + if (options.dateFields) { + handleDateFields(updateItems, options.dateFields as string); + } + for (const item of updateItems) { if (item[updateKey] === undefined) { continue; } - const filter: { [key: string]: string } = {}; + const filter: { [key: string]: string | ObjectID } = {}; filter[updateKey] = item[updateKey] as string; - + if (updateKey === '_id') { + filter[updateKey] = new ObjectID(filter[updateKey]); + delete item['_id']; + } await mdb .collection(this.getNodeParameter('collection', 0) as string) .updateOne(filter, { $set: item }); } - returnItems = this.helpers.returnJsonArray(updateItems as IDataObject[]); } else { throw new Error(`The operation "${operation}" is not supported!`); diff --git a/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts b/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts index d4bd0a37b5..ec09998450 100644 --- a/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts +++ b/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts @@ -1,4 +1,6 @@ -import { INodeTypeDescription } from 'n8n-workflow'; +import { + INodeTypeDescription, +} from 'n8n-workflow'; /** * Options to be displayed @@ -6,7 +8,7 @@ import { INodeTypeDescription } from 'n8n-workflow'; export const nodeDescription: INodeTypeDescription = { displayName: 'MongoDB', name: 'mongoDb', - icon: 'file:mongoDb.png', + icon: 'file:mongoDb.svg', group: ['input'], version: 1, description: 'Find, insert and update documents in MongoDB.', @@ -46,7 +48,7 @@ export const nodeDescription: INodeTypeDescription = { { name: 'Update', value: 'update', - description: 'Updates documents.', + description: 'Update documents.', }, ], default: 'find', @@ -97,7 +99,9 @@ export const nodeDescription: INodeTypeDescription = { }, displayOptions: { show: { - operation: ['find'], + operation: [ + 'find', + ], }, }, default: '{}', @@ -115,7 +119,9 @@ export const nodeDescription: INodeTypeDescription = { type: 'string', displayOptions: { show: { - operation: ['insert'], + operation: [ + 'insert', + ], }, }, default: '', @@ -133,7 +139,9 @@ export const nodeDescription: INodeTypeDescription = { type: 'string', displayOptions: { show: { - operation: ['update'], + operation: [ + 'update', + ], }, }, default: 'id', @@ -147,7 +155,9 @@ export const nodeDescription: INodeTypeDescription = { type: 'string', displayOptions: { show: { - operation: ['update'], + operation: [ + 'update', + ], }, }, default: '', @@ -155,5 +165,29 @@ export const nodeDescription: INodeTypeDescription = { description: 'Comma separated list of the fields to be included into the new document.', }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + displayOptions: { + show: { + operation: [ + 'update', + 'insert', + ], + }, + }, + placeholder: 'Add Option', + default: {}, + options: [ + { + displayName: 'Date Fields', + name: 'dateFields', + type: 'string', + default: '', + description: 'Comma separeted list of fields that will be parse as Mongo Date type.', + }, + ], + }, ], }; diff --git a/packages/nodes-base/nodes/MongoDb/mongo.node.utils.ts b/packages/nodes-base/nodes/MongoDb/mongo.node.utils.ts index bc2d308a76..87fefd69b3 100644 --- a/packages/nodes-base/nodes/MongoDb/mongo.node.utils.ts +++ b/packages/nodes-base/nodes/MongoDb/mongo.node.utils.ts @@ -102,3 +102,14 @@ export function getItemCopy( return newItem; }); } + +export function handleDateFields(insertItems: IDataObject[], fields: string) { + const dateFields = (fields as string).split(','); + for (let i = 0; i < insertItems.length; i++) { + for (const key of Object.keys(insertItems[i])) { + if (dateFields.includes(key)) { + insertItems[i][key] = new Date(insertItems[i][key] as string); + } + } + } +} diff --git a/packages/nodes-base/nodes/MongoDb/mongoDb.png b/packages/nodes-base/nodes/MongoDb/mongoDb.png deleted file mode 100644 index 0980afcb2b411bba963fbf23820d2f8faab7661b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$j12GzaRqWSH#sCOwFZ*$3$1`; zpi zz9mo#5Jk_hfS3bRA2HQ5Vw!2vGHW0MD44v$He`-Y>^w^#8z>7@96JYOFGM4p0p!Bj z>Fe!5X3jE)sE3G0fVITVwMja!r8PMW%=`Ov<7hxZ+T zh#cO3AYz({5a;SjVBqGL1o;Is{AK?6`PH8c&R=hy+}k%L^!wK@@i9UE+LDrj{QrJ@ z|Ni0Z$?Pz17i$AGMQ*k~-@ktS^7+m6t9!RBT{L|{M`cPEGW!fByUd1mA%Q zzJB@g>Ep-8cW$3MxNq0`bqo8u8)|Ec)BJoK^|eG~RwiEr#_vN<7sn8f<4dolhaWN! zVS8Y*b?c@%4PDHFqO9NVRlnc+ecsNm|LX;^``L0;&G+1&U+iBrdG>_*$tx5tEmTha z^dqqQ|W1xr*8gv*JtgwBTsXtEH$i{uTrq^m_%?IV@+>{b@2(i%Ule5IhW|Z zPY%mcl&xpobTB?_qX7#K&%9UL3g@-%_7XI^bl%9|i&^($qp#v^45C}7s=qP+X2Q8W z;%{@JfofVW_p!v3my&PU#hD+3*`AuSVZG}Swcj!u^-RPMNws%Buzs#NQBC{Y4eg?U zHc4^5*OQrgt%?r{2<+&wwb6S}pwo0ypL?;G?bU~EyJu~Z&pFEbdf}RirjIL`^lrL4 z?XzCz{%B`RfiIg|UIb^}+4HiJ65DSlp5=Y-pFY2?)aD-3fgWb72VpnotL%8Y?%-Xm zNf+j9loLPTR)37s+3x`7(T_ zh$bI6mbEq4wnIN~$MIux&Gs#u5g&2o5clf$4gdKs24>%!T`l&_S2(06QMEU`%xCOUaxy|We*s8a>T99$*uc%S9&?i{3pI8H)Hxug;p++D?7VbTxsU^zopr02S=r6951J diff --git a/packages/nodes-base/nodes/MongoDb/mongodb.svg b/packages/nodes-base/nodes/MongoDb/mongodb.svg new file mode 100644 index 0000000000..80d3a99ac2 --- /dev/null +++ b/packages/nodes-base/nodes/MongoDb/mongodb.svg @@ -0,0 +1 @@ + \ No newline at end of file From 15ec1f1f4d27ef410106280b6200d370203ee045 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Wed, 10 Mar 2021 12:36:26 -0500 Subject: [PATCH 018/137] :zap: Add field "mobile phone" to lead resource (Salesforce) (#1522) --- .../nodes/Salesforce/LeadDescription.ts | 14 ++++++++++++++ .../nodes-base/nodes/Salesforce/LeadInterface.ts | 1 + .../nodes/Salesforce/Salesforce.node.ts | 8 +++++++- .../nodes-base/nodes/Salesforce/salesforce.png | Bin 2038 -> 0 bytes .../nodes-base/nodes/Salesforce/salesforce.svg | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) delete mode 100644 packages/nodes-base/nodes/Salesforce/salesforce.png create mode 100644 packages/nodes-base/nodes/Salesforce/salesforce.svg diff --git a/packages/nodes-base/nodes/Salesforce/LeadDescription.ts b/packages/nodes-base/nodes/Salesforce/LeadDescription.ts index 802b20c3bd..402c39792a 100644 --- a/packages/nodes-base/nodes/Salesforce/LeadDescription.ts +++ b/packages/nodes-base/nodes/Salesforce/LeadDescription.ts @@ -229,6 +229,13 @@ export const leadFields = [ default: '', description: 'Source from which the lead was obtained.', }, + { + displayName: 'Mobile Phone', + name: 'mobilePhone', + type: 'string', + default: '', + description: `Contact’s mobile phone number.`, + }, { displayName: 'Number Of Employees', name: 'numberOfEmployees', @@ -480,6 +487,13 @@ export const leadFields = [ default: '', description: 'Source from which the lead was obtained.', }, + { + displayName: 'Mobile Phone', + name: 'mobilePhone', + type: 'string', + default: '', + description: `Contact’s mobile phone number.`, + }, { displayName: 'Number Of Employees', name: 'numberOfEmployees', diff --git a/packages/nodes-base/nodes/Salesforce/LeadInterface.ts b/packages/nodes-base/nodes/Salesforce/LeadInterface.ts index 227e5fe255..02196961ed 100644 --- a/packages/nodes-base/nodes/Salesforce/LeadInterface.ts +++ b/packages/nodes-base/nodes/Salesforce/LeadInterface.ts @@ -22,4 +22,5 @@ export interface ILead { AnnualRevenue?: number; IsUnreadByOwner?: boolean; NumberOfEmployees?: number; + MobilePhone?: string; } diff --git a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts index 3afec9ae58..f043c0fc94 100644 --- a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts +++ b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts @@ -114,7 +114,7 @@ export class Salesforce implements INodeType { description: INodeTypeDescription = { displayName: 'Salesforce', name: 'salesforce', - icon: 'file:salesforce.png', + icon: 'file:salesforce.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', @@ -930,6 +930,9 @@ export class Salesforce implements INodeType { if (additionalFields.numberOfEmployees !== undefined) { body.NumberOfEmployees = additionalFields.numberOfEmployees as number; } + if (additionalFields.mobilePhone !== undefined) { + body.MobilePhone = additionalFields.mobilePhone as string; + } if (additionalFields.customFieldsUi) { const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[]; if (customFields) { @@ -1019,6 +1022,9 @@ export class Salesforce implements INodeType { if (updateFields.numberOfEmployees !== undefined) { body.NumberOfEmployees = updateFields.numberOfEmployees as number; } + if (updateFields.mobilePhone !== undefined) { + body.MobilePhone = updateFields.mobilePhone as string; + } if (updateFields.customFieldsUi) { const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[]; if (customFields) { diff --git a/packages/nodes-base/nodes/Salesforce/salesforce.png b/packages/nodes-base/nodes/Salesforce/salesforce.png deleted file mode 100644 index aca78c51abfd5df3eab04ca5d743fec960557242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2038 zcmVLb;sK)J0-@pnqvHai;sK%I0iodnqT&Lf z-~poI0-@moq2U6d;Q^uG0HWdoq2U0b;{l=J0iodnqT&Ie;sK%I0iodmq2U6d-~giI z0HELjq2U6d-~yuK0iogmqTvCf;{u@H0G{3jq2BO;BbAFJZ+`26Sg{IuisQNHQa?)iey@44mnpWE`A+473h@N&xSYsl-c8H>tMs{0F>LW;q{W%@rBXvN4e)Wv*jtSHT2#i5&HNhRw#)v#_?&dRrR zK^)k3X;Ct`l-khW000I#Nkl?@8EuZ|L~` zAE0MDfs{~aAn*0{J^t`KB>U$(>2#9fde^(&_5aE3_ITX(p?gSA%gtjhe(SYJ|LjO0 zurM+)_ZzlhdgmS>(mOKa6BJ2O6`?QkF^H6>9O#JYS)5lTg%Fk`jgw#Er;|U?u0&_%FB3?Ai?Fuf22KFRNYVY7@uj?-x7yX>|X$Wc+ zN1~HGST{PYN(SLLLEwlXN%QD{`|s?W?Nu7cR;=V3bM;e|LkAr3oUo^av8i5;2=ski zMP@ry`!uW>Z4OL%&{lV&%kccP@18-ajp+~!mFFLo@mzEWZFGQt;-aCSqa1l!h-?=Z z{frU)rGIE@W@WDt5b7Mt3w%o>6N!d{NNs`o2MnIPO&rlea}QL!`m#sfEMCwi{m6Rgdrcs3 z7shlD-EKnrF`&9ZjYhCBo6vAnAl(qJjv%eOmJ&hf!xYvGQ|$>TCGDcLt+Z{Vc^c4B zrM(_RXfG6HG4-se>SVAPr*q?NqZH_F@i8?8m8~5LsS?fG_*lJrjDXkSFA2(ja}6^b7?IzP%lW{qtY3Ef>Q#{i1O zyPcvKD;KuYdUB<39D`>1^4d)Iuw)N?ea&1wh~MRwYYCRfC9~hui->=WHr(4ESw3hoc;485+x;%Cr(o7GrXeZA13^ z$*Gw+DYHtEl~1Y_N;b1;*kZe4g>A@rR;bcbc0u;xhFzRovNf67(B2*=NS)*kbd?p- zBIwn%jZL-%*$t?z?v{60A;S{K`!a~@30+UD0*K$1put_!kX~o3p1d>@LS{WGE#-77v&8dLo4ZQkQiR z?+E(W+EHjI-!L?{u|g~CsK8coMRo>e{$!JFXVPVQv5_X{EK^~(qPWcpxgEB3@+|?N zZ?c=Ki~VDEc6GH|1skeY-zEW)mEB5}lB<0HNUz*x zs2;m0UxIvkK!IY>?j=B~nt>Ft>MJ?WGb<~1Nhc{NxF!nD?{O_TL=>TM0%ErkHW{A5 zI%Zg2q)rjO4_KQbDeKYZQz*{LeJ=mF!nb8MCk3=zk|d-{@mgA^Ee{c-+BbMaHBw(c z2Gp3{PcI9q=Y=bHd5tmd?_hGaTi`FIz5p89!FtE?@C6B4$YakYgP2LXBu@1;CjPL- zb&WYbflN!IMwgJh*0l?8H=#5m@#E?(H z^rK=9GA09aZ)Z9&I5yHh6&ef;1xCGgzUYD+3ifp4raNl;*`;e-l07*qoM6N<$f=j0eRsaA1 diff --git a/packages/nodes-base/nodes/Salesforce/salesforce.svg b/packages/nodes-base/nodes/Salesforce/salesforce.svg new file mode 100644 index 0000000000..1de81b28ff --- /dev/null +++ b/packages/nodes-base/nodes/Salesforce/salesforce.svg @@ -0,0 +1 @@ + \ No newline at end of file From 1842c7158b704d2c23ac1cea5605acdcf5308ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 10 Mar 2021 14:50:12 -0300 Subject: [PATCH 019/137] :Sparkles: Add create playlist and get new releases - Spotify (#1520) * :sparkles: Create playlist in Spotify node * Add create operation to Spotify node * Add description and public properties to playlist resource type * :zap: Refactor playlist:create * :zap: Add album:getNewReleases * :art: Replace PNG with SVG icon * :zap: Small improvements Co-authored-by: Gerard Louw Co-authored-by: ricardo --- .../nodes/Spotify/GenericFunctions.ts | 4 +- .../nodes/Spotify/IsoCountryCodes.ts | 1000 +++++++++++++++++ .../nodes-base/nodes/Spotify/Spotify.node.ts | 259 ++++- packages/nodes-base/nodes/Spotify/spotify.png | Bin 2789 -> 0 bytes packages/nodes-base/nodes/Spotify/spotify.svg | 1 + 5 files changed, 1204 insertions(+), 60 deletions(-) create mode 100644 packages/nodes-base/nodes/Spotify/IsoCountryCodes.ts delete mode 100644 packages/nodes-base/nodes/Spotify/spotify.png create mode 100644 packages/nodes-base/nodes/Spotify/spotify.svg diff --git a/packages/nodes-base/nodes/Spotify/GenericFunctions.ts b/packages/nodes-base/nodes/Spotify/GenericFunctions.ts index 539b43f1cb..8c91c4957c 100644 --- a/packages/nodes-base/nodes/Spotify/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Spotify/GenericFunctions.ts @@ -1,4 +1,6 @@ -import { OptionsWithUri } from 'request'; +import { + OptionsWithUri, +} from 'request'; import { IExecuteFunctions, diff --git a/packages/nodes-base/nodes/Spotify/IsoCountryCodes.ts b/packages/nodes-base/nodes/Spotify/IsoCountryCodes.ts new file mode 100644 index 0000000000..0358d866e1 --- /dev/null +++ b/packages/nodes-base/nodes/Spotify/IsoCountryCodes.ts @@ -0,0 +1,1000 @@ +// `getNewReleases` requires an ISO 3166-1 alpha-2 country code + +export const isoCountryCodes = [ + { + name: 'Afghanistan', + alpha2: 'AF', + }, + { + name: 'Åland Islands', + alpha2: 'AX', + }, + { + name: 'Albania', + alpha2: 'AL', + }, + { + name: 'Algeria', + alpha2: 'DZ', + }, + { + name: 'American Samoa', + alpha2: 'AS', + }, + { + name: 'Andorra', + alpha2: 'AD', + }, + { + name: 'Angola', + alpha2: 'AO', + }, + { + name: 'Anguilla', + alpha2: 'AI', + }, + { + name: 'Antarctica', + alpha2: 'AQ', + }, + { + name: 'Antigua and Barbuda', + alpha2: 'AG', + }, + { + name: 'Argentina', + alpha2: 'AR', + }, + { + name: 'Armenia', + alpha2: 'AM', + }, + { + name: 'Aruba', + alpha2: 'AW', + }, + { + name: 'Australia', + alpha2: 'AU', + }, + { + name: 'Austria', + alpha2: 'AT', + }, + { + name: 'Azerbaijan', + alpha2: 'AZ', + }, + { + name: 'Bahamas (the)', + alpha2: 'BS', + }, + { + name: 'Bahrain', + alpha2: 'BH', + }, + { + name: 'Bangladesh', + alpha2: 'BD', + }, + { + name: 'Barbados', + alpha2: 'BB', + }, + { + name: 'Belarus', + alpha2: 'BY', + }, + { + name: 'Belgium', + alpha2: 'BE', + }, + { + name: 'Belize', + alpha2: 'BZ', + }, + { + name: 'Benin', + alpha2: 'BJ', + }, + { + name: 'Bermuda', + alpha2: 'BM', + }, + { + name: 'Bhutan', + alpha2: 'BT', + }, + { + name: 'Bolivia (Plurinational State of)', + alpha2: 'BO', + }, + { + name: 'Bonaire, Sint Eustatius and Saba', + alpha2: 'BQ', + }, + { + name: 'Bosnia and Herzegovina', + alpha2: 'BA', + }, + { + name: 'Botswana', + alpha2: 'BW', + }, + { + name: 'Bouvet Island', + alpha2: 'BV', + }, + { + name: 'Brazil', + alpha2: 'BR', + }, + { + name: 'British Indian Ocean Territory (the)', + alpha2: 'IO', + }, + { + name: 'Brunei Darussalam', + alpha2: 'BN', + }, + { + name: 'Bulgaria', + alpha2: 'BG', + }, + { + name: 'Burkina Faso', + alpha2: 'BF', + }, + { + name: 'Burundi', + alpha2: 'BI', + }, + { + name: 'Cabo Verde', + alpha2: 'CV', + }, + { + name: 'Cambodia', + alpha2: 'KH', + }, + { + name: 'Cameroon', + alpha2: 'CM', + }, + { + name: 'Canada', + alpha2: 'CA', + }, + { + name: 'Cayman Islands (the)', + alpha2: 'KY', + }, + { + name: 'Central African Republic (the)', + alpha2: 'CF', + }, + { + name: 'Chad', + alpha2: 'TD', + }, + { + name: 'Chile', + alpha2: 'CL', + }, + { + name: 'China', + alpha2: 'CN', + }, + { + name: 'Christmas Island', + alpha2: 'CX', + }, + { + name: 'Cocos (Keeling) Islands (the)', + alpha2: 'CC', + }, + { + name: 'Colombia', + alpha2: 'CO', + }, + { + name: 'Comoros (the)', + alpha2: 'KM', + }, + { + name: 'Congo (the Democratic Republic of the)', + alpha2: 'CD', + }, + { + name: 'Congo (the)', + alpha2: 'CG', + }, + { + name: 'Cook Islands (the)', + alpha2: 'CK', + }, + { + name: 'Costa Rica', + alpha2: 'CR', + }, + { + name: 'Côte d\'Ivoire', + alpha2: 'CI', + }, + { + name: 'Croatia', + alpha2: 'HR', + }, + { + name: 'Cuba', + alpha2: 'CU', + }, + { + name: 'Curaçao', + alpha2: 'CW', + }, + { + name: 'Cyprus', + alpha2: 'CY', + }, + { + name: 'Czechia', + alpha2: 'CZ', + }, + { + name: 'Denmark', + alpha2: 'DK', + }, + { + name: 'Djibouti', + alpha2: 'DJ', + }, + { + name: 'Dominica', + alpha2: 'DM', + }, + { + name: 'Dominican Republic (the)', + alpha2: 'DO', + }, + { + name: 'Ecuador', + alpha2: 'EC', + }, + { + name: 'Egypt', + alpha2: 'EG', + }, + { + name: 'El Salvador', + alpha2: 'SV', + }, + { + name: 'Equatorial Guinea', + alpha2: 'GQ', + }, + { + name: 'Eritrea', + alpha2: 'ER', + }, + { + name: 'Estonia', + alpha2: 'EE', + }, + { + name: 'Ethiopia', + alpha2: 'ET', + }, + { + name: 'Falkland Islands (the) [Malvinas]', + alpha2: 'FK', + }, + { + name: 'Faroe Islands (the)', + alpha2: 'FO', + }, + { + name: 'Fiji', + alpha2: 'FJ', + }, + { + name: 'Finland', + alpha2: 'FI', + }, + { + name: 'France', + alpha2: 'FR', + }, + { + name: 'French Guiana', + alpha2: 'GF', + }, + { + name: 'French Polynesia', + alpha2: 'PF', + }, + { + name: 'French Southern Territories (the)', + alpha2: 'TF', + }, + { + name: 'Gabon', + alpha2: 'GA', + }, + { + name: 'Gambia (the)', + alpha2: 'GM', + }, + { + name: 'Georgia', + alpha2: 'GE', + }, + { + name: 'Germany', + alpha2: 'DE', + }, + { + name: 'Ghana', + alpha2: 'GH', + }, + { + name: 'Gibraltar', + alpha2: 'GI', + }, + { + name: 'Greece', + alpha2: 'GR', + }, + { + name: 'Greenland', + alpha2: 'GL', + }, + { + name: 'Grenada', + alpha2: 'GD', + }, + { + name: 'Guadeloupe', + alpha2: 'GP', + }, + { + name: 'Guam', + alpha2: 'GU', + }, + { + name: 'Guatemala', + alpha2: 'GT', + }, + { + name: 'Guernsey', + alpha2: 'GG', + }, + { + name: 'Guinea', + alpha2: 'GN', + }, + { + name: 'Guinea-Bissau', + alpha2: 'GW', + }, + { + name: 'Guyana', + alpha2: 'GY', + }, + { + name: 'Haiti', + alpha2: 'HT', + }, + { + name: 'Heard Island and McDonald Islands', + alpha2: 'HM', + }, + { + name: 'Holy See (the)', + alpha2: 'VA', + }, + { + name: 'Honduras', + alpha2: 'HN', + }, + { + name: 'Hong Kong', + alpha2: 'HK', + }, + { + name: 'Hungary', + alpha2: 'HU', + }, + { + name: 'Iceland', + alpha2: 'IS', + }, + { + name: 'India', + alpha2: 'IN', + }, + { + name: 'Indonesia', + alpha2: 'ID', + }, + { + name: 'Iran (Islamic Republic of)', + alpha2: 'IR', + }, + { + name: 'Iraq', + alpha2: 'IQ', + }, + { + name: 'Ireland', + alpha2: 'IE', + }, + { + name: 'Isle of Man', + alpha2: 'IM', + }, + { + name: 'Israel', + alpha2: 'IL', + }, + { + name: 'Italy', + alpha2: 'IT', + }, + { + name: 'Jamaica', + alpha2: 'JM', + }, + { + name: 'Japan', + alpha2: 'JP', + }, + { + name: 'Jersey', + alpha2: 'JE', + }, + { + name: 'Jordan', + alpha2: 'JO', + }, + { + name: 'Kazakhstan', + alpha2: 'KZ', + }, + { + name: 'Kenya', + alpha2: 'KE', + }, + { + name: 'Kiribati', + alpha2: 'KI', + }, + { + name: 'Korea (the Democratic People\'s Republic of)', + alpha2: 'KP', + }, + { + name: 'Korea (the Republic of)', + alpha2: 'KR', + }, + { + name: 'Kuwait', + alpha2: 'KW', + }, + { + name: 'Kyrgyzstan', + alpha2: 'KG', + }, + { + name: 'Lao People\'s Democratic Republic (the)', + alpha2: 'LA', + }, + { + name: 'Latvia', + alpha2: 'LV', + }, + { + name: 'Lebanon', + alpha2: 'LB', + }, + { + name: 'Lesotho', + alpha2: 'LS', + }, + { + name: 'Liberia', + alpha2: 'LR', + }, + { + name: 'Libya', + alpha2: 'LY', + }, + { + name: 'Liechtenstein', + alpha2: 'LI', + }, + { + name: 'Lithuania', + alpha2: 'LT', + }, + { + name: 'Luxembourg', + alpha2: 'LU', + }, + { + name: 'Macao', + alpha2: 'MO', + }, + { + name: 'Macedonia (the former Yugoslav Republic of)', + alpha2: 'MK', + }, + { + name: 'Madagascar', + alpha2: 'MG', + }, + { + name: 'Malawi', + alpha2: 'MW', + }, + { + name: 'Malaysia', + alpha2: 'MY', + }, + { + name: 'Maldives', + alpha2: 'MV', + }, + { + name: 'Mali', + alpha2: 'ML', + }, + { + name: 'Malta', + alpha2: 'MT', + }, + { + name: 'Marshall Islands (the)', + alpha2: 'MH', + }, + { + name: 'Martinique', + alpha2: 'MQ', + }, + { + name: 'Mauritania', + alpha2: 'MR', + }, + { + name: 'Mauritius', + alpha2: 'MU', + }, + { + name: 'Mayotte', + alpha2: 'YT', + }, + { + name: 'Mexico', + alpha2: 'MX', + }, + { + name: 'Micronesia (Federated States of)', + alpha2: 'FM', + }, + { + name: 'Moldova (the Republic of)', + alpha2: 'MD', + }, + { + name: 'Monaco', + alpha2: 'MC', + }, + { + name: 'Mongolia', + alpha2: 'MN', + }, + { + name: 'Montenegro', + alpha2: 'ME', + }, + { + name: 'Montserrat', + alpha2: 'MS', + }, + { + name: 'Morocco', + alpha2: 'MA', + }, + { + name: 'Mozambique', + alpha2: 'MZ', + }, + { + name: 'Myanmar', + alpha2: 'MM', + }, + { + name: 'Namibia', + alpha2: 'NA', + }, + { + name: 'Nauru', + alpha2: 'NR', + }, + { + name: 'Nepal', + alpha2: 'NP', + }, + { + name: 'Netherlands (the)', + alpha2: 'NL', + }, + { + name: 'New Caledonia', + alpha2: 'NC', + }, + { + name: 'New Zealand', + alpha2: 'NZ', + }, + { + name: 'Nicaragua', + alpha2: 'NI', + }, + { + name: 'Niger (the)', + alpha2: 'NE', + }, + { + name: 'Nigeria', + alpha2: 'NG', + }, + { + name: 'Niue', + alpha2: 'NU', + }, + { + name: 'Norfolk Island', + alpha2: 'NF', + }, + { + name: 'Northern Mariana Islands (the)', + alpha2: 'MP', + }, + { + name: 'Norway', + alpha2: 'NO', + }, + { + name: 'Oman', + alpha2: 'OM', + }, + { + name: 'Pakistan', + alpha2: 'PK', + }, + { + name: 'Palau', + alpha2: 'PW', + }, + { + name: 'Palestine, State of', + alpha2: 'PS', + }, + { + name: 'Panama', + alpha2: 'PA', + }, + { + name: 'Papua New Guinea', + alpha2: 'PG', + }, + { + name: 'Paraguay', + alpha2: 'PY', + }, + { + name: 'Peru', + alpha2: 'PE', + }, + { + name: 'Philippines (the)', + alpha2: 'PH', + }, + { + name: 'Pitcairn', + alpha2: 'PN', + }, + { + name: 'Poland', + alpha2: 'PL', + }, + { + name: 'Portugal', + alpha2: 'PT', + }, + { + name: 'Puerto Rico', + alpha2: 'PR', + }, + { + name: 'Qatar', + alpha2: 'QA', + }, + { + name: 'Réunion', + alpha2: 'RE', + }, + { + name: 'Romania', + alpha2: 'RO', + }, + { + name: 'Russian Federation (the)', + alpha2: 'RU', + }, + { + name: 'Rwanda', + alpha2: 'RW', + }, + { + name: 'Saint Barthélemy', + alpha2: 'BL', + }, + { + name: 'Saint Helena, Ascension and Tristan da Cunha', + alpha2: 'SH', + }, + { + name: 'Saint Kitts and Nevis', + alpha2: 'KN', + }, + { + name: 'Saint Lucia', + alpha2: 'LC', + }, + { + name: 'Saint Martin (French part)', + alpha2: 'MF', + }, + { + name: 'Saint Pierre and Miquelon', + alpha2: 'PM', + }, + { + name: 'Saint Vincent and the Grenadines', + alpha2: 'VC', + }, + { + name: 'Samoa', + alpha2: 'WS', + }, + { + name: 'San Marino', + alpha2: 'SM', + }, + { + name: 'Sao Tome and Principe', + alpha2: 'ST', + }, + { + name: 'Saudi Arabia', + alpha2: 'SA', + }, + { + name: 'Senegal', + alpha2: 'SN', + }, + { + name: 'Serbia', + alpha2: 'RS', + }, + { + name: 'Seychelles', + alpha2: 'SC', + }, + { + name: 'Sierra Leone', + alpha2: 'SL', + }, + { + name: 'Singapore', + alpha2: 'SG', + }, + { + name: 'Sint Maarten (Dutch part)', + alpha2: 'SX', + }, + { + name: 'Slovakia', + alpha2: 'SK', + }, + { + name: 'Slovenia', + alpha2: 'SI', + }, + { + name: 'Solomon Islands', + alpha2: 'SB', + }, + { + name: 'Somalia', + alpha2: 'SO', + }, + { + name: 'South Africa', + alpha2: 'ZA', + }, + { + name: 'South Georgia and the South Sandwich Islands', + alpha2: 'GS', + }, + { + name: 'South Sudan', + alpha2: 'SS', + }, + { + name: 'Spain', + alpha2: 'ES', + }, + { + name: 'Sri Lanka', + alpha2: 'LK', + }, + { + name: 'Sudan (the)', + alpha2: 'SD', + }, + { + name: 'Suriname', + alpha2: 'SR', + }, + { + name: 'Svalbard and Jan Mayen', + alpha2: 'SJ', + }, + { + name: 'Swaziland', + alpha2: 'SZ', + }, + { + name: 'Sweden', + alpha2: 'SE', + }, + { + name: 'Switzerland', + alpha2: 'CH', + }, + { + name: 'Syrian Arab Republic', + alpha2: 'SY', + }, + { + name: 'Taiwan (Province of China)', + alpha2: 'TW', + }, + { + name: 'Tajikistan', + alpha2: 'TJ', + }, + { + name: 'Tanzania, United Republic of', + alpha2: 'TZ', + }, + { + name: 'Thailand', + alpha2: 'TH', + }, + { + name: 'Timor-Leste', + alpha2: 'TL', + }, + { + name: 'Togo', + alpha2: 'TG', + }, + { + name: 'Tokelau', + alpha2: 'TK', + }, + { + name: 'Tonga', + alpha2: 'TO', + }, + { + name: 'Trinidad and Tobago', + alpha2: 'TT', + }, + { + name: 'Tunisia', + alpha2: 'TN', + }, + { + name: 'Turkey', + alpha2: 'TR', + }, + { + name: 'Turkmenistan', + alpha2: 'TM', + }, + { + name: 'Turks and Caicos Islands (the)', + alpha2: 'TC', + }, + { + name: 'Tuvalu', + alpha2: 'TV', + }, + { + name: 'Uganda', + alpha2: 'UG', + }, + { + name: 'Ukraine', + alpha2: 'UA', + }, + { + name: 'United Arab Emirates (the)', + alpha2: 'AE', + }, + { + name: 'United Kingdom of Great Britain and Northern Ireland (the)', + alpha2: 'GB', + }, + { + name: 'United States Minor Outlying Islands (the)', + alpha2: 'UM', + }, + { + name: 'United States of America (the)', + alpha2: 'US', + }, + { + name: 'Uruguay', + alpha2: 'UY', + }, + { + name: 'Uzbekistan', + alpha2: 'UZ', + }, + { + name: 'Vanuatu', + alpha2: 'VU', + }, + { + name: 'Venezuela (Bolivarian Republic of)', + alpha2: 'VE', + }, + { + name: 'Viet Nam', + alpha2: 'VN', + }, + { + name: 'Virgin Islands (British)', + alpha2: 'VG', + }, + { + name: 'Virgin Islands (U.S.)', + alpha2: 'VI', + }, + { + name: 'Wallis and Futuna', + alpha2: 'WF', + }, + { + name: 'Western Sahara*', + alpha2: 'EH', + }, + { + name: 'Yemen', + alpha2: 'YE', + }, + { + name: 'Zambia', + alpha2: 'ZM', + }, + { + name: 'Zimbabwe', + alpha2: 'ZW', + }, +]; diff --git a/packages/nodes-base/nodes/Spotify/Spotify.node.ts b/packages/nodes-base/nodes/Spotify/Spotify.node.ts index 662d5d8d4d..7bbcfedc96 100644 --- a/packages/nodes-base/nodes/Spotify/Spotify.node.ts +++ b/packages/nodes-base/nodes/Spotify/Spotify.node.ts @@ -14,11 +14,15 @@ import { spotifyApiRequestAllItems, } from './GenericFunctions'; +import { + isoCountryCodes +} from './IsoCountryCodes'; + export class Spotify implements INodeType { description: INodeTypeDescription = { displayName: 'Spotify', name: 'spotify', - icon: 'file:spotify.png', + icon: 'file:spotify.svg', group: ['input'], version: 1, description: 'Access public song data via the Spotify API.', @@ -183,6 +187,11 @@ export class Spotify implements INodeType { value: 'get', description: 'Get an album by URI or ID.', }, + { + name: 'Get New Releases', + value: 'getNewReleases', + description: 'Get a list of new album releases.', + }, { name: `Get Tracks`, value: 'getTracks', @@ -203,6 +212,10 @@ export class Spotify implements INodeType { resource: [ 'album', ], + operation: [ + 'get', + 'getTracks', + ], }, }, placeholder: 'spotify:album:1YZ3k65Mqw3G8FzYlW1mmp', @@ -304,6 +317,11 @@ export class Spotify implements INodeType { value: 'add', description: 'Add tracks from a playlist by track and playlist URI or ID.', }, + { + name: 'Create a Playlist', + value: 'create', + description: 'Create a new playlist.', + }, { name: 'Get', value: 'get', @@ -350,6 +368,59 @@ export class Spotify implements INodeType { placeholder: 'spotify:playlist:37i9dQZF1DWUhI3iC1khPH', description: `The playlist's Spotify URI or its ID.`, }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'playlist', + ], + operation: [ + 'create', + ], + }, + }, + placeholder: 'Favorite Songs', + description: 'Name of the playlist to create.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'playlist', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + placeholder: 'These are all my favorite songs.', + description: 'Description for the playlist to create.', + }, + { + displayName: 'Public', + name: 'public', + type: 'boolean', + default: true, + description: 'Whether the playlist is publicly accessible.', + }, + ], + }, { displayName: 'Track ID', name: 'trackID', @@ -433,6 +504,7 @@ export class Spotify implements INodeType { 'getTracks', 'getAlbums', 'getUserPlaylists', + 'getNewReleases', ], }, }, @@ -455,6 +527,7 @@ export class Spotify implements INodeType { 'getTracks', 'getAlbums', 'getUserPlaylists', + 'getNewReleases', ], returnAll: [ false, @@ -489,6 +562,33 @@ export class Spotify implements INodeType { }, description: `The number of items to return.`, }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'album', + ], + operation: [ + 'getNewReleases', + ], + }, + }, + options: [ + { + displayName: 'Country', + name: 'country', + type: 'options', + default: 'US', + options: isoCountryCodes.map(({ name, alpha2 }) => ({ name, value: alpha2 })), + description: 'Country to filter new releases by.', + }, + ], + }, ], }; @@ -519,12 +619,12 @@ export class Spotify implements INodeType { qs = {}; returnAll = false; - for(let i = 0; i < items.length; i++) { + for (let i = 0; i < items.length; i++) { // ----------------------------- // Player Operations // ----------------------------- - if( resource === 'player' ) { - if(operation === 'pause') { + if (resource === 'player') { + if (operation === 'pause') { requestMethod = 'PUT'; endpoint = `/me/player/pause`; @@ -533,7 +633,7 @@ export class Spotify implements INodeType { responseData = { success: true }; - } else if(operation === 'recentlyPlayed') { + } else if (operation === 'recentlyPlayed') { requestMethod = 'GET'; endpoint = `/me/player/recently-played`; @@ -548,14 +648,14 @@ export class Spotify implements INodeType { responseData = responseData.items; - } else if(operation === 'currentlyPlaying') { + } else if (operation === 'currentlyPlaying') { requestMethod = 'GET'; endpoint = `/me/player/currently-playing`; responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); - } else if(operation === 'nextSong') { + } else if (operation === 'nextSong') { requestMethod = 'POST'; endpoint = `/me/player/next`; @@ -564,7 +664,7 @@ export class Spotify implements INodeType { responseData = { success: true }; - } else if(operation === 'previousSong') { + } else if (operation === 'previousSong') { requestMethod = 'POST'; endpoint = `/me/player/previous`; @@ -573,7 +673,7 @@ export class Spotify implements INodeType { responseData = { success: true }; - } else if(operation === 'startMusic') { + } else if (operation === 'startMusic') { requestMethod = 'PUT'; endpoint = `/me/player/play`; @@ -586,7 +686,7 @@ export class Spotify implements INodeType { responseData = { success: true }; - } else if(operation === 'addSongToQueue') { + } else if (operation === 'addSongToQueue') { requestMethod = 'POST'; endpoint = `/me/player/queue`; @@ -601,22 +701,48 @@ export class Spotify implements INodeType { responseData = { success: true }; } - // ----------------------------- - // Album Operations - // ----------------------------- - } else if( resource === 'album') { - const uri = this.getNodeParameter('id', i) as string; + // ----------------------------- + // Album Operations + // ----------------------------- + } else if (resource === 'album') { - const id = uri.replace('spotify:album:', ''); + if (operation === 'get') { + const uri = this.getNodeParameter('id', i) as string; - requestMethod = 'GET'; + const id = uri.replace('spotify:album:', ''); + + requestMethod = 'GET'; - if(operation === 'get') { endpoint = `/albums/${id}`; responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); - } else if(operation === 'getTracks') { + } else if (operation === 'getNewReleases') { + + endpoint = '/browse/new-releases'; + requestMethod = 'GET'; + + const filters = this.getNodeParameter('filters', i) as IDataObject; + + if (Object.keys(filters).length) { + Object.assign(qs, filters); + } + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + + if (!returnAll) { + qs.limit = this.getNodeParameter('limit', i); + responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); + responseData = responseData.albums.items; + } + + } else if (operation === 'getTracks') { + const uri = this.getNodeParameter('id', i) as string; + + const id = uri.replace('spotify:album:', ''); + + requestMethod = 'GET'; + endpoint = `/albums/${id}/tracks`; propertyName = 'tracks'; @@ -625,7 +751,7 @@ export class Spotify implements INodeType { propertyName = 'items'; - if(!returnAll) { + if (!returnAll) { const limit = this.getNodeParameter('limit', i) as number; qs = { @@ -637,15 +763,15 @@ export class Spotify implements INodeType { responseData = responseData.items; } } - // ----------------------------- - // Artist Operations - // ----------------------------- - } else if( resource === 'artist') { + // ----------------------------- + // Artist Operations + // ----------------------------- + } else if (resource === 'artist') { const uri = this.getNodeParameter('id', i) as string; const id = uri.replace('spotify:artist:', ''); - if(operation === 'getAlbums') { + if (operation === 'getAlbums') { endpoint = `/artists/${id}/albums`; @@ -653,7 +779,7 @@ export class Spotify implements INodeType { propertyName = 'items'; - if(!returnAll) { + if (!returnAll) { const limit = this.getNodeParameter('limit', i) as number; qs = { @@ -664,7 +790,7 @@ export class Spotify implements INodeType { responseData = responseData.items; } - } else if(operation === 'getRelatedArtists') { + } else if (operation === 'getRelatedArtists') { endpoint = `/artists/${id}/related-artists`; @@ -672,7 +798,7 @@ export class Spotify implements INodeType { responseData = responseData.artists; - } else if(operation === 'getTopTracks'){ + } else if (operation === 'getTopTracks') { const country = this.getNodeParameter('country', i) as string; qs = { @@ -693,23 +819,23 @@ export class Spotify implements INodeType { responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); } - // ----------------------------- - // Playlist Operations - // ----------------------------- - } else if( resource === 'playlist') { - if(['delete', 'get', 'getTracks', 'add'].includes(operation)) { + // ----------------------------- + // Playlist Operations + // ----------------------------- + } else if (resource === 'playlist') { + if (['delete', 'get', 'getTracks', 'add'].includes(operation)) { const uri = this.getNodeParameter('id', i) as string; const id = uri.replace('spotify:playlist:', ''); - if(operation === 'delete') { + if (operation === 'delete') { requestMethod = 'DELETE'; const trackId = this.getNodeParameter('trackID', i) as string; body.tracks = [ { uri: `${trackId}`, - positions: [ 0 ], + positions: [0], }, ]; @@ -719,14 +845,14 @@ export class Spotify implements INodeType { responseData = { success: true }; - } else if(operation === 'get') { + } else if (operation === 'get') { requestMethod = 'GET'; endpoint = `/playlists/${id}`; responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); - } else if(operation === 'getTracks') { + } else if (operation === 'getTracks') { requestMethod = 'GET'; endpoint = `/playlists/${id}/tracks`; @@ -735,7 +861,7 @@ export class Spotify implements INodeType { propertyName = 'items'; - if(!returnAll) { + if (!returnAll) { const limit = this.getNodeParameter('limit', i) as number; qs = { @@ -746,7 +872,7 @@ export class Spotify implements INodeType { responseData = responseData.items; } - } else if(operation === 'add') { + } else if (operation === 'add') { requestMethod = 'POST'; const trackId = this.getNodeParameter('trackID', i) as string; @@ -760,47 +886,62 @@ export class Spotify implements INodeType { responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); } - } else if(operation === 'getUserPlaylists') { - requestMethod = 'GET'; + } else if (operation === 'getUserPlaylists') { + requestMethod = 'GET'; - endpoint = '/me/playlists'; + endpoint = '/me/playlists'; - returnAll = this.getNodeParameter('returnAll', i) as boolean; + returnAll = this.getNodeParameter('returnAll', i) as boolean; - propertyName = 'items'; + propertyName = 'items'; - if(!returnAll) { - const limit = this.getNodeParameter('limit', i) as number; + if (!returnAll) { + const limit = this.getNodeParameter('limit', i) as number; - qs = { - limit, - }; + qs = { + limit, + }; - responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); + responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); - responseData = responseData.items; - } + responseData = responseData.items; } - // ----------------------------- - // Track Operations - // ----------------------------- - } else if( resource === 'track') { + + } else if (operation === 'create') { + + // https://developer.spotify.com/console/post-playlists/ + + body.name = this.getNodeParameter('name', i) as string; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, additionalFields); + } + + responseData = await spotifyApiRequest.call(this, 'POST', '/me/playlists', body, qs); + } + + // ----------------------------- + // Track Operations + // ----------------------------- + } else if (resource === 'track') { const uri = this.getNodeParameter('id', i) as string; const id = uri.replace('spotify:track:', ''); requestMethod = 'GET'; - if(operation === 'getAudioFeatures') { + if (operation === 'getAudioFeatures') { endpoint = `/audio-features/${id}`; - } else if(operation === 'get') { + } else if (operation === 'get') { endpoint = `/tracks/${id}`; } responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); } - if(returnAll) { + if (returnAll) { responseData = await spotifyApiRequestAllItems.call(this, propertyName, requestMethod, endpoint, body, qs); } diff --git a/packages/nodes-base/nodes/Spotify/spotify.png b/packages/nodes-base/nodes/Spotify/spotify.png deleted file mode 100644 index 14d3dea4ae38f40fa26f667cec624bcbe7c8d3d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2789 zcmV(N;D3)fpE*kT>n zU}4~h`2YVI)?O6WT|V1zisqv&*k-!%%tzdHgy^GF-+olzfav`60M}U_*kKpeT_o6J zaNv(f+;(cQ{8<&+HaKUtWDf_RNj7bb~S<>~~EZAlH z|NSf1WBLC3@cr~3yO zL+kqQx$noe?!=kst##s)W#EWl-i2D;fl}RlF4}4m;$kV+Vj9+7_5Jwr{r2tq@#OjH z;`r#$^x3BCxQ67Pf#aNT;gBQdXd2>V8QEU|)lTR7?85NQu9cI$jY!;gMcj2Y=WsLHY#`cY1=wK;-(L~e zTnE=$+4kYp_1<{mmTBONVc~{M+<7?MZY<|)C+BM(=4K<{W+d8W6y;+Z*<%6XUlrV6 z0N7sv+FQ-@*jC+tOXGP!>UTinb358_4drDa*0)^*xlXT-QC^Y-Q5Lq z?FNjF9}yH(u)DjvySuydc<T_#Jl zF-=;{NCEC8N`fdzM%#@W)a^xJ^X<2X4jp=X?qJ}BZ*aX_5LZOu<2)@3Z3>?|luD&e zo=>CESMh+cL|6b6d5^HM)3d@~IXs4^+va;CoWwaG?WlQ^m-5 zUZq{WphzyT>TfPL*mN#ca^2qq@R#+#x<9gcY8;5DbxKm9&xd!G>3FterB_-)k%i8O zE9REz7~7%jX0=84PpJB|`7d-5Bu}Nyfc-yuLB-C%T8u?%zLMF0 zdmhdP89Csl2efhVqVf8Z?dMGZBLzJD$sI!G2%L17u(?oHJ4xcY-*(U}{GKc3_^`8T z0mL0v%!GSfZk}GjFw6=YPr1^vCd_JQ!PEGp6%onANX|3)3BZz=g`yef`D^Rf?p?M7 z>iE9>8@|5d8JdciFp`MT+66g)<1q3RRd1(6bqh%sb8Fq2RS7${&o}EO8Rq+UC9Ga^ zWfRX(Eas5Rr(a$rg^(?1*aGZQ>yPf7FF|vnlJ{7-d(XoVLz%1u8l@Msisq~+jM&J1 z^h=P4LYeh*%;F~V79U&Zwy{>R*dq|A_NUY0IvuuRwSHc_y_gHJyYmxHglt>Lg&^Um zIyX#s!)IEZ2us|&ZGQib9e)4zr3QHqz1a+(?mA9+jDS`JT0p;x-cAnUAh`{Gxc8CW ztCsBDzv1e&8=Jmfd%S+_iOZ{YA6Y8!W)K75??2{96!@JDST5E52M&wupw=C|xMbZ; zCqvuZE|2Fw)?Elmle!b%9w3()vqUSU^}R+D21b9oD&$ ztX8krYsGw9T{b4PZqH&fz`<+VRS&DvXl{a;)c9E@*w#Xmm>>dM%*oRUv00rTAgL23o$?*wWxayEuPe|r7eeaDwA+xy_*#!Vc}9KP$r zj5-oyowi38=IOWXb^1`yWP$n!k^xj%6l>!)o>;wmmy~4l{B0{2U)*!@w40%}0N##K z{QhMd-9{8vIy@FZ3NA{AiY&Kg@wWK-N}v4+d)B$=yK{}G!{??s2V5_t8>ze~S=47Q ze;h)Fc?KDqBU}lUzjygG!(lk;utK{6TnxhLqVU`mm-O=`%rI~MJcC)>!XRwmU$v3B z<68((0X_)eqQR6=*mwAZ;N#+p$JXp!yMO(awfmOsS(PAm2;{e|zTqYzEL*N2Pd+2H zZ1?JYS3@?M=ACYeavr7`+Ie&RvZF`LBEDlS<&Z6dm}?(UNtI%G8_j!I6Bs9UC@=Wn z*y^I`*C#LS5Hg_OS`uyb`dh?RQKFRICM9|x(^5PO} zq*l0JZrHoz*wG6KKo^c4TXXU%$M6v_z%a{-)64c#(prt?#S{eT*p*{t_R8vnl_0zE z+P-+zzD-~N`EcwmO*v2rK2&-pm?Q(F7IRP!1yJrR`C{dzD^91$h+}}2lU)q~8h<8J z^crK=0@8_KO}FS%YGC&3t!Z~Rs zv>uEBi0^ppF~$s!&NDS5u$}!>YC`N1oU@qbdhH~O;{<`@ENQo5EJcS-et`b(S@CgL;8XfBTWSXs(;fG{|l>M)f5={e9u^Zk(&5VcJsj5A}i4)dIK8$ zANF>ZPEx=!-LcmqEe@MkIc@4-xsp=A@wUr64oA^HqscP|Kh+i1{h2PF_0*!&$x>Q=uPv_59K2q*4Ope{A0vB( zQ*XG;Y8EF@L7+1UBBeUh-Lu#G=T!WE1h-9-J?n<+Z{Fw4tWv2{CQGSSsk)?nfA;CM z3^`MXW)*Q{TH~QTK3xxoHwPC5H;2P#zVys6p}qJ_SxJN?rP?&BTPs7sf`v1Ttkb-0 rC;0O=vFx$3b*UKOOD8JPAFcibX0W1@_S4`U00000NkvXXu0mjfAYa6H diff --git a/packages/nodes-base/nodes/Spotify/spotify.svg b/packages/nodes-base/nodes/Spotify/spotify.svg new file mode 100644 index 0000000000..76fd7c810f --- /dev/null +++ b/packages/nodes-base/nodes/Spotify/spotify.svg @@ -0,0 +1 @@ + From 8d2371917f80b9ee740c1ee32f0484a7d23635ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 10 Mar 2021 19:51:05 -0300 Subject: [PATCH 020/137] :sparkles: Add Wise node (#1496) * :tada: Register node and credentials * :art: Add SVG icon * :zap: Add node stub * :zap: Update credentials registration * :zap: Add API credentials * :zap: Add generic functions stub * :zap: Update node stub * :zap: Add stubs for resource descriptions * :art: Fix SVG icon size and positioning * :hammer: Fix credentials casing * :zap: Implement account operations * :zap: Add borderless accounts to account:get * :zap: Remove redundant option * :zap: Complete account:get with statement * :zap: Implement exchangeRate:get * :zap: Implement profile:get and profile:getAll * :zap: Implement quote:create and quote:get * :zap: Add findRequiredFields for recipient:create * :fire: Remove resource per feedback * :zap: Implement transfer:create * :zap: Implement transfer:delete and transfer:get * :books: Add documentation links * :zap: Implement transfer:getAll * :zap: Implement transfer:execute * :zap: Simulate transfer completion for PDF receipt * :zap: Remove logging * :zap: Add missing divider * :zap: Add Wise Trigger and improvements * :hammer: Refactor account operations * :zap: Small improvement Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../credentials/WiseApi.credentials.ts | 34 ++ .../nodes-base/nodes/Wise/GenericFunctions.ts | 164 ++++++ packages/nodes-base/nodes/Wise/Wise.node.ts | 514 ++++++++++++++++++ .../nodes-base/nodes/Wise/WiseTrigger.node.ts | 189 +++++++ .../Wise/descriptions/AccountDescription.ts | 195 +++++++ .../descriptions/ExchangeRateDescription.ts | 140 +++++ .../Wise/descriptions/ProfileDescription.ts | 57 ++ .../Wise/descriptions/QuoteDescription.ts | 181 ++++++ .../Wise/descriptions/RecipientDescription.ts | 73 +++ .../Wise/descriptions/TransferDescription.ts | 460 ++++++++++++++++ .../nodes/Wise/descriptions/index.ts | 6 + packages/nodes-base/nodes/Wise/wise.svg | 4 + packages/nodes-base/package.json | 3 + 13 files changed, 2020 insertions(+) create mode 100644 packages/nodes-base/credentials/WiseApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Wise/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Wise/Wise.node.ts create mode 100644 packages/nodes-base/nodes/Wise/WiseTrigger.node.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/AccountDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/ExchangeRateDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/ProfileDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/QuoteDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/RecipientDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/TransferDescription.ts create mode 100644 packages/nodes-base/nodes/Wise/descriptions/index.ts create mode 100644 packages/nodes-base/nodes/Wise/wise.svg diff --git a/packages/nodes-base/credentials/WiseApi.credentials.ts b/packages/nodes-base/credentials/WiseApi.credentials.ts new file mode 100644 index 0000000000..7f9f871cbf --- /dev/null +++ b/packages/nodes-base/credentials/WiseApi.credentials.ts @@ -0,0 +1,34 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class WiseApi implements ICredentialType { + name = 'wiseApi'; + displayName = 'Wise API'; + documentationUrl = 'wise'; + properties = [ + { + displayName: 'API Token', + name: 'apiToken', + type: 'string' as NodePropertyTypes, + default: '', + }, + { + displayName: 'Environment', + name: 'environment', + type: 'options' as NodePropertyTypes, + default: 'live', + options: [ + { + name: 'Live', + value: 'live', + }, + { + name: 'Test', + value: 'test', + }, + ], + }, + ]; +} diff --git a/packages/nodes-base/nodes/Wise/GenericFunctions.ts b/packages/nodes-base/nodes/Wise/GenericFunctions.ts new file mode 100644 index 0000000000..a4aa44f430 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/GenericFunctions.ts @@ -0,0 +1,164 @@ +import { + IExecuteFunctions, + IHookFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeExecutionData, +} from 'n8n-workflow'; + +import { + OptionsWithUri, +} from 'request'; + +/** + * Make an authenticated API request to Wise. + */ +export async function wiseApiRequest( + this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, + method: string, + endpoint: string, + body: IDataObject = {}, + qs: IDataObject = {}, + option: IDataObject = {}, +) { + const { apiToken, environment } = this.getCredentials('wiseApi') as { + apiToken: string, + environment: 'live' | 'test', + }; + + const rootUrl = environment === 'live' + ? 'https://api.transferwise.com/' + : 'https://api.sandbox.transferwise.tech/'; + + const options: OptionsWithUri = { + headers: { + 'user-agent': 'n8n', + 'Authorization': `Bearer ${apiToken}`, + }, + method, + uri: `${rootUrl}${endpoint}`, + qs, + body, + json: true, + }; + + if (!Object.keys(body).length) { + delete options.body; + } + + if (!Object.keys(qs).length) { + delete options.qs; + } + + if (Object.keys(option)) { + Object.assign(options, option); + } + + try { + return await this.helpers.request!(options); + } catch (error) { + + const errors = error.error.errors; + + if (errors && Array.isArray(errors)) { + const errorMessage = errors.map((e) => e.message).join(' | '); + throw new Error(`Wise error response [${error.statusCode}]: ${errorMessage}`); + } + + throw new Error(`Wise error response [${error.statusCode}]: ${error}`); + } +} + +/** + * Populate the binary property of node items with binary data for a PDF file. + */ +export async function handleBinaryData( + this: IExecuteFunctions, + items: INodeExecutionData[], + i: number, + endpoint: string, +) { + const data = await wiseApiRequest.call(this, 'GET', endpoint, {}, {}, { encoding: null }); + const binaryProperty = this.getNodeParameter('binaryProperty', i) as string; + + items[i].binary = items[i].binary ?? {}; + items[i].binary![binaryProperty] = await this.helpers.prepareBinaryData(data); + items[i].binary![binaryProperty].fileName = this.getNodeParameter('fileName', i) as string; + items[i].binary![binaryProperty].fileExtension = 'pdf'; + + return items; +} + +export function getTriggerName(eventName: string) { + const events: IDataObject = { + 'tranferStateChange': 'transfers#state-change', + 'transferActiveCases': 'transfers#active-cases', + 'balanceCredit': 'balances#credit', + }; + return events[eventName]; +} + +export type BorderlessAccount = { + id: number, + balances: Array<{ currency: string }> +}; + +export type ExchangeRateAdditionalFields = { + interval: 'day' | 'hour' | 'minute', + range: { + rangeProperties: { from: string, to: string } + }, + time: string, +}; + +export type Profile = { + id: number, + type: 'business' | 'personal', +}; + +export type Recipient = { + id: number, + accountHolderName: string +}; + +export type StatementAdditionalFields = { + lineStyle: 'COMPACT' | 'FLAT', + range: { + rangeProperties: { intervalStart: string, intervalEnd: string } + }, +}; + +export type TransferFilters = { + [key: string]: string | IDataObject; + range: { + rangeProperties: { createdDateStart: string, createdDateEnd: string } + }, + sourceCurrency: string, + status: string, + targetCurrency: string, +}; + +export const livePublicKey = ` +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvO8vXV+JksBzZAY6GhSO +XdoTCfhXaaiZ+qAbtaDBiu2AGkGVpmEygFmWP4Li9m5+Ni85BhVvZOodM9epgW3F +bA5Q1SexvAF1PPjX4JpMstak/QhAgl1qMSqEevL8cmUeTgcMuVWCJmlge9h7B1CS +D4rtlimGZozG39rUBDg6Qt2K+P4wBfLblL0k4C4YUdLnpGYEDIth+i8XsRpFlogx +CAFyH9+knYsDbR43UJ9shtc42Ybd40Afihj8KnYKXzchyQ42aC8aZ/h5hyZ28yVy +Oj3Vos0VdBIs/gAyJ/4yyQFCXYte64I7ssrlbGRaco4nKF3HmaNhxwyKyJafz19e +HwIDAQAB +-----END PUBLIC KEY-----`; + +export const testPublicKey = ` +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwpb91cEYuyJNQepZAVfP +ZIlPZfNUefH+n6w9SW3fykqKu938cR7WadQv87oF2VuT+fDt7kqeRziTmPSUhqPU +ys/V2Q1rlfJuXbE+Gga37t7zwd0egQ+KyOEHQOpcTwKmtZ81ieGHynAQzsn1We3j +wt760MsCPJ7GMT141ByQM+yW1Bx+4SG3IGjXWyqOWrcXsxAvIXkpUD/jK/L958Cg +nZEgz0BSEh0QxYLITnW1lLokSx/dTianWPFEhMC9BgijempgNXHNfcVirg1lPSyg +z7KqoKUN0oHqWLr2U1A+7kqrl6O2nx3CKs1bj1hToT1+p4kcMoHXA7kA+VBLUpEs +VwIDAQAB +-----END PUBLIC KEY-----`; diff --git a/packages/nodes-base/nodes/Wise/Wise.node.ts b/packages/nodes-base/nodes/Wise/Wise.node.ts new file mode 100644 index 0000000000..dfdf1e7beb --- /dev/null +++ b/packages/nodes-base/nodes/Wise/Wise.node.ts @@ -0,0 +1,514 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + accountFields, + accountOperations, + exchangeRateFields, + exchangeRateOperations, + profileFields, + profileOperations, + quoteFields, + quoteOperations, + recipientFields, + recipientOperations, + transferFields, + transferOperations, +} from './descriptions'; + +import { + BorderlessAccount, + ExchangeRateAdditionalFields, + handleBinaryData, + Profile, + Recipient, + StatementAdditionalFields, + TransferFilters, + wiseApiRequest, +} from './GenericFunctions'; + +import { + omit, +} from 'lodash'; + +import * as moment from 'moment-timezone'; + +import * as uuid from 'uuid/v4'; + +export class Wise implements INodeType { + description: INodeTypeDescription = { + displayName: 'Wise', + name: 'wise', + icon: 'file:wise.svg', + group: ['transform'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume the Wise API', + defaults: { + name: 'Wise', + color: '#37517e', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'wiseApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Account', + value: 'account', + }, + { + name: 'Exchange Rate', + value: 'exchangeRate', + }, + { + name: 'Profile', + value: 'profile', + }, + { + name: 'Recipient', + value: 'recipient', + }, + { + name: 'Quote', + value: 'quote', + }, + { + name: 'Transfer', + value: 'transfer', + }, + ], + default: 'account', + description: 'Resource to consume', + }, + ...accountOperations, + ...accountFields, + ...exchangeRateOperations, + ...exchangeRateFields, + ...profileOperations, + ...profileFields, + ...quoteOperations, + ...quoteFields, + ...recipientOperations, + ...recipientFields, + ...transferOperations, + ...transferFields, + ], + }; + + methods = { + loadOptions: { + async getBorderlessAccounts(this: ILoadOptionsFunctions) { + const qs = { + profileId: this.getNodeParameter('profileId', 0), + }; + + const accounts = await wiseApiRequest.call(this, 'GET', 'v1/borderless-accounts', {}, qs); + + return accounts.map(({ id, balances }: BorderlessAccount) => ({ + name: balances.map(({ currency }) => currency).join(' - '), + value: id, + })); + }, + + async getProfiles(this: ILoadOptionsFunctions) { + const profiles = await wiseApiRequest.call(this, 'GET', 'v1/profiles'); + + return profiles.map(({ id, type }: Profile) => ({ + name: type.charAt(0).toUpperCase() + type.slice(1), + value: id, + })); + }, + + async getRecipients(this: ILoadOptionsFunctions) { + const qs = { + profileId: this.getNodeParameter('profileId', 0), + }; + + const recipients = await wiseApiRequest.call(this, 'GET', 'v1/accounts', {}, qs); + + return recipients.map(({ id, accountHolderName }: Recipient) => ({ + name: accountHolderName, + value: id, + })); + }, + }, + }; + + async execute(this: IExecuteFunctions) { + const items = this.getInputData(); + + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + + const timezone = this.getTimezone(); + + let responseData; + const returnData: IDataObject[] = []; + let downloadReceipt = false; + + for (let i = 0; i < items.length; i++) { + + try { + + if (resource === 'account') { + + // ********************************************************************* + // account + // ********************************************************************* + + if (operation === 'getBalances') { + + // ---------------------------------- + // account: getBalances + // ---------------------------------- + + // https://api-docs.transferwise.com/#borderless-accounts-get-account-balance + + const qs = { + profileId: this.getNodeParameter('profileId', i), + }; + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/borderless-accounts', {}, qs); + + } else if (operation === 'getCurrencies') { + + // ---------------------------------- + // account: getCurrencies + // ---------------------------------- + + // https://api-docs.transferwise.com/#borderless-accounts-get-available-currencies + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/borderless-accounts/balance-currencies'); + + } else if (operation === 'getStatement') { + + // ---------------------------------- + // account: getStatement + // ---------------------------------- + + // https://api-docs.transferwise.com/#borderless-accounts-get-account-statement + + const profileId = this.getNodeParameter('profileId', i); + const borderlessAccountId = this.getNodeParameter('borderlessAccountId', i); + const endpoint = `v3/profiles/${profileId}/borderless-accounts/${borderlessAccountId}/statement.json`; + + const qs = { + currency: this.getNodeParameter('currency', i), + } as IDataObject; + + const { lineStyle, range } = this.getNodeParameter('additionalFields', i) as StatementAdditionalFields; + + if (lineStyle !== undefined) { + qs.type = lineStyle; + } + + if (range !== undefined) { + qs.intervalStart = moment.tz(range.rangeProperties.intervalStart, timezone).utc().format(); + qs.intervalEnd = moment.tz(range.rangeProperties.intervalEnd, timezone).utc().format(); + } else { + qs.intervalStart = moment().subtract(1, 'months').utc().format(); + qs.intervalEnd = moment().utc().format(); + } + + responseData = await wiseApiRequest.call(this, 'GET', endpoint, {}, qs); + + } + + } else if (resource === 'exchangeRate') { + + // ********************************************************************* + // exchangeRate + // ********************************************************************* + + if (operation === 'get') { + + // ---------------------------------- + // exchangeRate: get + // ---------------------------------- + + // https://api-docs.transferwise.com/#exchange-rates-list + + const qs = { + source: this.getNodeParameter('source', i), + target: this.getNodeParameter('target', i), + } as IDataObject; + + const { + interval, + range, + time, + } = this.getNodeParameter('additionalFields', i) as ExchangeRateAdditionalFields; + + if (interval !== undefined) { + qs.group = interval; + } + + if (time !== undefined) { + qs.time = time; + } + + if (range !== undefined && time === undefined) { + qs.from = moment.tz(range.rangeProperties.from, timezone).utc().format(); + qs.to = moment.tz(range.rangeProperties.to, timezone).utc().format(); + } else { + qs.from = moment().subtract(1, 'months').utc().format(); + qs.to = moment().format(); + } + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/rates', {}, qs); + } + + } else if (resource === 'profile') { + + // ********************************************************************* + // profile + // ********************************************************************* + + if (operation === 'get') { + + // ---------------------------------- + // profile: get + // ---------------------------------- + + // https://api-docs.transferwise.com/#user-profiles-get-by-id + + const profileId = this.getNodeParameter('profileId', i); + responseData = await wiseApiRequest.call(this, 'GET', `v1/profiles/${profileId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------- + // profile: getAll + // ---------------------------------- + + // https://api-docs.transferwise.com/#user-profiles-list + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/profiles'); + + } + + } else if (resource === 'recipient') { + + // ********************************************************************* + // recipient + // ********************************************************************* + + if (operation === 'getAll') { + + // ---------------------------------- + // recipient: getAll + // ---------------------------------- + + // https://api-docs.transferwise.com/#recipient-accounts-list + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/accounts'); + + const returnAll = this.getNodeParameter('returnAll', i); + + if (!returnAll) { + const limit = this.getNodeParameter('limit', i); + responseData = responseData.slice(0, limit); + } + } + + } else if (resource === 'quote') { + + // ********************************************************************* + // quote + // ********************************************************************* + + if (operation === 'create') { + + // ---------------------------------- + // quote: create + // ---------------------------------- + + // https://api-docs.transferwise.com/#quotes-create + + const body = { + profile: this.getNodeParameter('profileId', i), + sourceCurrency: (this.getNodeParameter('sourceCurrency', i) as string).toUpperCase(), + targetCurrency: (this.getNodeParameter('targetCurrency', i) as string).toUpperCase(), + } as IDataObject; + + const amountType = this.getNodeParameter('amountType', i) as 'source' | 'target'; + + if (amountType === 'source') { + body.sourceAmount = this.getNodeParameter('amount', i); + } else if (amountType === 'target') { + body.targetAmount = this.getNodeParameter('amount', i); + } + + responseData = await wiseApiRequest.call(this, 'POST', 'v2/quotes', body, {}); + + } else if (operation === 'get') { + + // ---------------------------------- + // quote: get + // ---------------------------------- + + // https://api-docs.transferwise.com/#quotes-get-by-id + + const quoteId = this.getNodeParameter('quoteId', i); + responseData = await wiseApiRequest.call(this, 'GET', `v2/quotes/${quoteId}`); + } + + } else if (resource === 'transfer') { + + // ********************************************************************* + // transfer + // ********************************************************************* + + if (operation === 'create') { + + // ---------------------------------- + // transfer: create + // ---------------------------------- + + // https://api-docs.transferwise.com/#transfers-create + + const body = { + quoteUuid: this.getNodeParameter('quoteId', i), + targetAccount: this.getNodeParameter('targetAccountId', i), + customerTransactionId: uuid(), + } as IDataObject; + + const { reference } = this.getNodeParameter('additionalFields', i) as { reference: string }; + + if (reference !== undefined) { + body.details = { reference }; + } + + responseData = await wiseApiRequest.call(this, 'POST', 'v1/transfers', body, {}); + + } else if (operation === 'delete') { + + // ---------------------------------- + // transfer: delete + // ---------------------------------- + + // https://api-docs.transferwise.com/#transfers-cancel + + const transferId = this.getNodeParameter('transferId', i); + responseData = await wiseApiRequest.call(this, 'PUT', `v1/transfers/${transferId}/cancel`); + + } else if (operation === 'execute') { + + // ---------------------------------- + // transfer: execute + // ---------------------------------- + + // https://api-docs.transferwise.com/#transfers-fund + + const profileId = this.getNodeParameter('profileId', i); + const transferId = this.getNodeParameter('transferId', i) as string; + + const endpoint = `v3/profiles/${profileId}/transfers/${transferId}/payments`; + responseData = await wiseApiRequest.call(this, 'POST', endpoint, { type: 'BALANCE' }, {}); + + // in sandbox, simulate transfer completion so that PDF receipt can be downloaded + + const { environment } = this.getCredentials('wiseApi') as IDataObject; + + if (environment === 'test') { + for (const endpoint of ['processing', 'funds_converted', 'outgoing_payment_sent']) { + await wiseApiRequest.call(this, 'GET', `v1/simulation/transfers/${transferId}/${endpoint}`); + } + } + + } else if (operation === 'get') { + + // ---------------------------------- + // transfer: get + // ---------------------------------- + + const transferId = this.getNodeParameter('transferId', i); + downloadReceipt = this.getNodeParameter('downloadReceipt', i) as boolean; + + if (downloadReceipt) { + + // https://api-docs.transferwise.com/#transfers-get-receipt-pdf + + responseData = await handleBinaryData.call(this, items, i, `v1/transfers/${transferId}/receipt.pdf`); + + } else { + + // https://api-docs.transferwise.com/#transfers-get-by-id + + responseData = await wiseApiRequest.call(this, 'GET', `v1/transfers/${transferId}`); + } + + } else if (operation === 'getAll') { + + // ---------------------------------- + // transfer: getAll + // ---------------------------------- + + // https://api-docs.transferwise.com/#transfers-list + + const qs = { + profile: this.getNodeParameter('profileId', i), + } as IDataObject; + + const filters = this.getNodeParameter('filters', i) as TransferFilters; + + Object.keys(omit(filters, 'range')).forEach(key => { + qs[key] = filters[key]; + }); + + if (filters.range !== undefined) { + qs.createdDateStart = moment(filters.range.rangeProperties.createdDateStart).format(); + qs.createdDateEnd = moment(filters.range.rangeProperties.createdDateEnd).format(); + } else { + qs.createdDateStart = moment().subtract(1, 'months').format(); + qs.createdDateEnd = moment().format(); + } + + const returnAll = this.getNodeParameter('returnAll', i); + + if (!returnAll) { + qs.limit = this.getNodeParameter('limit', i); + } + + responseData = await wiseApiRequest.call(this, 'GET', 'v1/transfers', {}, qs); + } + } + } catch (error) { + if (this.continueOnFail()) { + returnData.push({ error: error.toString() }); + continue; + } + + throw error; + } + + Array.isArray(responseData) + ? returnData.push(...responseData) + : returnData.push(responseData); + } + + if (downloadReceipt && responseData !== undefined) { + return this.prepareOutputData(responseData); + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Wise/WiseTrigger.node.ts b/packages/nodes-base/nodes/Wise/WiseTrigger.node.ts new file mode 100644 index 0000000000..6b458488ff --- /dev/null +++ b/packages/nodes-base/nodes/Wise/WiseTrigger.node.ts @@ -0,0 +1,189 @@ +import { + IHookFunctions, + IWebhookFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeType, + INodeTypeDescription, + IWebhookResponseData, +} from 'n8n-workflow'; + +import { + getTriggerName, + livePublicKey, + Profile, + testPublicKey, + wiseApiRequest, +} from './GenericFunctions'; + +import { + createVerify, +} from 'crypto'; + +export class WiseTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'Wise Trigger', + name: 'wiseTrigger', + icon: 'file:wise.svg', + group: ['trigger'], + version: 1, + subtitle: '={{$parameter["event"]}}', + description: 'Handle Wise events via webhooks', + defaults: { + name: 'Wise Trigger', + color: '#37517e', + }, + inputs: [], + outputs: ['main'], + credentials: [ + { + name: 'wiseApi', + required: true, + }, + ], + webhooks: [ + { + name: 'default', + httpMethod: 'POST', + responseMode: 'onReceived', + path: 'webhook', + }, + ], + properties: [ + { + displayName: 'Profile', + name: 'profileId', + type: 'options', + required: true, + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + default: '', + }, + { + displayName: 'Event', + name: 'event', + type: 'options', + required: true, + default: '', + options: [ + { + name: 'Balance Credit', + value: 'balanceCredit', + description: 'Triggered every time a balance account is credited.', + }, + { + name: 'Transfer Active Case', + value: 'transferActiveCases', + description: `Triggered every time a transfer's list of active cases is updated.`, + }, + { + name: 'Transfer State Changed', + value: 'tranferStateChange', + description: `Triggered every time a transfer's status is updated.`, + }, + ], + }, + ], + }; + + methods = { + loadOptions: { + async getProfiles(this: ILoadOptionsFunctions) { + const profiles = await wiseApiRequest.call(this, 'GET', 'v1/profiles'); + return profiles.map(({ id, type }: Profile) => ({ + name: type.charAt(0).toUpperCase() + type.slice(1), + value: id, + })); + }, + }, + }; + // @ts-ignore + webhookMethods = { + default: { + async checkExists(this: IHookFunctions): Promise { + const webhookData = this.getWorkflowStaticData('node'); + const webhookUrl = this.getNodeWebhookUrl('default'); + const profileId = this.getNodeParameter('profileId') as string; + const event = this.getNodeParameter('event') as string; + const webhooks = await wiseApiRequest.call(this, 'GET', `v3/profiles/${profileId}/subscriptions`); + const trigger = getTriggerName(event); + for (const webhook of webhooks) { + if (webhook.delivery.url === webhookUrl && webhook.scope.id === profileId && webhook.trigger_on === trigger) { + webhookData.webhookId = webhook.id; + return true; + } + } + return false; + }, + async create(this: IHookFunctions): Promise { + const webhookUrl = this.getNodeWebhookUrl('default'); + const webhookData = this.getWorkflowStaticData('node'); + const profileId = this.getNodeParameter('profileId') as string; + const event = this.getNodeParameter('event') as string; + const trigger = getTriggerName(event); + const body: IDataObject = { + name: `n8n Webhook`, + trigger_on: trigger, + delivery: { + version: '2.0.0', + url: webhookUrl, + }, + }; + const webhook = await wiseApiRequest.call(this, 'POST', `v3/profiles/${profileId}/subscriptions`, body); + webhookData.webhookId = webhook.id; + return true; + }, + async delete(this: IHookFunctions): Promise { + const webhookData = this.getWorkflowStaticData('node'); + const profileId = this.getNodeParameter('profileId') as string; + try { + await wiseApiRequest.call(this, 'DELETE', `v3/profiles/${profileId}/subscriptions/${webhookData.webhookId}`); + } catch (error) { + return false; + } + delete webhookData.webhookId; + return true; + }, + }, + }; + + async webhook(this: IWebhookFunctions): Promise { + const req = this.getRequestObject(); + const headers = this.getHeaderData() as IDataObject; + const credentials = this.getCredentials('wiseApi') as IDataObject; + + if (headers['x-test-notification'] === 'true') { + const res = this.getResponseObject(); + res.status(200).end(); + return { + noWebhookResponse: true, + }; + } + + const signature = headers['x-signature'] as string; + + const publicKey = (credentials.environment === 'test') ? testPublicKey : livePublicKey as string; + + //@ts-ignore + const sig = createVerify('RSA-SHA1').update(req.rawBody); + const verified = sig.verify( + publicKey, + signature, + 'base64', + ); + + if (verified === false) { + return {}; + } + + return { + workflowData: [ + this.helpers.returnJsonArray(req.body), + ], + }; + } +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/Wise/descriptions/AccountDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/AccountDescription.ts new file mode 100644 index 0000000000..5b7fd3d5fa --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/AccountDescription.ts @@ -0,0 +1,195 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const accountOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'getBalances', + description: 'Operation to perform', + options: [ + { + name: 'Get Balances', + value: 'getBalances', + description: 'Retrieve balances for all account currencies of this user.', + }, + { + name: 'Get Currencies', + value: 'getCurrencies', + description: 'Retrieve currencies in the borderless account of this user.', + }, + { + name: 'Get Statement', + value: 'getStatement', + description: 'Retrieve the statement for the borderless account of this user.', + }, + ], + displayOptions: { + show: { + resource: [ + 'account', + ], + }, + }, + }, +] as INodeProperties[]; + +export const accountFields = [ + // ---------------------------------- + // account: getBalances + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile to retrieve the balance of.', + displayOptions: { + show: { + resource: [ + 'account', + ], + operation: [ + 'getBalances', + ], + }, + }, + }, + + // ---------------------------------- + // account: getStatement + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile whose account to retrieve the statement of.', + displayOptions: { + show: { + resource: [ + 'account', + ], + operation: [ + 'getStatement', + ], + }, + }, + }, + { + displayName: 'Borderless Account ID', + name: 'borderlessAccountId', + type: 'options', + default: [], + required: true, + typeOptions: { + loadOptionsMethod: 'getBorderlessAccounts', + loadOptionsDependsOn: [ + 'profileId', + ], + }, + description: 'ID of the borderless account to retrieve the statement of.', + displayOptions: { + show: { + resource: [ + 'account', + ], + operation: [ + 'getStatement', + ], + }, + }, + }, + { + displayName: 'Currency', + name: 'currency', + type: 'string', + default: '', + // TODO: preload + description: 'Code of the currency of the borderless account to retrieve the statement of.', + displayOptions: { + show: { + resource: [ + 'account', + ], + operation: [ + 'getStatement', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'account', + ], + operation: [ + 'getStatement', + ], + }, + }, + options: [ + { + displayName: 'Line Style', + name: 'lineStyle', + type: 'options', + default: 'COMPACT', + description: 'Line style to retrieve the statement in.', + options: [ + { + name: 'Compact', + value: 'COMPACT', + description: 'Single line per transaction.', + }, + { + name: 'Flat', + value: 'FLAT', + description: 'Separate lines for transaction fees.', + }, + ], + }, + { + displayName: 'Range', + name: 'range', + type: 'fixedCollection', + placeholder: 'Add Range', + default: {}, + options: [ + { + displayName: 'Range Properties', + name: 'rangeProperties', + values: [ + { + displayName: 'Range Start', + name: 'intervalStart', + type: 'dateTime', + default: '', + }, + { + displayName: 'Range End', + name: 'intervalEnd', + type: 'dateTime', + default: '', + }, + ], + }, + ], + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/ExchangeRateDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/ExchangeRateDescription.ts new file mode 100644 index 0000000000..bee99e6fe4 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/ExchangeRateDescription.ts @@ -0,0 +1,140 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const exchangeRateOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'get', + description: 'Operation to perform', + options: [ + { + name: 'Get', + value: 'get', + }, + ], + displayOptions: { + show: { + resource: [ + 'exchangeRate', + ], + }, + }, + }, +] as INodeProperties[]; + +export const exchangeRateFields = [ + // ---------------------------------- + // exchangeRate: get + // ---------------------------------- + { + displayName: 'Source Currency', + name: 'source', + type: 'string', + default: '', + description: 'Code of the source currency to retrieve the exchange rate for.', + displayOptions: { + show: { + resource: [ + 'exchangeRate', + ], + operation: [ + 'get', + ], + }, + }, + }, + { + displayName: 'Target Currency', + name: 'target', + type: 'string', + default: '', + description: 'Code of the target currency to retrieve the exchange rate for.', + displayOptions: { + show: { + resource: [ + 'exchangeRate', + ], + operation: [ + 'get', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'exchangeRate', + ], + operation: [ + 'get', + ], + }, + }, + options: [ + { + displayName: 'Interval', + name: 'interval', + type: 'options', + default: 'day', + options: [ + { + name: 'Day', + value: 'day', + }, + { + name: 'Hour', + value: 'hour', + }, + { + name: 'Minute', + value: 'minute', + }, + ], + }, + { + displayName: 'Range', + name: 'range', + type: 'fixedCollection', + placeholder: 'Add Range', + description: 'Range of time to retrieve the exchange rate for.', + default: {}, + options: [ + { + displayName: 'Range Properties', + name: 'rangeProperties', + values: [ + { + displayName: 'Range Start', + name: 'from', + type: 'dateTime', + default: '', + }, + { + displayName: 'Range End', + name: 'to', + type: 'dateTime', + default: '', + }, + ], + }, + ], + }, + { + displayName: 'Time', + name: 'time', + type: 'dateTime', + default: '', + description: 'Point in time to retrieve the exchange rate for.', + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/ProfileDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/ProfileDescription.ts new file mode 100644 index 0000000000..dfa8e88c53 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/ProfileDescription.ts @@ -0,0 +1,57 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const profileOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'get', + description: 'Operation to perform', + options: [ + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + ], + displayOptions: { + show: { + resource: [ + 'profile', + ], + }, + }, + }, +] as INodeProperties[]; + +export const profileFields = [ + // ---------------------------------- + // profile: get + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile to retrieve.', + displayOptions: { + show: { + resource: [ + 'profile', + ], + operation: [ + 'get', + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/QuoteDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/QuoteDescription.ts new file mode 100644 index 0000000000..6cb5446d87 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/QuoteDescription.ts @@ -0,0 +1,181 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const quoteOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'get', + description: 'Operation to perform', + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Get', + value: 'get', + }, + ], + displayOptions: { + show: { + resource: [ + 'quote', + ], + }, + }, + }, +] as INodeProperties[]; + +export const quoteFields = [ + // ---------------------------------- + // quote: create + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile to create the quote under.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Target Account ID', + name: 'targetAccountId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getRecipients', + }, + description: 'ID of the account that will receive the funds.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Amount Type', + name: 'amountType', + type: 'options', + default: 'source', + options: [ + { + name: 'Source', + value: 'source', + }, + { + name: 'Target', + value: 'target', + }, + ], + description: 'Whether the amount is to be sent or received.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Amount', + name: 'amount', + type: 'number', + default: 1, + typeOptions: { + minValue: 1, + }, + description: 'Amount of funds for the quote to create.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Source Currency', + name: 'sourceCurrency', + type: 'string', + default: '', + description: 'Code of the currency to send for the quote to create.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Target Currency', + name: 'targetCurrency', + type: 'string', + default: '', + description: 'Code of the currency to receive for the quote to create.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'create', + ], + }, + }, + }, + + // ---------------------------------- + // quote: get + // ---------------------------------- + { + displayName: 'Quote ID', + name: 'quoteId', + type: 'string', + required: true, + default: '', + description: 'ID of the quote to retrieve.', + displayOptions: { + show: { + resource: [ + 'quote', + ], + operation: [ + 'get', + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/RecipientDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/RecipientDescription.ts new file mode 100644 index 0000000000..9479a8808b --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/RecipientDescription.ts @@ -0,0 +1,73 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const recipientOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'getAll', + description: 'Operation to perform', + options: [ + { + name: 'Get All', + value: 'getAll', + }, + ], + displayOptions: { + show: { + resource: [ + 'recipient', + ], + }, + }, + }, +] as INodeProperties[]; + +export const recipientFields = [ + // ---------------------------------- + // recipient: getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'recipient', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'recipient', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/TransferDescription.ts b/packages/nodes-base/nodes/Wise/descriptions/TransferDescription.ts new file mode 100644 index 0000000000..2e81ad5b04 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/TransferDescription.ts @@ -0,0 +1,460 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const transferOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + default: 'get', + description: 'Operation to perform', + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Execute', + value: 'execute', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + ], + displayOptions: { + show: { + resource: [ + 'transfer', + ], + }, + }, + }, +] as INodeProperties[]; + +export const transferFields = [ + // ---------------------------------- + // transfer: create + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + loadOptionsDependsOn: [ + 'profileId', + ], + }, + description: 'ID of the user profile to retrieve the balance of.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Quote ID', + name: 'quoteId', + type: 'string', + required: true, + default: '', + description: 'ID of the quote based on which to create the transfer.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Target Account ID', + name: 'targetAccountId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getRecipients', + }, + description: 'ID of the account that will receive the funds.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Reference', + name: 'reference', + type: 'string', + default: '', + description: 'Reference text to show in the recipient\'s bank statement', + }, + ], + }, + + // ---------------------------------- + // transfer: delete + // ---------------------------------- + { + displayName: 'Transfer ID', + name: 'transferId', + type: 'string', + required: true, + default: '', + description: 'ID of the transfer to delete.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------- + // transfer: execute + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile to execute the transfer under.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'execute', + ], + }, + }, + }, + { + displayName: 'Transfer ID', + name: 'transferId', + type: 'string', + required: true, + default: '', + description: 'ID of the transfer to execute.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'execute', + ], + }, + }, + }, + + // ---------------------------------- + // transfer: get + // ---------------------------------- + { + displayName: 'Transfer ID', + name: 'transferId', + type: 'string', + required: true, + default: '', + description: 'ID of the transfer to retrieve.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'get', + ], + }, + }, + }, + { + displayName: 'Download Receipt', + name: 'downloadReceipt', + type: 'boolean', + required: true, + default: false, + description: 'Download the transfer receipt as a PDF file.
Only for executed transfers, having status \'Outgoing Payment Sent\'.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'get', + ], + }, + }, + }, + { + displayName: 'Binary Property', + name: 'binaryProperty', + type: 'string', + required: true, + default: 'data', + description: 'Name of the binary property to which to write to.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'get', + ], + downloadReceipt: [ + true, + ], + }, + }, + }, + { + displayName: 'File Name', + name: 'fileName', + type: 'string', + required: true, + default: '', + placeholder: 'data.pdf', + description: 'Name of the file that will be downloaded.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'get', + ], + downloadReceipt: [ + true, + ], + }, + }, + }, + + // ---------------------------------- + // transfer: getAll + // ---------------------------------- + { + displayName: 'Profile ID', + name: 'profileId', + type: 'options', + required: true, + default: [], + typeOptions: { + loadOptionsMethod: 'getProfiles', + }, + description: 'ID of the user profile to retrieve.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'transfer', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Range', + name: 'range', + type: 'fixedCollection', + placeholder: 'Add Range', + description: 'Range of time for filtering the transfers.', + default: {}, + options: [ + { + displayName: 'Range Properties', + name: 'rangeProperties', + values: [ + { + displayName: 'Created Date Start', + name: 'createdDateStart', + type: 'dateTime', + default: '', + }, + { + displayName: 'Created Date End', + name: 'createdDateEnd', + type: 'dateTime', + default: '', + }, + ], + }, + ], + }, + { + displayName: 'Source Currency', + name: 'sourceCurrency', + type: 'string', + default: '', + description: 'Code of the source currency for filtering the transfers.', + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + default: 'processing', + options: [ + { + name: 'Bounced Back', + value: 'bounced_back', + }, + { + name: 'Cancelled', + value: 'cancelled', + }, + { + name: 'Charged Back', + value: 'charged_back', + }, + { + name: 'Outgoing Payment Sent', + value: 'outgoing_payment_sent', + }, + { + name: 'Funds Converted', + value: 'funds_converted', + }, + { + name: 'Funds Refunded', + value: 'funds_refunded', + }, + { + name: 'Incoming Payment Waiting', + value: 'incoming_payment_waiting', + }, + { + name: 'Processing', + value: 'processing', + }, + { + name: 'Unknown', + value: 'unknown', + }, + { + name: 'Waiting for Recipient Input to Proceed', + value: 'waiting_recipient_input_to_proceed', + }, + ], + }, + { + displayName: 'Target Currency', + name: 'targetCurrency', + type: 'string', + default: '', + description: 'Code of the target currency for filtering the transfers.', + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Wise/descriptions/index.ts b/packages/nodes-base/nodes/Wise/descriptions/index.ts new file mode 100644 index 0000000000..0e6fc50395 --- /dev/null +++ b/packages/nodes-base/nodes/Wise/descriptions/index.ts @@ -0,0 +1,6 @@ +export * from './AccountDescription'; +export * from './ExchangeRateDescription'; +export * from './ProfileDescription'; +export * from './QuoteDescription'; +export * from './RecipientDescription'; +export * from './TransferDescription'; diff --git a/packages/nodes-base/nodes/Wise/wise.svg b/packages/nodes-base/nodes/Wise/wise.svg new file mode 100644 index 0000000000..d0dfa43fad --- /dev/null +++ b/packages/nodes-base/nodes/Wise/wise.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index c10bde2596..eb8287839b 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -248,6 +248,7 @@ "dist/credentials/WebflowApi.credentials.js", "dist/credentials/WebflowOAuth2Api.credentials.js", "dist/credentials/WekanApi.credentials.js", + "dist/credentials/WiseApi.credentials.js", "dist/credentials/WooCommerceApi.credentials.js", "dist/credentials/WordpressApi.credentials.js", "dist/credentials/WufooApi.credentials.js", @@ -520,6 +521,8 @@ "dist/nodes/WooCommerce/WooCommerceTrigger.node.js", "dist/nodes/WriteBinaryFile.node.js", "dist/nodes/Wufoo/WufooTrigger.node.js", + "dist/nodes/Wise/Wise.node.js", + "dist/nodes/Wise/WiseTrigger.node.js", "dist/nodes/Xero/Xero.node.js", "dist/nodes/Xml.node.js", "dist/nodes/Yourls/Yourls.node.js", From b0b172a362ba4e0f4f768431362d0d10a4a30a68 Mon Sep 17 00:00:00 2001 From: Bruno Bacarini Date: Wed, 10 Mar 2021 23:10:10 +0000 Subject: [PATCH 021/137] :sparkles: Add metrics endpoint (#1515) This commit adds the new package prom-client in order to expose metrics to prometheus as well as the endpoint and the configuration to do so. --- packages/cli/config/index.ts | 16 +++++++++++++++- packages/cli/package.json | 1 + packages/cli/src/Server.ts | 29 +++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/packages/cli/config/index.ts b/packages/cli/config/index.ts index 52c190dc61..1ebe4df6a2 100644 --- a/packages/cli/config/index.ts +++ b/packages/cli/config/index.ts @@ -446,6 +446,20 @@ const config = convict({ }, endpoints: { + metrics: { + enable: { + format: 'Boolean', + default: false, + env: 'N8N_ENABLE_METRICS', + doc: 'Enable metrics endpoint', + }, + prefix: { + format: String, + default: 'n8n_', + env: 'N8N_METRICS_PREFIX', + doc: 'An optional prefix for metric names. Default: n8n_', + }, + }, rest: { format: String, default: 'rest', @@ -471,7 +485,7 @@ const config = convict({ doc: 'Disable production webhooks from main process. This helps ensures no http traffic load to main process when using webhook-specific processes.', }, skipWebhoooksDeregistrationOnShutdown: { - /** + /** * Longer explanation: n8n deregisters webhooks on shutdown / deactivation * and registers on startup / activation. If we skip * deactivation on shutdown, webhooks will remain active on 3rd party services. diff --git a/packages/cli/package.json b/packages/cli/package.json index 47f415318a..18e32adba0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -111,6 +111,7 @@ "oauth-1.0a": "^2.2.6", "open": "^7.0.0", "pg": "^8.3.0", + "prom-client": "^13.1.0", "request-promise-native": "^1.0.7", "sqlite3": "^5.0.1", "sse-channel": "^3.1.1", diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index f435e58eab..187fccb340 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -23,6 +23,7 @@ import * as csrf from 'csrf'; import * as requestPromise from 'request-promise-native'; import { createHmac } from 'crypto'; import { compare } from 'bcryptjs'; +import * as promClient from 'prom-client'; import { ActiveExecutions, @@ -108,6 +109,7 @@ import * as parseUrl from 'parseurl'; import * as querystring from 'querystring'; import * as Queue from '../src/Queue'; import { OptionsWithUrl } from 'request-promise-native'; +import { Registry } from 'prom-client'; class App { @@ -197,6 +199,16 @@ class App { async config(): Promise { + const enableMetrics = config.get('endpoints.metrics.enable') as boolean; + let register: Registry; + + if (enableMetrics === true) { + const prefix = config.get('endpoints.metrics.prefix') as string; + register = new promClient.Registry(); + register.setDefaultLabels({ prefix }); + promClient.collectDefaultMetrics({ register }); + } + this.versions = await GenericHelpers.getVersions(); this.frontendSettings.versionCli = this.versions.cli; @@ -204,7 +216,7 @@ class App { const excludeEndpoints = config.get('security.excludeEndpoints') as string; - const ignoredEndpoints = ['healthz', this.endpointWebhook, this.endpointWebhookTest, this.endpointPresetCredentials]; + const ignoredEndpoints = ['healthz', 'metrics', this.endpointWebhook, this.endpointWebhookTest, this.endpointPresetCredentials]; ignoredEndpoints.push.apply(ignoredEndpoints, excludeEndpoints.split(':')); const authIgnoreRegex = new RegExp(`^\/(${_(ignoredEndpoints).compact().join('|')})\/?.*$`); @@ -386,7 +398,7 @@ class App { this.app.use(history({ rewrites: [ { - from: new RegExp(`^\/(${this.restEndpoint}|healthz|css|js|${this.endpointWebhook}|${this.endpointWebhookTest})\/?.*$`), + from: new RegExp(`^\/(${this.restEndpoint}|healthz|metrics|css|js|${this.endpointWebhook}|${this.endpointWebhookTest})\/?.*$`), to: (context) => { return context.parsedUrl!.pathname!.toString(); }, @@ -454,7 +466,16 @@ class App { ResponseHelper.sendSuccessResponse(res, responseData, true, 200); }); - + // ---------------------------------------- + // Metrics + // ---------------------------------------- + if (enableMetrics === true) { + this.app.get('/metrics', async (req: express.Request, res: express.Response) => { + const response = await register.metrics(); + res.setHeader('Content-Type', register.contentType); + ResponseHelper.sendSuccessResponse(res, response, true, 200); + }); + } // ---------------------------------------- // Workflow @@ -1728,7 +1749,7 @@ class App { stoppedAt: result.stoppedAt ? new Date(result.stoppedAt) : undefined, finished: result.finished, }; - + return returnData; } From 263813a8f9ca06ac2f1e90a7fd7a3bcd804a6b08 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 11 Mar 2021 00:10:39 +0100 Subject: [PATCH 022/137] :zap: Rename metrics environment variable --- packages/cli/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/config/index.ts b/packages/cli/config/index.ts index 1ebe4df6a2..0b136b52e4 100644 --- a/packages/cli/config/index.ts +++ b/packages/cli/config/index.ts @@ -450,7 +450,7 @@ const config = convict({ enable: { format: 'Boolean', default: false, - env: 'N8N_ENABLE_METRICS', + env: 'N8N_METRICS', doc: 'Enable metrics endpoint', }, prefix: { From e1dbb72929dc2289785643edbf36004020da5646 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 11 Mar 2021 03:16:05 -0500 Subject: [PATCH 023/137] :zap: Add file:search operation to Dropbox Node (#1494) * :zap: Add search resource to Dropbox Node * :books: Add breaking change instructions * :zap: Add missing credentials * :zap: Add "simple" parameter to the operation search:query * :zap: Update breaking change message * :zap: Improvement Co-authored-by: Jan Oberhauser --- packages/cli/BREAKING-CHANGES.md | 12 + .../DropboxOAuth2Api.credentials.ts | 3 +- .../nodes-base/nodes/Dropbox/Dropbox.node.ts | 401 +++++++++++++++++- .../nodes/Dropbox/GenericFunctions.ts | 50 ++- packages/nodes-base/nodes/Dropbox/dropbox.png | Bin 1169 -> 0 bytes packages/nodes-base/nodes/Dropbox/dropbox.svg | 1 + 6 files changed, 451 insertions(+), 16 deletions(-) delete mode 100644 packages/nodes-base/nodes/Dropbox/dropbox.png create mode 100644 packages/nodes-base/nodes/Dropbox/dropbox.svg diff --git a/packages/cli/BREAKING-CHANGES.md b/packages/cli/BREAKING-CHANGES.md index 44eddb69a4..f3eca82a12 100644 --- a/packages/cli/BREAKING-CHANGES.md +++ b/packages/cli/BREAKING-CHANGES.md @@ -2,6 +2,18 @@ This list shows all the versions which include breaking changes and how to upgrade. +## 0.111.0 + +### What changed? +In the Dropbox node, now all operations are performed relative to the user's root directory. + +### When is action necessary? +If you are using the `folder:list` operation with the parameter `Folder Path` empty (root path) and have a Team Space in your Dropbox account. + +### How to upgrade: +Open the Dropbox node, go to the `folder:list` operation, and make sure your logic is taking into account the team folders in the response. + + ## 0.105.0 ### What changed? diff --git a/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts b/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts index c3c9f248db..81c84d92aa 100644 --- a/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts +++ b/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts @@ -7,6 +7,7 @@ const scopes = [ 'files.content.write', 'files.content.read', 'sharing.read', + 'account_info.read', ]; export class DropboxOAuth2Api implements ICredentialType { @@ -41,7 +42,7 @@ export class DropboxOAuth2Api implements ICredentialType { displayName: 'Auth URI Query Parameters', name: 'authQueryParameters', type: 'hidden' as NodePropertyTypes, - default: 'token_access_type=offline', + default: 'token_access_type=offline&force_reapprove=true', }, { displayName: 'Authentication', diff --git a/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts b/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts index 790b181261..5f4e219652 100644 --- a/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts +++ b/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts @@ -11,21 +11,24 @@ import { } from 'n8n-workflow'; import { - dropboxApiRequest + dropboxApiRequest, + dropboxpiRequestAllItems, + getRootDirectory, + simplify, } from './GenericFunctions'; export class Dropbox implements INodeType { description: INodeTypeDescription = { displayName: 'Dropbox', name: 'dropbox', - icon: 'file:dropbox.png', + icon: 'file:dropbox.svg', group: ['input'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Access data on Dropbox', defaults: { name: 'Dropbox', - color: '#0062ff', + color: '#007ee5', }, inputs: ['main'], outputs: ['main'], @@ -84,6 +87,10 @@ export class Dropbox implements INodeType { name: 'Folder', value: 'folder', }, + { + name: 'Search', + value: 'search', + }, ], default: 'file', description: 'The resource to operate on.', @@ -176,6 +183,27 @@ export class Dropbox implements INodeType { description: 'The operation to perform.', }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'search', + ], + }, + }, + options: [ + { + name: 'Query', + value: 'query', + }, + ], + default: 'query', + description: 'The operation to perform.', + }, + // ---------------------------------- // file // ---------------------------------- @@ -419,7 +447,189 @@ export class Dropbox implements INodeType { description: 'Name of the binary property which contains
the data for the file to be uploaded.', }, - + // ---------------------------------- + // search:query + // ---------------------------------- + { + displayName: 'Query', + name: 'query', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'query', + ], + resource: [ + 'search', + ], + }, + }, + description: ' The string to search for. May match across multiple fields based on the request arguments.', + }, + { + displayName: 'File Status', + name: 'fileStatus', + type: 'options', + options: [ + { + name: 'Active', + value: 'active', + }, + { + name: 'Deleted', + value: 'deleted', + }, + ], + default: 'active', + displayOptions: { + show: { + operation: [ + 'query', + ], + resource: [ + 'search', + ], + }, + }, + description: ' The string to search for. May match across multiple fields based on the request arguments.', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'query', + ], + resource: [ + 'search', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'search', + ], + operation: [ + 'query', + ], + returnAll: [ + false, + ], + }, + }, + default: 100, + description: 'How many results to return.', + }, + { + displayName: 'Simple', + name: 'simple', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'query', + ], + resource: [ + 'search', + ], + }, + }, + default: true, + description: 'When set to true a simplify version of the response will be used else the raw data.', + }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'search', + ], + operation: [ + 'query', + ], + }, + }, + options: [ + { + displayName: 'File Categories', + name: 'file_categories', + type: 'multiOptions', + options: [ + { + name: 'Audio (mp3, wav, mid, etc.)', + value: 'audio', + }, + { + name: 'Document (doc, docx, txt, etc.)', + value: 'document', + }, + { + name: 'Folder', + value: 'folder', + }, + { + name: 'Image (jpg, png, gif, etc.)', + value: 'image', + }, + { + name: 'Other', + value: 'other', + }, + { + name: 'Dropbox Paper', + value: 'paper', + }, + { + name: 'PDF', + value: 'pdf', + }, + { + name: 'Presentation (ppt, pptx, key, etc.)', + value: 'presentation', + }, + { + name: 'Spreadsheet (xlsx, xls, csv, etc.)', + value: 'spreadsheet', + }, + { + name: 'Video (avi, wmv, mp4, etc.)', + value: 'video', + }, + ], + default: [], + }, + { + displayName: 'File Extensions', + name: 'file_extensions', + type: 'string', + default: '', + description: 'Multiple can be set separated by comma. Example: jpg,pdf', + }, + { + displayName: 'Folder', + name: 'path', + type: 'string', + default: '', + description: 'If this field is not specified, this module searches the entire Dropbox', + }, + ], + }, // ---------------------------------- // folder @@ -469,7 +679,97 @@ export class Dropbox implements INodeType { placeholder: '/invoices/2019/', description: 'The path of which to list the content.', }, - + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'list', + ], + resource: [ + 'folder', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'folder', + ], + operation: [ + 'list', + ], + returnAll: [ + false, + ], + }, + }, + default: 100, + description: 'How many results to return.', + }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'folder', + ], + operation: [ + 'list', + ], + }, + }, + options: [ + { + displayName: 'Include Deleted', + name: 'include_deleted', + type: 'boolean', + default: false, + description: 'If true, the results will include entries for files and folders that used to exist but were deleted. The default for this field is False.', + }, + { + displayName: 'Include Shared Members ', + name: 'include_has_explicit_shared_members', + type: 'boolean', + default: false, + description: 'If true, the results will include a flag for each file indicating whether or not that file has any explicit members. The default for this field is False.', + }, + { + displayName: 'Include Mounted Folders ', + name: 'include_mounted_folders', + type: 'boolean', + default: true, + description: 'If true, the results will include entries under mounted folders which includes app folder, shared folder and team folder. The default for this field is True.', + }, + { + displayName: 'Include Non Downloadable Files ', + name: 'include_non_downloadable_files', + type: 'boolean', + default: true, + description: 'If true, include files that are not downloadable, i.e. Google Docs. The default for this field is True.', + }, + { + displayName: 'Recursive', + name: 'recursive', + type: 'boolean', + default: false, + description: 'If true, the list folder operation will be applied recursively to all subfolders and the response will contain contents of all subfolders. The default for this field is False.', + }, + ], + }, ], }; @@ -484,11 +784,24 @@ export class Dropbox implements INodeType { let endpoint = ''; let requestMethod = ''; + let returnAll = false; + let property = ''; let body: IDataObject | Buffer; let options; const query: IDataObject = {}; - const headers: IDataObject = {}; + let headers: IDataObject = {}; + let simple = false; + + // get the root directory to set it as the default search folder + const { root_info: { root_namespace_id } } = await getRootDirectory.call(this); + + headers = { + 'dropbox-api-path-root': JSON.stringify({ + '.tag': 'root', + 'root': root_namespace_id, + }), + }; for (let i = 0; i < items.length; i++) { body = {}; @@ -545,7 +858,6 @@ export class Dropbox implements INodeType { body = Buffer.from(this.getNodeParameter('fileContent', i) as string, 'utf8'); } } - } else if (resource === 'folder') { if (operation === 'create') { // ---------------------------------- @@ -564,20 +876,65 @@ export class Dropbox implements INodeType { // list // ---------------------------------- + returnAll = this.getNodeParameter('returnAll', 0) as boolean; + + const filters = this.getNodeParameter('filters', i) as IDataObject; + + property = 'entries'; + requestMethod = 'POST'; body = { path: this.getNodeParameter('path', i) as string, - limit: 2000, + limit: 1000, }; - // TODO: If more files than the max-amount exist it has to be possible to - // also request them. + if (returnAll === false) { + const limit = this.getNodeParameter('limit', 0) as number; + body.limit = limit; + } + + Object.assign(body, filters); endpoint = 'https://api.dropboxapi.com/2/files/list_folder'; } + } else if (resource === 'search') { + if (operation === 'query') { + // ---------------------------------- + // query + // ---------------------------------- + + returnAll = this.getNodeParameter('returnAll', 0) as boolean; + + simple = this.getNodeParameter('simple', 0) as boolean; + + const filters = this.getNodeParameter('filters', i) as IDataObject; + + property = 'matches'; + + requestMethod = 'POST'; + body = { + query: this.getNodeParameter('query', i) as string, + options: { + filename_only: true, + }, + }; + + if (filters.file_extensions) { + filters.file_extensions = (filters.file_extensions as string).split(','); + } + + Object.assign(body.options, filters); + + if (returnAll === false) { + const limit = this.getNodeParameter('limit', i) as number; + Object.assign(body.options, { max_results: limit }); + } + + endpoint = 'https://api.dropboxapi.com/2/files/search_v2'; + } } - if (['file', 'folder'].includes(resource)) { + if (['file', 'folder', 'search'].includes(resource)) { if (operation === 'copy') { // ---------------------------------- // copy @@ -625,7 +982,13 @@ export class Dropbox implements INodeType { options = { encoding: null }; } - let responseData = await dropboxApiRequest.call(this, requestMethod, endpoint, body, query, headers, options); + let responseData; + + if (returnAll === true) { + responseData = await dropboxpiRequestAllItems.call(this, property, requestMethod, endpoint, body, query, headers); + } else { + responseData = await dropboxApiRequest.call(this, requestMethod, endpoint, body, query, headers, options); + } if (resource === 'file' && operation === 'upload') { responseData = JSON.parse(responseData); @@ -665,7 +1028,11 @@ export class Dropbox implements INodeType { 'content_hash': 'contentHash', }; - for (const item of responseData.entries) { + if (returnAll === false) { + responseData = responseData.entries; + } + + for (const item of responseData) { const newItem: IDataObject = {}; // Get the props and save them under a proper name @@ -677,8 +1044,14 @@ export class Dropbox implements INodeType { returnData.push(newItem as IDataObject); } + } else if (resource === 'search' && operation === 'query') { + if (returnAll === true) { + returnData.push.apply(returnData, (simple === true) ? simplify(responseData) : responseData); + } else { + returnData.push.apply(returnData, (simple === true) ? simplify(responseData[property]) : responseData[property]); + } } else { - returnData.push(responseData as IDataObject); + returnData.push(responseData); } } diff --git a/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts b/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts index 880ec6bc8c..66533c4c01 100644 --- a/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts @@ -20,7 +20,7 @@ import { * @param {object} body * @returns {Promise} */ -export async function dropboxApiRequest(this: IHookFunctions | IExecuteFunctions, method: string, endpoint: string, body: object, query: IDataObject = {}, headers?: object, option: IDataObject = {}): Promise {// tslint:disable-line:no-any +export async function dropboxApiRequest(this: IHookFunctions | IExecuteFunctions, method: string, endpoint: string, body: object, query: IDataObject = {}, headers: object = {}, option: IDataObject = {}): Promise {// tslint:disable-line:no-any const options: OptionsWithUri = { headers, @@ -67,3 +67,51 @@ export async function dropboxApiRequest(this: IHookFunctions | IExecuteFunctions throw error; } } + +export async function dropboxpiRequestAllItems(this: IExecuteFunctions | IHookFunctions, propertyName: string, method: string, endpoint: string, body: any = {}, query: IDataObject = {}, headers: IDataObject = {}): Promise { // tslint:disable-line:no-any + + const resource = this.getNodeParameter('resource', 0) as string; + + const returnData: IDataObject[] = []; + + const paginationEndpoint: IDataObject = { + 'folder': 'https://api.dropboxapi.com/2/files/list_folder/continue', + 'search': 'https://api.dropboxapi.com/2/files/search/continue_v2', + }; + + let responseData; + do { + responseData = await dropboxApiRequest.call(this, method, endpoint, body, query, headers); + const cursor = responseData.cursor; + if (cursor !== undefined) { + endpoint = paginationEndpoint[resource] as string; + body = { cursor }; + } + returnData.push.apply(returnData, responseData[propertyName]); + } while ( + responseData.has_more !== false + ); + + return returnData; +} + +export function getRootDirectory(this: IHookFunctions | IExecuteFunctions) { + return dropboxApiRequest.call(this, 'POST', 'https://api.dropboxapi.com/2/users/get_current_account', {}); +} + +export function simplify(data: IDataObject[]) { + const results = []; + for (const element of data) { + const { '.tag': key } = element?.metadata as IDataObject; + const metadata = (element?.metadata as IDataObject)[key as string] as IDataObject; + delete element.metadata; + Object.assign(element, metadata); + if ((element?.match_type as IDataObject)['.tag']) { + element.match_type = (element?.match_type as IDataObject)['.tag'] as string; + } + results.push(element); + } + return results; +} + + diff --git a/packages/nodes-base/nodes/Dropbox/dropbox.png b/packages/nodes-base/nodes/Dropbox/dropbox.png deleted file mode 100644 index 6fe6d86751328843341bb0a3b9940a9cc66f3cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1169 zcmX9;c~BE~6n-J292JvVwTf1h){a;p0&1-dDv$&afp94WIXa4Au#x~K5Mqvs98nGh zskUMfib6}uA+|VRKq_doq6qB>o)9*>n@F%25p7ZX+c>j3``-7y_r34EKUU2T4RCaD zasU9wpg>Lp`m(9lj!q#iu3G?TiTrI*T$I8A91dWRMS$D@3In9$ptJ@kmSdp6Kx_n= zo+_bO{*H!2mI0)=6|~ac^&-9urRW(01!7{5ZG;>HNQ{s{fD#88YQZTS4Ml=N(yD+{ z9JvwXIP51O#YlmOAVF1RzyM+rWTT)QquR5cfD{9%o|=Nl$XKcg_Lx9KQhWqb9Kx!A zK_&_5Bq)&$0uGEpmJw701tveCS_CHRf_jh|;2_e(Ap=b$AdLhuvPysuN#T%2P|7Le zkU~bSpTm4}YY(q%e=Lv zcnD*WApTI~JS=P%H@8oBj2v2`1#IXn`1a|fqhZuPL4b!t}N zA&vS{dx0vm`=mpUd*J9^E^DH&OPbu?)1wMDV$Ojk&HAtCbIQzozky$(7P$_@-|arB z4ULht-7g;cvEH6GJLIQzsdtu}HH86v%RVn*=oz&KuQqBs#tBi_i%%ch_D4&9b1VOP z*TQP2&Br9eDXViUinWQ`?K?Jj=$dy7-CPu_X*f6dv_2Y#0pARlTpnm+lS637`#n;R zI)yLcd+HkkSrejZnm}Cc7EEj`?Rxn@P1bikyqGs^5?8QuE h(`V|ON^v&4v8kF \ No newline at end of file From 3ec3f908e80a09d403a84c774c42cc25cbdaace9 Mon Sep 17 00:00:00 2001 From: dali Date: Thu, 11 Mar 2021 12:27:24 +0100 Subject: [PATCH 024/137] :rewind: Revert 'gm' import statement --- packages/nodes-base/nodes/EditImage.node.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/nodes-base/nodes/EditImage.node.ts b/packages/nodes-base/nodes/EditImage.node.ts index 6250bf707d..5472fdac2e 100644 --- a/packages/nodes-base/nodes/EditImage.node.ts +++ b/packages/nodes-base/nodes/EditImage.node.ts @@ -11,7 +11,7 @@ import { INodeType, INodeTypeDescription, } from 'n8n-workflow'; -const gm = require('gm').subClass({imageMagick: true}); +import * as gm from 'gm'; import { file } from 'tmp-promise'; import { parse as pathParse, @@ -966,7 +966,6 @@ export class EditImage implements INodeType { const cleanupFunctions: Array<() => void> = []; - // @ts-ignore let gmInstance: gm.State; const requiredOperationParameters: { @@ -1135,7 +1134,6 @@ export class EditImage implements INodeType { const resizeOption = operationData.resizeOption as string; // By default use "maximumArea" - // @ts-ignore let option: gm.ResizeOption = '@'; if (resizeOption === 'ignoreAspectRatio') { option = '!'; From 07123346795133c5830e5c22580a333b7a984fc9 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 11 Mar 2021 07:36:55 -0500 Subject: [PATCH 025/137] :sparkles: Add Autopilot Node & Trigger (#1516) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Autopilot Node & Trigger * :art: Replace PNG with SVG icon * :truck: Rename description file * :hammer: Fix contact operations default * :pencil2: Edit contact property descriptions * :pencil2: Edit journey property descriptions * :pencil2: Edit contact list property descriptions * :pencil2: Edit list property descriptions * :bug: Fix issue with a wrong named resource * :zap: Fix Trigger-Node name and minor improvements * :hammer: Remove 404 from contactList:exist Co-authored-by: Iván Ovejero Co-authored-by: Jan Oberhauser --- .../credentials/AutopilotApi.credentials.ts | 18 + .../nodes/Autopilot/Autopilot.node.ts | 378 ++++++++++++++++++ .../nodes/Autopilot/AutopilotTrigger.node.ts | 140 +++++++ .../nodes/Autopilot/ContactDescription.ts | 369 +++++++++++++++++ .../Autopilot/ContactJourneyDescription.ts | 73 ++++ .../nodes/Autopilot/ContactListDescription.ts | 138 +++++++ .../nodes/Autopilot/GenericFunctions.ts | 72 ++++ .../nodes/Autopilot/ListDescription.ts | 102 +++++ .../nodes-base/nodes/Autopilot/autopilot.svg | 8 + packages/nodes-base/package.json | 3 + 10 files changed, 1301 insertions(+) create mode 100644 packages/nodes-base/credentials/AutopilotApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Autopilot/Autopilot.node.ts create mode 100644 packages/nodes-base/nodes/Autopilot/AutopilotTrigger.node.ts create mode 100644 packages/nodes-base/nodes/Autopilot/ContactDescription.ts create mode 100644 packages/nodes-base/nodes/Autopilot/ContactJourneyDescription.ts create mode 100644 packages/nodes-base/nodes/Autopilot/ContactListDescription.ts create mode 100644 packages/nodes-base/nodes/Autopilot/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Autopilot/ListDescription.ts create mode 100644 packages/nodes-base/nodes/Autopilot/autopilot.svg diff --git a/packages/nodes-base/credentials/AutopilotApi.credentials.ts b/packages/nodes-base/credentials/AutopilotApi.credentials.ts new file mode 100644 index 0000000000..6c947f9474 --- /dev/null +++ b/packages/nodes-base/credentials/AutopilotApi.credentials.ts @@ -0,0 +1,18 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class AutopilotApi implements ICredentialType { + name = 'autopilotApi'; + displayName = 'Autopilot API'; + documentationUrl = 'autopilot'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Autopilot/Autopilot.node.ts b/packages/nodes-base/nodes/Autopilot/Autopilot.node.ts new file mode 100644 index 0000000000..1b4f312216 --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/Autopilot.node.ts @@ -0,0 +1,378 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeExecutionData, + INodePropertyOptions, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + autopilotApiRequest, + autopilotApiRequestAllItems, +} from './GenericFunctions'; + +import { + contactFields, + contactOperations, +} from './ContactDescription'; + +import { + contactJourneyFields, + contactJourneyOperations, +} from './ContactJourneyDescription'; + +import { + contactListFields, + contactListOperations, +} from './ContactListDescription'; + +import { + listFields, + listOperations, +} from './ListDescription'; + +export class Autopilot implements INodeType { + description: INodeTypeDescription = { + displayName: 'Autopilot', + name: 'autopilot', + icon: 'file:autopilot.svg', + group: ['input'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Autopilot API', + defaults: { + name: 'Autopilot', + color: '#6ad7b9', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'autopilotApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Contact', + value: 'contact', + }, + { + name: 'Contact Journey', + value: 'contactJourney', + }, + { + name: 'Contact List', + value: 'contactList', + }, + { + name: 'List', + value: 'list', + }, + ], + default: 'contact', + description: 'The resource to operate on.', + }, + + ...contactOperations, + ...contactFields, + ...contactJourneyOperations, + ...contactJourneyFields, + ...contactListOperations, + ...contactListFields, + ...listOperations, + ...listFields, + ], + }; + + methods = { + loadOptions: { + async getCustomFields( + this: ILoadOptionsFunctions, + ): Promise { + const returnData: INodePropertyOptions[] = []; + const customFields = await autopilotApiRequest.call( + this, + 'GET', + '/contacts/custom_fields', + ); + for (const customField of customFields) { + returnData.push({ + name: customField.name, + value: `${customField.name}-${customField.fieldType}`, + }); + } + return returnData; + }, + async getLists( + this: ILoadOptionsFunctions, + ): Promise { + const returnData: INodePropertyOptions[] = []; + const { lists } = await autopilotApiRequest.call( + this, + 'GET', + '/lists', + ); + for (const list of lists) { + returnData.push({ + name: list.title, + value: list.list_id, + }); + } + return returnData; + }, + async getTriggers( + this: ILoadOptionsFunctions, + ): Promise { + const returnData: INodePropertyOptions[] = []; + const { triggers } = await autopilotApiRequest.call( + this, + 'GET', + '/triggers', + ); + for (const trigger of triggers) { + returnData.push({ + name: trigger.journey, + value: trigger.trigger_id, + }); + } + return returnData; + }, + }, + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + const length = (items.length as unknown) as number; + const qs: IDataObject = {}; + let responseData; + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + for (let i = 0; i < length; i++) { + try { + if (resource === 'contact') { + if (operation === 'upsert') { + const email = this.getNodeParameter('email', i) as string; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + const body: IDataObject = { + Email: email, + }; + + Object.assign(body, additionalFields); + + if (body.customFieldsUi) { + const customFieldsValues = (body.customFieldsUi as IDataObject).customFieldsValues as IDataObject[]; + + body.custom = {}; + + for (const customField of customFieldsValues) { + const [name, fieldType] = (customField.key as string).split('-'); + + const fieldName = name.replace(/\s/g, '--'); + + //@ts-ignore + body.custom[`${fieldType}--${fieldName}`] = customField.value; + } + delete body.customFieldsUi; + } + + if (body.autopilotList) { + body._autopilot_list = body.autopilotList; + delete body.autopilotList; + } + + if (body.autopilotSessionId) { + body._autopilot_session_id = body.autopilotSessionId; + delete body.autopilotSessionId; + } + + if (body.newEmail) { + body._NewEmail = body.newEmail; + delete body.newEmail; + } + + responseData = await autopilotApiRequest.call( + this, + 'POST', + `/contact`, + { contact: body }, + ); + } + + if (operation === 'delete') { + const contactId = this.getNodeParameter('contactId', i) as string; + + responseData = await autopilotApiRequest.call( + this, + 'DELETE', + `/contact/${contactId}`, + ); + + responseData = { success: true }; + } + + if (operation === 'get') { + const contactId = this.getNodeParameter('contactId', i) as string; + + responseData = await autopilotApiRequest.call( + this, + 'GET', + `/contact/${contactId}`, + ); + } + + if (operation === 'getAll') { + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + responseData = await autopilotApiRequestAllItems.call( + this, + 'contacts', + 'GET', + `/contacts`, + {}, + qs, + ); + + if (returnAll === false) { + responseData = responseData.splice(0, qs.limit); + } + } + } + if (resource === 'contactJourney') { + if (operation === 'add') { + + const triggerId = this.getNodeParameter('triggerId', i) as string; + + const contactId = this.getNodeParameter('contactId', i) as string; + + responseData = await autopilotApiRequest.call( + this, + 'POST', + `/trigger/${triggerId}/contact/${contactId}`, + ); + + responseData = { success: true }; + } + } + if (resource === 'contactList') { + if (['add', 'remove', 'exist'].includes(operation)) { + + const listId = this.getNodeParameter('listId', i) as string; + + const contactId = this.getNodeParameter('contactId', i) as string; + + const method: { [key: string]: string } = { + 'add': 'POST', + 'remove': 'DELETE', + 'exist': 'GET', + }; + + const endpoint = `/list/${listId}/contact/${contactId}`; + + if (operation === 'exist') { + try { + await autopilotApiRequest.call(this, method[operation], endpoint); + responseData = { exist: true }; + } catch (error) { + responseData = { exist: false }; + } + } else if (operation === 'add' || operation === 'remove') { + responseData = await autopilotApiRequest.call(this, method[operation], endpoint); + responseData['success'] = true; + } + } + + if (operation === 'getAll') { + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + + const listId = this.getNodeParameter('listId', i) as string; + + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + responseData = await autopilotApiRequestAllItems.call( + this, + 'contacts', + 'GET', + `/list/${listId}/contacts`, + {}, + qs, + ); + + if (returnAll === false) { + responseData = responseData.splice(0, qs.limit); + } + } + } + if (resource === 'list') { + if (operation === 'create') { + + const name = this.getNodeParameter('name', i) as string; + + const body: IDataObject = { + name, + }; + + responseData = await autopilotApiRequest.call( + this, + 'POST', + `/list`, + body, + ); + } + + if (operation === 'getAll') { + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + responseData = await autopilotApiRequest.call( + this, + 'GET', + '/lists', + ); + + responseData = responseData.lists; + + if (returnAll === false) { + responseData = responseData.splice(0, qs.limit); + } + } + } + + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else if (responseData !== undefined) { + returnData.push(responseData as IDataObject); + } + + } catch (error) { + + if (this.continueOnFail()) { + returnData.push({ error: error.toString() }); + continue; + } + + throw error; + } + } + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Autopilot/AutopilotTrigger.node.ts b/packages/nodes-base/nodes/Autopilot/AutopilotTrigger.node.ts new file mode 100644 index 0000000000..7bb9be4341 --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/AutopilotTrigger.node.ts @@ -0,0 +1,140 @@ +import { + IHookFunctions, + IWebhookFunctions, +} from 'n8n-core'; + +import { + IDataObject, + INodeType, + INodeTypeDescription, + IWebhookResponseData, +} from 'n8n-workflow'; + +import { + autopilotApiRequest, +} from './GenericFunctions'; + +import { + snakeCase, +} from 'change-case'; + +export class AutopilotTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'Autopilot Trigger', + name: 'autopilotTrigger', + icon: 'file:autopilot.svg', + group: ['trigger'], + version: 1, + subtitle: '={{$parameter["event"]}}', + description: 'Handle Autopilot events via webhooks', + defaults: { + name: 'Autopilot Trigger', + color: '#6ad7b9', + }, + inputs: [], + outputs: ['main'], + credentials: [ + { + name: 'autopilotApi', + required: true, + }, + ], + webhooks: [ + { + name: 'default', + httpMethod: 'POST', + responseMode: 'onReceived', + path: 'webhook', + }, + ], + properties: [ + { + displayName: 'Event', + name: 'event', + type: 'options', + required: true, + default: '', + options: [ + { + name: 'Contact Added', + value: 'contactAdded', + }, + { + name: 'Contact Added To List', + value: 'contactAddedToList', + }, + { + name: 'Contact Entered Segment', + value: 'contactEnteredSegment', + }, + { + name: 'Contact Left Segment', + value: 'contactLeftSegment', + }, + { + name: 'Contact Removed From List', + value: 'contactRemovedFromList', + }, + { + name: 'Contact Unsubscribed', + value: 'contactUnsubscribed', + }, + { + name: 'Contact Updated', + value: 'contactUpdated', + }, + ], + }, + ], + }; + + // @ts-ignore + webhookMethods = { + default: { + async checkExists(this: IHookFunctions): Promise { + const webhookData = this.getWorkflowStaticData('node'); + const webhookUrl = this.getNodeWebhookUrl('default'); + const event = this.getNodeParameter('event') as string; + const { hooks: webhooks } = await autopilotApiRequest.call(this, 'GET', '/hooks'); + for (const webhook of webhooks) { + if (webhook.target_url === webhookUrl && webhook.event === snakeCase(event)) { + webhookData.webhookId = webhook.hook_id; + return true; + } + } + return false; + }, + async create(this: IHookFunctions): Promise { + const webhookUrl = this.getNodeWebhookUrl('default'); + const webhookData = this.getWorkflowStaticData('node'); + const event = this.getNodeParameter('event') as string; + const body: IDataObject = { + event: snakeCase(event), + target_url: webhookUrl, + }; + const webhook = await autopilotApiRequest.call(this, 'POST', '/hook', body); + webhookData.webhookId = webhook.hook_id; + return true; + }, + async delete(this: IHookFunctions): Promise { + const webhookData = this.getWorkflowStaticData('node'); + try { + await autopilotApiRequest.call(this, 'DELETE', `/hook/${webhookData.webhookId}`); + } catch (error) { + return false; + } + delete webhookData.webhookId; + return true; + }, + }, + }; + + async webhook(this: IWebhookFunctions): Promise { + const req = this.getRequestObject(); + return { + workflowData: [ + this.helpers.returnJsonArray(req.body), + ], + }; + } +} diff --git a/packages/nodes-base/nodes/Autopilot/ContactDescription.ts b/packages/nodes-base/nodes/Autopilot/ContactDescription.ts new file mode 100644 index 0000000000..d00c47c7bd --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/ContactDescription.ts @@ -0,0 +1,369 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const contactOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'contact', + ], + }, + }, + options: [ + { + name: 'Create/Update', + value: 'upsert', + description: 'Create/Update a contact', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a contact', + }, + { + name: 'Get', + value: 'get', + description: 'Get a contact', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get all contacts', + }, + ], + default: 'upsert', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const contactFields = [ + + /* -------------------------------------------------------------------------- */ + /* contact:upsert */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Email', + name: 'email', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'upsert', + ], + resource: [ + 'contact', + ], + }, + }, + default: '', + description: 'Email address of the contact.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + displayOptions: { + show: { + operation: [ + 'upsert', + ], + resource: [ + 'contact', + ], + }, + }, + default: {}, + placeholder: 'Add Field', + options: [ + { + displayName: 'Company', + name: 'Company', + type: 'string', + default: '', + }, + { + displayName: 'Custom Fields', + name: 'customFieldsUi', + type: 'fixedCollection', + default: '', + placeholder: 'Add Custom Field', + typeOptions: { + multipleValues: true, + loadOptionsMethod: 'getCustomFields', + }, + options: [ + { + name: 'customFieldsValues', + displayName: 'Custom Field', + values: [ + { + displayName: 'Key', + name: 'key', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getCustomFields', + }, + description: 'User-specified key of user-defined data.', + default: '', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + description: 'User-specified value of user-defined data.', + default: '', + }, + ], + }, + ], + }, + { + displayName: 'Fax', + name: 'Fax', + type: 'string', + default: '', + }, + { + displayName: 'First Name', + name: 'FirstName', + type: 'string', + default: '', + }, + { + displayName: 'Industry', + name: 'Industry', + type: 'string', + default: '', + }, + { + displayName: 'Last Name', + name: 'LastName', + type: 'string', + default: '', + }, + { + displayName: 'Lead Source', + name: 'LeadSource', + type: 'string', + default: '', + }, + { + displayName: 'LinkedIn URL', + name: 'LinkedIn', + type: 'string', + default: '', + }, + { + displayName: 'List ID', + name: 'autopilotList', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getLists', + }, + default: '', + description: 'List to which this contact will be added on creation.', + }, + { + displayName: 'Mailing Country', + name: 'MailingCountry', + type: 'string', + default: '', + }, + { + displayName: 'Mailing Postal Code', + name: 'MailingPostalCode', + type: 'string', + default: '', + }, + { + displayName: 'Mailing State', + name: 'MailingState', + type: 'string', + default: '', + }, + { + displayName: 'Mailing Street', + name: 'MailingStreet', + type: 'string', + default: '', + }, + { + displayName: 'Mailing City', + name: 'MailingCity', + type: 'string', + default: '', + }, + { + displayName: 'Mobile Phone', + name: 'MobilePhone', + type: 'string', + default: '', + }, + { + displayName: 'New Email', + name: 'newEmail', + type: 'string', + default: '', + description: 'If provided, will change the email address of the contact identified by the Email field.', + }, + { + displayName: 'Notify', + name: 'notify', + type: 'boolean', + default: true, + description: `By default Autopilot notifies registered REST hook endpoints for contact_added/contact_updated events when
a new contact is added or an existing contact is updated via API. Disable to skip notifications.`, + }, + { + displayName: 'Number of Employees', + name: 'NumberOfEmployees', + type: 'number', + default: 0, + }, + { + displayName: 'Owner Name', + name: 'owner_name', + type: 'string', + default: '', + }, + { + displayName: 'Phone', + name: 'Phone', + type: 'string', + default: '', + }, + { + displayName: 'Salutation', + name: 'Salutation', + type: 'string', + default: '', + }, + { + displayName: 'Session ID', + name: 'autopilotSessionId', + type: 'string', + default: '', + description: 'Used to associate a contact with a session.', + }, + { + displayName: 'Status', + name: 'Status', + type: 'string', + default: '', + }, + { + displayName: 'Title', + name: 'Title', + type: 'string', + default: '', + }, + { + displayName: 'Subscribe', + name: 'unsubscribed', + type: 'boolean', + default: false, + description: 'Whether to subscribe or un-subscribe a contact.', + }, + { + displayName: 'Website URL', + name: 'Website', + type: 'string', + default: '', + }, + ], + }, + + /* -------------------------------------------------------------------------- */ + /* contact:delete */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Contact ID', + name: 'contactId', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'contact', + ], + }, + }, + default: '', + description: 'Can be ID or email.', + }, + + /* -------------------------------------------------------------------------- */ + /* contact:get */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Contact ID', + name: 'contactId', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'contact', + ], + }, + }, + default: '', + description: 'Can be ID or email.', + }, + + /* -------------------------------------------------------------------------- */ + /* contact:getAll */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Autopilot/ContactJourneyDescription.ts b/packages/nodes-base/nodes/Autopilot/ContactJourneyDescription.ts new file mode 100644 index 0000000000..85c38a251f --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/ContactJourneyDescription.ts @@ -0,0 +1,73 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const contactJourneyOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'contactJourney', + ], + }, + }, + options: [ + { + name: 'Add', + value: 'add', + description: 'Add contact to list', + }, + ], + default: 'add', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const contactJourneyFields = [ + + /* -------------------------------------------------------------------------- */ + /* contactJourney:add */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Trigger ID', + name: 'triggerId', + required: true, + typeOptions: { + loadOptionsMethod: 'getTriggers', + }, + type: 'options', + displayOptions: { + show: { + operation: [ + 'add', + ], + resource: [ + 'contactJourney', + ], + }, + }, + default: '', + description: 'List ID.', + }, + { + displayName: 'Contact ID', + name: 'contactId', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'add', + ], + resource: [ + 'contactJourney', + ], + }, + }, + default: '', + description: 'Can be ID or email.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Autopilot/ContactListDescription.ts b/packages/nodes-base/nodes/Autopilot/ContactListDescription.ts new file mode 100644 index 0000000000..1e0a9d0ef2 --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/ContactListDescription.ts @@ -0,0 +1,138 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const contactListOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'contactList', + ], + }, + }, + options: [ + { + name: 'Add', + value: 'add', + description: 'Add contact to list.', + }, + { + name: 'Exist', + value: 'exist', + description: 'Check if contact is on list.', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get all contacts on list.', + }, + { + name: 'Remove', + value: 'remove', + description: 'Remove a contact from a list.', + }, + ], + default: 'add', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const contactListFields = [ + + /* -------------------------------------------------------------------------- */ + /* contactList:add */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'List ID', + name: 'listId', + required: true, + typeOptions: { + loadOptionsMethod: 'getLists', + }, + type: 'options', + displayOptions: { + show: { + operation: [ + 'add', + 'remove', + 'exist', + 'getAll', + ], + resource: [ + 'contactList', + ], + }, + }, + default: '', + description: 'ID of the list to operate on.', + }, + { + displayName: 'Contact ID', + name: 'contactId', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'add', + 'remove', + 'exist', + ], + resource: [ + 'contactList', + ], + }, + }, + default: '', + description: 'Can be ID or email.', + }, + + /* -------------------------------------------------------------------------- */ + /* contactList:getAll */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contactList', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contactList', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Autopilot/GenericFunctions.ts b/packages/nodes-base/nodes/Autopilot/GenericFunctions.ts new file mode 100644 index 0000000000..b4477f09b1 --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/GenericFunctions.ts @@ -0,0 +1,72 @@ +import { + OptionsWithUri, +} from 'request'; + +import { + IExecuteFunctions, + ILoadOptionsFunctions, +} from 'n8n-core'; + +import { + IDataObject, + IHookFunctions, + IWebhookFunctions, +} from 'n8n-workflow'; + +export async function autopilotApiRequest(this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any + + const credentials = this.getCredentials('autopilotApi') as IDataObject; + + const apiKey = `${credentials.apiKey}`; + + const endpoint = 'https://api2.autopilothq.com/v1'; + + const options: OptionsWithUri = { + headers: { + 'Content-Type': 'application/json', + autopilotapikey: apiKey, + }, + method, + body, + qs: query, + uri: uri || `${endpoint}${resource}`, + json: true, + }; + if (!Object.keys(body).length) { + delete options.body; + } + if (!Object.keys(query).length) { + delete options.qs; + } + + try { + return await this.helpers.request!(options); + } catch (error) { + if (error.response) { + const errorMessage = error.response.body.message || error.response.body.description || error.message; + throw new Error(`Autopilot error response [${error.statusCode}]: ${errorMessage}`); + } + throw error; + } +} + +export async function autopilotApiRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, propertyName: string, method: string, endpoint: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any + + const returnData: IDataObject[] = []; + const returnAll = this.getNodeParameter('returnAll', 0, false) as boolean; + + const base = endpoint; + + let responseData; + do { + responseData = await autopilotApiRequest.call(this, method, endpoint, body, query); + endpoint = `${base}/${responseData.bookmark}`; + returnData.push.apply(returnData, responseData[propertyName]); + if (query.limit && returnData.length >= query.limit && returnAll === false) { + return returnData; + } + } while ( + responseData.bookmark !== undefined + ); + return returnData; +} diff --git a/packages/nodes-base/nodes/Autopilot/ListDescription.ts b/packages/nodes-base/nodes/Autopilot/ListDescription.ts new file mode 100644 index 0000000000..17fcf56e6d --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/ListDescription.ts @@ -0,0 +1,102 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const listOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'list', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a list.', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get all lists.', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const listFields = [ + + /* -------------------------------------------------------------------------- */ + /* list:create */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Name', + name: 'name', + required: true, + type: 'string', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'list', + ], + }, + }, + default: '', + description: 'Name of the list to create.', + }, + + /* -------------------------------------------------------------------------- */ + /* list:getAll */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'list', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'list', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Autopilot/autopilot.svg b/packages/nodes-base/nodes/Autopilot/autopilot.svg new file mode 100644 index 0000000000..84edb88d2a --- /dev/null +++ b/packages/nodes-base/nodes/Autopilot/autopilot.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index eb8287839b..0a28bdc505 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -37,6 +37,7 @@ "dist/credentials/AsanaOAuth2Api.credentials.js", "dist/credentials/ApiTemplateIoApi.credentials.js", "dist/credentials/AutomizyApi.credentials.js", + "dist/credentials/AutopilotApi.credentials.js", "dist/credentials/Aws.credentials.js", "dist/credentials/AffinityApi.credentials.js", "dist/credentials/BannerbearApi.credentials.js", @@ -276,6 +277,8 @@ "dist/nodes/Affinity/Affinity.node.js", "dist/nodes/Affinity/AffinityTrigger.node.js", "dist/nodes/Automizy/Automizy.node.js", + "dist/nodes/Autopilot/Autopilot.node.js", + "dist/nodes/Autopilot/AutopilotTrigger.node.js", "dist/nodes/Aws/AwsLambda.node.js", "dist/nodes/Aws/Comprehend/AwsComprehend.node.js", "dist/nodes/Aws/Rekognition/AwsRekognition.node.js", From 71e21c2daeea9ec821c2ee69688bdbc4a915e83a Mon Sep 17 00:00:00 2001 From: Ahsan Virani Date: Thu, 11 Mar 2021 14:25:02 +0100 Subject: [PATCH 026/137] :zap: Add SASL mechanism option in Kafka (#1525) * :zap: add SASL mechasnim option in Kafka * add toggle for authentication in kafka credentials * :zap: Revery default value Co-authored-by: Jan Oberhauser --- .../credentials/Kafka.credentials.ts | 48 +++++++++++++++++++ packages/nodes-base/nodes/Kafka/Kafka.node.ts | 6 ++- .../nodes/Kafka/KafkaTrigger.node.ts | 6 ++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/credentials/Kafka.credentials.ts b/packages/nodes-base/credentials/Kafka.credentials.ts index 1774606977..a3fecfcdd6 100644 --- a/packages/nodes-base/credentials/Kafka.credentials.ts +++ b/packages/nodes-base/credentials/Kafka.credentials.ts @@ -28,10 +28,23 @@ export class Kafka implements ICredentialType { type: 'boolean' as NodePropertyTypes, default: true, }, + { + displayName: 'Authentication', + name: 'authentication', + type: 'boolean' as NodePropertyTypes, + default: false, + }, { displayName: 'Username', name: 'username', type: 'string' as NodePropertyTypes, + displayOptions: { + show: { + authentication: [ + true, + ], + }, + }, default: '', description: 'Optional username if authenticated is required.', }, @@ -39,11 +52,46 @@ export class Kafka implements ICredentialType { displayName: 'Password', name: 'password', type: 'string' as NodePropertyTypes, + displayOptions: { + show: { + authentication: [ + true, + ], + }, + }, typeOptions: { password: true, }, default: '', description: 'Optional password if authenticated is required.', }, + { + displayName: 'SASL mechanism', + name: 'saslMechanism', + type: 'options' as NodePropertyTypes, + displayOptions: { + show: { + authentication: [ + true, + ], + }, + }, + options: [ + { + name: 'plain', + value: 'plain', + }, + { + name: 'scram-sha-256', + value: 'scram-sha-256', + }, + { + name: 'scram-sha-512', + value: 'scram-sha-512', + }, + ], + default: 'plain', + description: 'The SASL mechanism.', + }, ]; } diff --git a/packages/nodes-base/nodes/Kafka/Kafka.node.ts b/packages/nodes-base/nodes/Kafka/Kafka.node.ts index 61f4268e24..2b7876a672 100644 --- a/packages/nodes-base/nodes/Kafka/Kafka.node.ts +++ b/packages/nodes-base/nodes/Kafka/Kafka.node.ts @@ -193,10 +193,14 @@ export class Kafka implements INodeType { ssl, }; - if (credentials.username || credentials.password) { + if (credentials.authentication === true) { + if(!(credentials.username && credentials.password)) { + throw new Error('Username and password are required for authentication'); + } config.sasl = { username: credentials.username as string, password: credentials.password as string, + mechanism: credentials.saslMechanism as string, } as SASLOptions; } diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index 3530b12a17..0c7e91abf4 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -123,10 +123,14 @@ export class KafkaTrigger implements INodeType { logLevel: logLevel.ERROR, }; - if (credentials.username || credentials.password) { + if (credentials.authentication === true) { + if(!(credentials.username && credentials.password)) { + throw new Error('Username and password are required for authentication'); + } config.sasl = { username: credentials.username as string, password: credentials.password as string, + mechanism: credentials.saslMechanism as string, } as SASLOptions; } From 148a94a8bb22f8aa589453da3a5f4489c8f94762 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 12 Mar 2021 04:23:35 -0500 Subject: [PATCH 027/137] :bug: Fix bug when updating and deleting records (#1532) --- .../nodes/Airtable/Airtable.node.ts | 25 +++++++++---------- .../nodes/Airtable/GenericFunctions.ts | 1 + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/nodes-base/nodes/Airtable/Airtable.node.ts b/packages/nodes-base/nodes/Airtable/Airtable.node.ts index 4f15041474..62dc8a47fc 100644 --- a/packages/nodes-base/nodes/Airtable/Airtable.node.ts +++ b/packages/nodes-base/nodes/Airtable/Airtable.node.ts @@ -137,7 +137,7 @@ export class Airtable implements INodeType { // delete // ---------------------------------- { - displayName: 'Id', + displayName: 'ID', name: 'id', type: 'string', displayOptions: { @@ -317,7 +317,7 @@ export class Airtable implements INodeType { // read // ---------------------------------- { - displayName: 'Id', + displayName: 'ID', name: 'id', type: 'string', displayOptions: { @@ -336,7 +336,7 @@ export class Airtable implements INodeType { // update // ---------------------------------- { - displayName: 'Id', + displayName: 'ID', name: 'id', type: 'string', displayOptions: { @@ -499,7 +499,7 @@ export class Airtable implements INodeType { for (let i = 0; i < items.length; i++) { id = this.getNodeParameter('id', i) as string; - endpoint = `${application}/${table}/${id}`; + endpoint = `${application}/${table}`; // Make one request after another. This is slower but makes // sure that we do not run into the rate limit they have in @@ -507,9 +507,11 @@ export class Airtable implements INodeType { // functionality in core should make it easy to make requests // according to specific rules like not more than 5 requests // per seconds. + qs.records = [id]; + responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs); - returnData.push(responseData); + returnData.push(...responseData.records); } } else if (operation === 'list') { @@ -586,7 +588,6 @@ export class Airtable implements INodeType { let updateAllFields: boolean; let fields: string[]; let options: IDataObject; - for (let i = 0; i < items.length; i++) { updateAllFields = this.getNodeParameter('updateAllFields', i) as boolean; options = this.getNodeParameter('options', i, {}) as IDataObject; @@ -616,13 +617,9 @@ export class Airtable implements INodeType { } } - if (options.typecast === true) { - body['typecast'] = true; - } - id = this.getNodeParameter('id', i) as string; - endpoint = `${application}/${table}/${id}`; + endpoint = `${application}/${table}`; // Make one request after another. This is slower but makes // sure that we do not run into the rate limit they have in @@ -631,9 +628,11 @@ export class Airtable implements INodeType { // according to specific rules like not more than 5 requests // per seconds. - responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs); + const data = { records: [{ id, fields: body.fields }], typecast: (options.typecast) ? true : false }; - returnData.push(responseData); + responseData = await apiRequest.call(this, requestMethod, endpoint, data, qs); + + returnData.push(...responseData.records); } } else { diff --git a/packages/nodes-base/nodes/Airtable/GenericFunctions.ts b/packages/nodes-base/nodes/Airtable/GenericFunctions.ts index d13b3a5723..9fbcd5785d 100644 --- a/packages/nodes-base/nodes/Airtable/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Airtable/GenericFunctions.ts @@ -58,6 +58,7 @@ export async function apiRequest(this: IHookFunctions | IExecuteFunctions | ILoa body, qs: query, uri: uri || `https://api.airtable.com/v0/${endpoint}`, + useQuerystring: false, json: true, }; From 1e580a9b85693b62c14a04e4c65b04db53ded453 Mon Sep 17 00:00:00 2001 From: Miquel Colomer Date: Fri, 12 Mar 2021 10:51:35 +0100 Subject: [PATCH 028/137] + fix spaces --- .../nodes-base/nodes/UProc/Json/Groups.ts | 37 +------------------ packages/nodes-base/nodes/UProc/Json/Tools.ts | 2 +- 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/packages/nodes-base/nodes/UProc/Json/Groups.ts b/packages/nodes-base/nodes/UProc/Json/Groups.ts index b5da15f0c0..693bc2d221 100644 --- a/packages/nodes-base/nodes/UProc/Json/Groups.ts +++ b/packages/nodes-base/nodes/UProc/Json/Groups.ts @@ -1,36 +1 @@ -export const groups = { - groups: [{ - "translated": "Audio", - "name": "audio" - }, { - "translated": "Communication", - "name": "communication" - }, { - "translated": "Company", - "name": "company" - }, { - "translated": "Finance", - "name": "finance" - }, { - "translated": "Geographical", - "name": "geographic" - }, { - "translated": "Image", - "name": "image" - }, { - "translated": "Internet", - "name": "internet" - }, { - "translated": "Personal", - "name": "personal" - }, { - "translated": "Product", - "name": "product" - }, { - "translated": "Security", - "name": "security" - }, { - "translated": "Text", - "name": "text" - }] -}; \ No newline at end of file +export const groups = {groups: [{'translated':'Audio','name':'audio'},{'translated':'Communication','name':'communication'},{'translated':'Company','name':'company'},{'translated':'Finance','name':'finance'},{'translated':'Geographical','name':'geographic'},{'translated':'Image','name':'image'},{'translated':'Internet','name':'internet'},{'translated':'Personal','name':'personal'},{'translated':'Product','name':'product'},{'translated':'Security','name':'security'},{'translated':'Text','name':'text'}]}; \ No newline at end of file diff --git a/packages/nodes-base/nodes/UProc/Json/Tools.ts b/packages/nodes-base/nodes/UProc/Json/Tools.ts index f3309ffb84..72c4ae8148 100644 --- a/packages/nodes-base/nodes/UProc/Json/Tools.ts +++ b/packages/nodes-base/nodes/UProc/Json/Tools.ts @@ -1 +1 @@ -export const tools = {processors: [{"k":"checkCreditcardChecksum","d":"Check Card Number Has Valid Format","ed":"Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)","g":"finance","p":[{"n":"credit_card","r":true,"t":"string","p":"4024007151839544"}]},{"k":"getCreditcardType","d":"Get Credit Card Type By Number","ed":"Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)","g":"finance","p":[{"n":"credit_card","r":true,"t":"string","p":"4024007151839544"}]},{"k":"getAddressBySearch","d":"Get Exact Address By Search","ed":"Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120, Barcelona, España"}]},{"k":"getCoordinateBySearch","d":"Get Coordinates By Search","ed":"Discover latitude and longitude coordinates of a postal address","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona, España"}]},{"k":"checkAddressExist","d":"Check Exact Address Exists","ed":"Check if an exact address exists by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getAddressNormalized","d":"Get Normalized Address","ed":"Allow to normalize an address, removing non allowed characters","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120, Barcelona Spain"}]},{"k":"checkAddressNumberExist","d":"Check Street Number Exists","ed":"Check if a house number exists by a partial address search","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Urgell, 120, Barcelona"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getAddressSplitted","d":"Get Parsed Address","ed":"Parse postal address into separated fields, getting a basic resolution","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120 08036 Barcelona Barcelona Spain"}]},{"k":"getAddressSplittedBest","d":"Get Improved Parsed Address","ed":"Parse postal address into separated fields, getting an improved resolution","g":"geographic","p":[{"n":"address","r":true,"t":"string","p":"Compte Mallorca, 120 08036 Barcelona Barcelona Spain"}]},{"k":"checkCoordinateValid","d":"Check Valid Coordinates","ed":"Check if coordinates have a valid format","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"checkAgeBetw","d":"Check Age Between","ed":"Check if age is between two numbers","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years1","r":true,"t":"number","p":"35"},{"n":"years2","r":true,"t":"number","p":"50"}]},{"k":"getAgeByDate","d":"Get Age By Date","ed":"Discover the age of a birth date (multiple formats allowed)","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"checkAgeEq","d":"Check Ages Are Equal","ed":"Check if ages are equal","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"45"}]},{"k":"checkAgeGe","d":"Check Age Is Greater Or Equal","ed":"Check if age is greater or equal than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"43"}]},{"k":"checkAgeGt","d":"Check Age Is Greater","ed":"Check if age is greater than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"40"}]},{"k":"checkAgeIsAdult","d":"Check Age Is Greater Than Or Equal To 18 Years","ed":"Check if birth date belongs to an adult: 18 years old (Spain)","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1950-05-20"}]},{"k":"checkAgeIsForties","d":"Check Age Is Between 40 And 49 Years","ed":"Check if date returns an age between 40 and 49 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"checkAgeIsRetired","d":"Check Age Is Greater Than 64 Years","ed":"Check if birth date returns an age greater than 64 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1954-05-20"}]},{"k":"checkAgeIsTwenties","d":"Check Age Is Between 20 And 29 Years","ed":"Check if date returns an age between 20 and 29 years old","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"2000-05-20"}]},{"k":"checkAgeLe","d":"Check Age Is Lower Or Equal","ed":"Check if age is lower or equal than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"46"}]},{"k":"checkAgeLt","d":"Check Age Is Lower","ed":"Chekc if age is lower than another","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"},{"n":"years","r":true,"t":"number","p":"46"}]},{"k":"getAgeRange","d":"Get Age Range By Date","ed":"Discover the age range of a person by birth date","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"getAsinByEan","d":"Get ASIN By EAN","ed":"Get ASIN code by EAN code querying Internet.","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"0635753490879"}]},{"k":"checkAsinExist","d":"Check ASIN Exists","ed":"Check if a ASIN code exists on Amazon marketplace","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"checkAsinValid","d":"Check ASIN Valid","ed":"Check if a ASIN code has a valid format","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"getAudioAdvancedSpeechByText","d":"Get Advanced Speech By Text","ed":"Get advanced human audio file by provided text and language","g":"audio","p":[{"n":"text","r":true,"t":"string","p":"Hi! My name is Miquel. I will read any text you type here."},{"n":"gender","r":true,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]},{"n":"language","r":true,"t":"options","p":"american","o":[{"name":"American","value":"american"},{"name":"Arabic","value":"arabic"},{"name":"Bengali","value":"bengali"},{"name":"British","value":"british"},{"name":"Czech","value":"czech"},{"name":"Danish","value":"danish"},{"name":"Dutch","value":"dutch"},{"name":"Filipino","value":"filipino"},{"name":"Finnish","value":"finnish"},{"name":"French","value":"french"},{"name":"German","value":"german"},{"name":"Greek","value":"greek"},{"name":"Gujurati","value":"gujurati"},{"name":"Hindi","value":"hindi"},{"name":"Hungarian","value":"hungarian"},{"name":"Indonesian","value":"indonesian"},{"name":"Italian","value":"italian"},{"name":"Japanese","value":"japanese"},{"name":"Kannada","value":"kannada"},{"name":"Korean","value":"korean"},{"name":"Malayalam","value":"malayalam"},{"name":"Mandarin","value":"mandarin"},{"name":"Norwegian","value":"norwegian"},{"name":"Polish","value":"polish"},{"name":"Portuguese","value":"portuguese"},{"name":"Russian","value":"russian"},{"name":"Slovak","value":"slovak"},{"name":"Spanish","value":"spanish"},{"name":"Tamil","value":"tamil"},{"name":"Telugu","value":"telugu"},{"name":"Thai","value":"thai"},{"name":"Turkish","value":"turkish"},{"name":"Ukranian","value":"ukranian"},{"name":"Vietnamese","value":"vietnamese"}]}]},{"k":"getAudioSpeechByText","d":"Get Speech By Text","ed":"Get audio file by provided text and language","g":"audio","p":[{"n":"text","r":true,"t":"string","p":"Hi! My name is Miquel. I will read any text you type here."},{"n":"gender","r":true,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]},{"n":"language","r":true,"t":"options","p":"american","o":[{"name":"American","value":"american"},{"name":"French","value":"french"},{"name":"German","value":"german"},{"name":"Italian","value":"italian"},{"name":"Japanese","value":"japanese"},{"name":"Portuguese","value":"portuguese"},{"name":"Russian","value":"russian"},{"name":"Spanish","value":"spanish"}]}]},{"k":"checkBankAccountValidEs","d":"Check Bank Account Is Valid (ES)","ed":"Discover if account number has a valid format","g":"finance","p":[{"n":"account","r":true,"t":"string","p":"14650120311716144388"}]},{"k":"checkBankBicValid","d":"Check BIC Is Valid","ed":"Discover if BIC number has a valid format","g":"finance","p":[{"n":"bic","r":true,"t":"string","p":"DABAIE2D"}]},{"k":"getBankIbanByAccount","d":"Get IBAN By Account","ed":"Get IBAN number by account number of the country","g":"finance","p":[{"n":"account","r":true,"t":"string","p":"14650120311716144388"},{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getBankIbanLookup","d":"Get IBAN Lookup","ed":"Get to search data bank information by IBAN account number","g":"finance","p":[{"n":"iban","r":true,"t":"string","p":"NL91ABNA0417164300"}]},{"k":"checkBankIbanValid","d":"Check IBAN Is Valid","ed":"Discover if IBAN account number has a valid format","g":"finance","p":[{"n":"iban","r":true,"t":"string","p":"ES3314650120311716144388"}]},{"k":"getBarcodeEncoded","d":"Get Encoded Barcode","ed":"Get an encoded barcode by number and required standard","g":"image","p":[{"n":"text","r":true,"t":"string","p":"0635753490879"},{"n":"bcid","r":true,"t":"options","p":"ean13","o":[{"name":"Auspost","value":"auspost"},{"name":"Azteccode","value":"azteccode"},{"name":"Azteccodecompact","value":"azteccodecompact"},{"name":"Aztecrune","value":"aztecrune"},{"name":"Bc412","value":"bc412"},{"name":"Channelcode","value":"channelcode"},{"name":"Codablockf","value":"codablockf"},{"name":"Code11","value":"code11"},{"name":"Code128","value":"code128"},{"name":"Code16k","value":"code16k"},{"name":"Code2of5","value":"code2of5"},{"name":"Code32","value":"code32"},{"name":"Code39","value":"code39"},{"name":"Code39ext","value":"code39ext"},{"name":"Code49","value":"code49"},{"name":"Code93","value":"code93"},{"name":"Code93ext","value":"code93ext"},{"name":"Codeone","value":"codeone"},{"name":"Coop2of5","value":"coop2of5"},{"name":"Daft","value":"daft"},{"name":"Databarexpanded","value":"databarexpanded"},{"name":"Databarexpandedcomposite","value":"databarexpandedcomposite"},{"name":"Databarexpandedstacked","value":"databarexpandedstacked"},{"name":"Databarexpandedstackedcomposite","value":"databarexpandedstackedcomposite"},{"name":"Databarlimited","value":"databarlimited"},{"name":"Databarlimitedcomposite","value":"databarlimitedcomposite"},{"name":"Databaromni","value":"databaromni"},{"name":"Databaromnicomposite","value":"databaromnicomposite"},{"name":"Databarstacked","value":"databarstacked"},{"name":"Databarstackedcomposite","value":"databarstackedcomposite"},{"name":"Databarstackedomni","value":"databarstackedomni"},{"name":"Databarstackedomnicomposite","value":"databarstackedomnicomposite"},{"name":"Databartruncated","value":"databartruncated"},{"name":"Databartruncatedcomposite","value":"databartruncatedcomposite"},{"name":"Datalogic2of5","value":"datalogic2of5"},{"name":"Datamatrix","value":"datamatrix"},{"name":"Datamatrixrectangular","value":"datamatrixrectangular"},{"name":"Dotcode","value":"dotcode"},{"name":"Ean13","value":"ean13"},{"name":"Ean13composite","value":"ean13composite"},{"name":"Ean14","value":"ean14"},{"name":"Ean2","value":"ean2"},{"name":"Ean5","value":"ean5"},{"name":"Ean8","value":"ean8"},{"name":"Ean8composite","value":"ean8composite"},{"name":"Flattermarken","value":"flattermarken"},{"name":"Gs1-128","value":"gs1-128"},{"name":"Gs1-128composite","value":"gs1-128composite"},{"name":"Gs1-cc","value":"gs1-cc"},{"name":"Gs1datamatrix","value":"gs1datamatrix"},{"name":"Gs1datamatrixrectangular","value":"gs1datamatrixrectangular"},{"name":"Gs1northamericancoupon","value":"gs1northamericancoupon"},{"name":"Hanxin","value":"hanxin"},{"name":"Hibcazteccode","value":"hibcazteccode"},{"name":"Hibccodablockf","value":"hibccodablockf"},{"name":"Hibccode128","value":"hibccode128"},{"name":"Hibccode39","value":"hibccode39"},{"name":"Hibcdatamatrix","value":"hibcdatamatrix"},{"name":"Hibcdatamatrixrectangular","value":"hibcdatamatrixrectangular"},{"name":"Hibcmicropdf417","value":"hibcmicropdf417"},{"name":"Hibcpdf417","value":"hibcpdf417"},{"name":"Iata2of5","value":"iata2of5"},{"name":"Identcode","value":"identcode"},{"name":"Industrial2of5","value":"industrial2of5"},{"name":"Interleaved2of5","value":"interleaved2of5"},{"name":"Isbn","value":"isbn"},{"name":"Ismn","value":"ismn"},{"name":"Issn","value":"issn"},{"name":"Itf14","value":"itf14"},{"name":"Japanpost","value":"japanpost"},{"name":"Kix","value":"kix"},{"name":"Leitcode","value":"leitcode"},{"name":"Matrix2of5","value":"matrix2of5"},{"name":"Maxicode","value":"maxicode"},{"name":"Micropdf417","value":"micropdf417"},{"name":"Msi","value":"msi"},{"name":"Onecode","value":"onecode"},{"name":"Pdf417","value":"pdf417"},{"name":"Pdf417compact","value":"pdf417compact"},{"name":"Pharmacode","value":"pharmacode"},{"name":"Pharmacode2","value":"pharmacode2"},{"name":"Planet","value":"planet"},{"name":"Plessey","value":"plessey"},{"name":"Posicode","value":"posicode"},{"name":"Postnet","value":"postnet"},{"name":"Pzn","value":"pzn"},{"name":"RationalizedCodabar","value":"rationalizedCodabar"},{"name":"Raw","value":"raw"},{"name":"Royalmail","value":"royalmail"},{"name":"Sscc18","value":"sscc18"},{"name":"Symbol","value":"symbol"},{"name":"Telepen","value":"telepen"},{"name":"Telepennumeric","value":"telepennumeric"},{"name":"Ultracode","value":"ultracode"},{"name":"Upca","value":"upca"},{"name":"Upcacomposite","value":"upcacomposite"},{"name":"Upce","value":"upce"},{"name":"Upcecomposite","value":"upcecomposite"}]}]},{"k":"getBookAuthorLookup","d":"Get Book By Author","ed":"Get book by author's surname","g":"product","p":[{"n":"author","r":true,"t":"string","p":"Albert Einstein"}]},{"k":"getBookCategoryLookup","d":"Get Book By Category","ed":"Get all publications by category","g":"product","p":[{"n":"category","r":true,"t":"string","p":"science"}]},{"k":"checkBookIsbn","d":"Check ISBN Code Is Valid","ed":"Allow to check if an ISBN10/13 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"0306406152"}]},{"k":"checkBookIsbnExist","d":"Check ISBN Code Exists","ed":"Allow to check if an ISBN book exist","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"getBookIsbnLookup","d":"Get Book By ISBN","ed":"Get book or publication data by 10 or 13 digits ISBN code","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"checkBookIsbn10","d":"Check ISBN10 Code Is Valid","ed":"Allow to check if an ISBN10 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"0306406152"}]},{"k":"checkBookIsbn13","d":"Check ISBN13 Code Is Valid","ed":"Allow to check if an ISBN13 code has a valid format","g":"product","p":[{"n":"isbn","r":true,"t":"string","p":"9780306406157"}]},{"k":"getBookListAuthorLookup","d":"Get Books By Author","ed":"Get books by author's surname","g":"product","p":[{"n":"author","r":true,"t":"string","p":"Albert Einstein"}]},{"k":"getBookListCategoryLookup","d":"Get Books By Category","ed":"Get all books by category","g":"product","p":[{"n":"category","r":true,"t":"string","p":"science"}]},{"k":"getBookListPublisherLookup","d":"Get Books By Editor","ed":"Get all books by editor","g":"product","p":[{"n":"publisher","r":true,"t":"string","p":"Grupo RBA"}]},{"k":"getBookListTitleLookup","d":"Get Books By Title","ed":"Get all books by title","g":"product","p":[{"n":"title","r":true,"t":"string","p":"Science"}]},{"k":"getBookPublisherLookup","d":"Get Book By Editor","ed":"Get book data by editor's name","g":"product","p":[{"n":"publisher","r":true,"t":"string","p":"Grupo RBA"}]},{"k":"getBookTitleLookup","d":"Get Book By Title","ed":"Get book data by title","g":"product","p":[{"n":"title","r":true,"t":"string","p":"La empresa más feliz del mundo"}]},{"k":"getNifByDni","d":"Get NIF By DNI (ES)","ed":"Discover the letter of a dni card number","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016116"}]},{"k":"getCifNormalized","d":"Get Normalized CIF","ed":"Allow to normalize a CIF number, removing non allowed characters","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"B 62084 959"}]},{"k":"getDniNormalized","d":"Get Normalized DNI (ES)","ed":"Allow to normalize a DNI number, removing non allowed characters","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016a116"}]},{"k":"getNieNormalized","d":"Get Normalized NIE (ES)","ed":"Allow to normalize a NIE number, removing non allowed characters","g":"personal","p":[{"n":"nie","r":true,"t":"string","p":"X402001 122g"}]},{"k":"getNifNormalized","d":"Get Normalized NIF (ES)","ed":"Allow to normalize a NIF number, removing non allowed characters","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"402001 122g"}]},{"k":"checkCifValid","d":"Check CIF Is Valid (ES)","ed":"Discover if a cif card number is valid","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"A58818501"}]},{"k":"checkDniValid","d":"Check Valid Dni (ES)","ed":"Discover if a dni card number is valid","g":"personal","p":[{"n":"dni","r":true,"t":"string","p":"44016116"}]},{"k":"checkNieValid","d":"Check NIE Is Valid (ES)","ed":"Discover if a NIE card number is valid","g":"personal","p":[{"n":"nie","r":true,"t":"string","p":"Y2918527W"}]},{"k":"checkNifValid","d":"Check NIF Is Valid (ES)","ed":"Discover if a nif card number is valid","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"44016116G"}]},{"k":"getCityByIp","d":"Get City By IP","ed":"Get city from ip","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCityByName","d":"Get City By Name (ES)","ed":"City search by partial name (only Spain)","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Bar"}]},{"k":"getCityByPhone","d":"Get City By Phone (ES)","ed":"Discover the city name by the local phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932187670"}]},{"k":"getCityByZipcode","d":"Get City By Zipcode (ES)","ed":"Discover the city name by the zipcode (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getCityListByName","d":"Get Cities By Prefix (ES)","ed":"Get multiple cities by partial initial text (only Spain)","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Barce"}]},{"k":"getCityListByPhone","d":"Get Cities By Phone (ES)","ed":"Get multiple cities by phone prefix (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"938499145"}]},{"k":"getCityListByZipcode","d":"Get Cities By Zipcode (ES)","ed":"Get multiple cities by zipcode prefix (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"234"}]},{"k":"getCityNormalized","d":"Get Normalized City","ed":"Allow to normalize a city, removing non allowed characters","g":"geographic","p":[{"n":"city","r":true,"t":"string","p":"Barc3l0na"}]},{"k":"checkEan13Valid","d":"Check EAN13 Is Valid","ed":"Check if a EAN barcode of 13 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"4006381333931"}]},{"k":"checkGtin13Valid","d":"Check GTIN13 Is Valid","ed":"Check if a GTIN barcode of 13 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"4006381333931"}]},{"k":"checkEan14Valid","d":"Check EAN14 Is Valid","ed":"Check if a EAN barcode of 14 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"04006381333931"}]},{"k":"checkGtin14Valid","d":"Check GTIN14 Is Valid","ed":"Check if a GTIN barcode of 14 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"04006381333931"}]},{"k":"checkEan18Valid","d":"Check EAN18 Is Valid","ed":"Check if a EAN barcode of 18 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"000004006381333931"}]},{"k":"checkEan8Valid","d":"Check EAN8 Is Valid","ed":"Check if a EAN barcode of 8 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"checkGtin8Valid","d":"Check GTIN8 Is Valid","ed":"Check if a GTIN barcode of 8 digits has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"getEanByAsin","d":"Get EAN By ASIN","ed":"Get EAN code by ASIN code querying Internet.","g":"product","p":[{"n":"asin","r":true,"t":"string","p":"B00005N5PF"}]},{"k":"checkEanExist","d":"Check EAN Exists","ed":"Check if a EAN code exists on Amazon Marketplace (.com supported)","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"0635753490879"}]},{"k":"checkUpcExist","d":"Check UPC Exists","ed":"Check if a UPC code exists","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkUpcFormat","d":"Check UPC Has Valid Format","ed":"Check if a UPC code has a valid format","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkNumberIsin","d":"Check ISIN Code Is Valid","ed":"Check if ISIN number is valid","g":"company","p":[{"n":"isin","r":true,"t":"string","p":"US0378331005"}]},{"k":"getUpcLookup","d":"Get Product By UPC","ed":"Get product data of an UPC code on Amazon Marketplace (.com supported)","g":"product","p":[{"n":"upc","r":true,"t":"string","p":"635753490879"}]},{"k":"checkNumberSsEs","d":"Check Social Security Number Is Valid (ES)","ed":"Check if SS number is valid, only for Spain","g":"company","p":[{"n":"number","r":true,"t":"string","p":"998239812282"}]},{"k":"checkNumberUuid","d":"Check UUID Number Is Valid","ed":"Check if it a valid UUID number","g":"security","p":[{"n":"uuid","r":true,"t":"string","p":"550e8400-e29b-41d4-a716-446655440000"}]},{"k":"checkEanValid","d":"Check EAN Is Valid","ed":"Check if a EAN barcode (8 or 13 digits) has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"checkGtinValid","d":"Check GTIN Is Valid","ed":"Check if a GTIN barcode (8 or 13 digits) has a valid format","g":"product","p":[{"n":"ean","r":true,"t":"string","p":"40063812"}]},{"k":"getCommunityByZipcode","d":"Get Community By Zipcode (ES)","ed":"Discover the community name from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getCompanyByCif","d":"Get Company By CIF (ES)","ed":"Get company data by CIF","g":"company","p":[{"n":"cif","r":true,"t":"string","p":"B66998592"}]},{"k":"getCompanyByDomain","d":"Get Company By Domain","ed":"Get company data by domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getCompanyByDuns","d":"Get Company By DUNS (ES)","ed":"Get company data by DUNS","g":"company","p":[{"n":"duns","r":true,"t":"string","p":"464016690"}]},{"k":"getCompanyByEmail","d":"Get Company By Email","ed":"Get company data by email","g":"company","p":[{"n":"email","r":true,"t":"string","p":"hello@killia.com"}]},{"k":"getCompanyByIp","d":"Get Company By IP","ed":"Get company data by IP address","g":"company","p":[{"n":"ip","r":true,"t":"string","p":"74.125.228.72"}]},{"k":"getCompanyByName","d":"Get Company By Name","ed":"Get company data by name","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."},{"n":"country","r":false,"t":"options","p":"Spain","o":[{"name":"Afghanistan","value":"Afghanistan"},{"name":"Albania","value":"Albania"},{"name":"Algeria","value":"Algeria"},{"name":"American Samoa","value":"American Samoa"},{"name":"Andorra","value":"Andorra"},{"name":"Angola","value":"Angola"},{"name":"Anguilla","value":"Anguilla"},{"name":"Antarctica","value":"Antarctica"},{"name":"Antigua And Barbuda","value":"Antigua And Barbuda"},{"name":"Argentina","value":"Argentina"},{"name":"Armenia","value":"Armenia"},{"name":"Aruba","value":"Aruba"},{"name":"Australia","value":"Australia"},{"name":"Austria","value":"Austria"},{"name":"Azerbaijan","value":"Azerbaijan"},{"name":"Bahamas","value":"Bahamas"},{"name":"Bahrain","value":"Bahrain"},{"name":"Bangladesh","value":"Bangladesh"},{"name":"Barbados","value":"Barbados"},{"name":"Belarus","value":"Belarus"},{"name":"Belgium","value":"Belgium"},{"name":"Belize","value":"Belize"},{"name":"Benin","value":"Benin"},{"name":"Bermuda","value":"Bermuda"},{"name":"Bhutan","value":"Bhutan"},{"name":"Bolivia","value":"Bolivia"},{"name":"Bosnia And Herzegovina","value":"Bosnia And Herzegovina"},{"name":"Botswana","value":"Botswana"},{"name":"Bouvet Island","value":"Bouvet Island"},{"name":"Brazil","value":"Brazil"},{"name":"British Indian Ocean Territory","value":"British Indian Ocean Territory"},{"name":"Brunei Darussalam","value":"Brunei Darussalam"},{"name":"Bulgaria","value":"Bulgaria"},{"name":"Burkina Faso","value":"Burkina Faso"},{"name":"Burundi","value":"Burundi"},{"name":"Cambodia","value":"Cambodia"},{"name":"Cameroon","value":"Cameroon"},{"name":"Canada","value":"Canada"},{"name":"Cape Verde","value":"Cape Verde"},{"name":"Cayman Islands","value":"Cayman Islands"},{"name":"Central African Republic","value":"Central African Republic"},{"name":"Chad","value":"Chad"},{"name":"Chile","value":"Chile"},{"name":"China","value":"China"},{"name":"Christmas Island","value":"Christmas Island"},{"name":"Cocos (keeling) Islands","value":"Cocos (keeling) Islands"},{"name":"Colombia","value":"Colombia"},{"name":"Comoros","value":"Comoros"},{"name":"Congo","value":"Congo"},{"name":"Congo, The Democratic Republic Of The","value":"Congo, The Democratic Republic Of The"},{"name":"Cook Islands","value":"Cook Islands"},{"name":"Costa Rica","value":"Costa Rica"},{"name":"Cote D'ivoire","value":"Cote D'ivoire"},{"name":"Croatia","value":"Croatia"},{"name":"Cuba","value":"Cuba"},{"name":"Cyprus","value":"Cyprus"},{"name":"Czech Republic","value":"Czech Republic"},{"name":"Denmark","value":"Denmark"},{"name":"Djibouti","value":"Djibouti"},{"name":"Dominica","value":"Dominica"},{"name":"Dominican Republic","value":"Dominican Republic"},{"name":"East Timor","value":"East Timor"},{"name":"Ecuador","value":"Ecuador"},{"name":"Egypt","value":"Egypt"},{"name":"El Salvador","value":"El Salvador"},{"name":"Equatorial Guinea","value":"Equatorial Guinea"},{"name":"Eritrea","value":"Eritrea"},{"name":"Estonia","value":"Estonia"},{"name":"Ethiopia","value":"Ethiopia"},{"name":"Falkland Islands (malvinas)","value":"Falkland Islands (malvinas)"},{"name":"Faroe Islands","value":"Faroe Islands"},{"name":"Fiji","value":"Fiji"},{"name":"Finland","value":"Finland"},{"name":"France","value":"France"},{"name":"French Guiana","value":"French Guiana"},{"name":"French Polynesia","value":"French Polynesia"},{"name":"French Southern Territories","value":"French Southern Territories"},{"name":"Gabon","value":"Gabon"},{"name":"Gambia","value":"Gambia"},{"name":"Georgia","value":"Georgia"},{"name":"Germany","value":"Germany"},{"name":"Ghana","value":"Ghana"},{"name":"Gibraltar","value":"Gibraltar"},{"name":"Greece","value":"Greece"},{"name":"Greenland","value":"Greenland"},{"name":"Grenada","value":"Grenada"},{"name":"Guadeloupe","value":"Guadeloupe"},{"name":"Guam","value":"Guam"},{"name":"Guatemala","value":"Guatemala"},{"name":"Guinea","value":"Guinea"},{"name":"Guinea-bissau","value":"Guinea-bissau"},{"name":"Guyana","value":"Guyana"},{"name":"Haiti","value":"Haiti"},{"name":"Heard Island And Mcdonald Islands","value":"Heard Island And Mcdonald Islands"},{"name":"Holy See (vatican City State)","value":"Holy See (vatican City State)"},{"name":"Honduras","value":"Honduras"},{"name":"Hong Kong","value":"Hong Kong"},{"name":"Hungary","value":"Hungary"},{"name":"Iceland","value":"Iceland"},{"name":"India","value":"India"},{"name":"Indonesia","value":"Indonesia"},{"name":"Iran, Islamic Republic Of","value":"Iran, Islamic Republic Of"},{"name":"Iraq","value":"Iraq"},{"name":"Ireland","value":"Ireland"},{"name":"Israel","value":"Israel"},{"name":"Italy","value":"Italy"},{"name":"Jamaica","value":"Jamaica"},{"name":"Japan","value":"Japan"},{"name":"Jordan","value":"Jordan"},{"name":"Kazakstan","value":"Kazakstan"},{"name":"Kenya","value":"Kenya"},{"name":"Kiribati","value":"Kiribati"},{"name":"Korea, Democratic People's Republic Of","value":"Korea, Democratic People's Republic Of"},{"name":"Korea, Republic Of","value":"Korea, Republic Of"},{"name":"Kosovo","value":"Kosovo"},{"name":"Kuwait","value":"Kuwait"},{"name":"Kyrgyzstan","value":"Kyrgyzstan"},{"name":"Lao People's Democratic Republic","value":"Lao People's Democratic Republic"},{"name":"Latvia","value":"Latvia"},{"name":"Lebanon","value":"Lebanon"},{"name":"Lesotho","value":"Lesotho"},{"name":"Liberia","value":"Liberia"},{"name":"Libyan Arab Jamahiriya","value":"Libyan Arab Jamahiriya"},{"name":"Liechtenstein","value":"Liechtenstein"},{"name":"Lithuania","value":"Lithuania"},{"name":"Luxembourg","value":"Luxembourg"},{"name":"Macau","value":"Macau"},{"name":"Macedonia, The Former Yugoslav Republic Of","value":"Macedonia, The Former Yugoslav Republic Of"},{"name":"Madagascar","value":"Madagascar"},{"name":"Malawi","value":"Malawi"},{"name":"Malaysia","value":"Malaysia"},{"name":"Maldives","value":"Maldives"},{"name":"Mali","value":"Mali"},{"name":"Malta","value":"Malta"},{"name":"Marshall Islands","value":"Marshall Islands"},{"name":"Martinique","value":"Martinique"},{"name":"Mauritania","value":"Mauritania"},{"name":"Mauritius","value":"Mauritius"},{"name":"Mayotte","value":"Mayotte"},{"name":"Mexico","value":"Mexico"},{"name":"Micronesia, Federated States Of","value":"Micronesia, Federated States Of"},{"name":"Moldova, Republic Of","value":"Moldova, Republic Of"},{"name":"Monaco","value":"Monaco"},{"name":"Mongolia","value":"Mongolia"},{"name":"Montenegro","value":"Montenegro"},{"name":"Montserrat","value":"Montserrat"},{"name":"Morocco","value":"Morocco"},{"name":"Mozambique","value":"Mozambique"},{"name":"Myanmar","value":"Myanmar"},{"name":"Namibia","value":"Namibia"},{"name":"Nauru","value":"Nauru"},{"name":"Nepal","value":"Nepal"},{"name":"Netherlands","value":"Netherlands"},{"name":"Netherlands Antilles","value":"Netherlands Antilles"},{"name":"New Caledonia","value":"New Caledonia"},{"name":"New Zealand","value":"New Zealand"},{"name":"Nicaragua","value":"Nicaragua"},{"name":"Niger","value":"Niger"},{"name":"Nigeria","value":"Nigeria"},{"name":"Niue","value":"Niue"},{"name":"Norfolk Island","value":"Norfolk Island"},{"name":"Northern Mariana Islands","value":"Northern Mariana Islands"},{"name":"Norway","value":"Norway"},{"name":"Oman","value":"Oman"},{"name":"Pakistan","value":"Pakistan"},{"name":"Palau","value":"Palau"},{"name":"Palestinian Territory, Occupied","value":"Palestinian Territory, Occupied"},{"name":"Panama","value":"Panama"},{"name":"Papua New Guinea","value":"Papua New Guinea"},{"name":"Paraguay","value":"Paraguay"},{"name":"Peru","value":"Peru"},{"name":"Philippines","value":"Philippines"},{"name":"Pitcairn","value":"Pitcairn"},{"name":"Poland","value":"Poland"},{"name":"Portugal","value":"Portugal"},{"name":"Puerto Rico","value":"Puerto Rico"},{"name":"Qatar","value":"Qatar"},{"name":"Reunion","value":"Reunion"},{"name":"Romania","value":"Romania"},{"name":"Russian Federation","value":"Russian Federation"},{"name":"Rwanda","value":"Rwanda"},{"name":"Saint Helena","value":"Saint Helena"},{"name":"Saint Kitts And Nevis","value":"Saint Kitts And Nevis"},{"name":"Saint Lucia","value":"Saint Lucia"},{"name":"Saint Pierre And Miquelon","value":"Saint Pierre And Miquelon"},{"name":"Saint Vincent And The Grenadines","value":"Saint Vincent And The Grenadines"},{"name":"Samoa","value":"Samoa"},{"name":"San Marino","value":"San Marino"},{"name":"Sao Tome And Principe","value":"Sao Tome And Principe"},{"name":"Saudi Arabia","value":"Saudi Arabia"},{"name":"Senegal","value":"Senegal"},{"name":"Serbia","value":"Serbia"},{"name":"Seychelles","value":"Seychelles"},{"name":"Sierra Leone","value":"Sierra Leone"},{"name":"Singapore","value":"Singapore"},{"name":"Slovakia","value":"Slovakia"},{"name":"Slovenia","value":"Slovenia"},{"name":"Solomon Islands","value":"Solomon Islands"},{"name":"Somalia","value":"Somalia"},{"name":"South Africa","value":"South Africa"},{"name":"South Georgia And The South Sandwich Islands","value":"South Georgia And The South Sandwich Islands"},{"name":"Spain","value":"Spain"},{"name":"Sri Lanka","value":"Sri Lanka"},{"name":"Sudan","value":"Sudan"},{"name":"Suriname","value":"Suriname"},{"name":"Svalbard And Jan Mayen","value":"Svalbard And Jan Mayen"},{"name":"Swaziland","value":"Swaziland"},{"name":"Sweden","value":"Sweden"},{"name":"Switzerland","value":"Switzerland"},{"name":"Syrian Arab Republic","value":"Syrian Arab Republic"},{"name":"Taiwan, Province Of China","value":"Taiwan, Province Of China"},{"name":"Tajikistan","value":"Tajikistan"},{"name":"Tanzania, United Republic Of","value":"Tanzania, United Republic Of"},{"name":"Thailand","value":"Thailand"},{"name":"Togo","value":"Togo"},{"name":"Tokelau","value":"Tokelau"},{"name":"Tonga","value":"Tonga"},{"name":"Trinidad And Tobago","value":"Trinidad And Tobago"},{"name":"Tunisia","value":"Tunisia"},{"name":"Turkey","value":"Turkey"},{"name":"Turkmenistan","value":"Turkmenistan"},{"name":"Turks And Caicos Islands","value":"Turks And Caicos Islands"},{"name":"Tuvalu","value":"Tuvalu"},{"name":"Uganda","value":"Uganda"},{"name":"Ukraine","value":"Ukraine"},{"name":"United Arab Emirates","value":"United Arab Emirates"},{"name":"United Kingdom","value":"United Kingdom"},{"name":"United States","value":"United States"},{"name":"United States Minor Outlying Islands","value":"United States Minor Outlying Islands"},{"name":"Uruguay","value":"Uruguay"},{"name":"Uzbekistan","value":"Uzbekistan"},{"name":"Vanuatu","value":"Vanuatu"},{"name":"Venezuela","value":"Venezuela"},{"name":"Viet Nam","value":"Viet Nam"},{"name":"Virgin Islands, British","value":"Virgin Islands, British"},{"name":"Virgin Islands, U.s.","value":"Virgin Islands, U.s."},{"name":"Wallis And Futuna","value":"Wallis And Futuna"},{"name":"Western Sahara","value":"Western Sahara"},{"name":"Yemen","value":"Yemen"},{"name":"Zambia","value":"Zambia"},{"name":"Zimbabwe","value":"Zimbabwe"}]}]},{"k":"getCompanyByPhone","d":"Get Company By Phone","ed":"Get company data by phone number","g":"company","p":[{"n":"phone","r":true,"t":"string","p":"34933197570"}]},{"k":"getCompanyByProfile","d":"Get Company By Social Profile","ed":"Get company data by social network uri (LinkedIn, Twitter, ...)","g":"company","p":[{"n":"url","r":true,"t":"string","p":"https://twitter.com/Cloudflare"}]},{"k":"getPersonByProfile","d":"Get Person By Social Profile","ed":"Get personal data by social network profile","g":"personal","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getRoleClassified","d":"Get Classified Role","ed":"Identify and classify a prospect role detecting the right area and seniority to filter later","g":"company","p":[{"n":"role","r":true,"t":"string","p":"Project Manager"}]},{"k":"checkCompanyDebtorByTaxid","d":"Check Company Is Debtor By TaxId (ES)","ed":"Check if company is debtor by TaxId","g":"company","p":[{"n":"taxid","r":true,"t":"string","p":"B04363115"}]},{"k":"getPersonDecisionMaker","d":"Get Decision Maker","ed":"Get professional data of a decision maker by company name/domain and area","g":"company","p":[{"n":"company","r":true,"t":"string","p":"uproc.io"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]}]},{"k":"getPersonDecisionMakerBySearch","d":"Get Decision Maker By Search Engine","ed":"Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)","g":"company","p":[{"n":"company","r":true,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Ecommerce","value":"Ecommerce"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"clevel","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"location","r":false,"t":"string","p":""},{"n":"keyword","r":false,"t":"string","p":""}]},{"k":"getCompanyDomainByName","d":"Get Domain By Company Name","ed":"Get company domain by company name","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPersonEmailsByDomainAndArea","d":"Get Decision Maker's Emails By Domain And Area","ed":"Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"oracle.com"},{"n":"area","r":true,"t":"options","p":"Marketing","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]}]},{"k":"getCompanyExtendedByDomain","d":"Get Company (Extended) By Domain","ed":"Get company contact, social and technology data by domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getCompanyExtendedByEmail","d":"Get Company (Extended) By Email","ed":"Get company contact, social and technology data by email","g":"company","p":[{"n":"email","r":true,"t":"string","p":"hello@killia.com"}]},{"k":"getPersonExtendedByProfile","d":"Get Person (Extended) By Profile","ed":"Get personal and social data by social profile","g":"personal","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getProfileFacebookByCompany","d":"Get Facebook URI By Company","ed":"Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getCompanyFinancialByDomain","d":"Get Sales Data By Company's Domain","ed":"Get company sales data by company's domain name.

Next countries are supported: Spain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getCompanyFinancialByDuns","d":"Get Sales Data By Company's DUNS","ed":"Get company sales data by company's DUNS number.

Next countries are supported: Spain","g":"company","p":[{"n":"duns","r":true,"t":"string","p":"461809423"}]},{"k":"getCompanyFinancialByName","d":"Get Sales Data By Company's Name","ed":"Get company sales data by company's name.

Next countries are supported: Spain","g":"company","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."}]},{"k":"getCompanyFinancialByTaxid","d":"Get Sales Data By Company's Taxid","ed":"Get company sales data by company's taxid (CIF).

Next countries are supported: Spain","g":"company","p":[{"n":"taxid","r":true,"t":"string","p":"B62084959"}]},{"k":"getCompanyGeocodedByIp","d":"Get Geocoded Company By IP","ed":"Get geocoded company data by IP address","g":"company","p":[{"n":"ip","r":true,"t":"string","p":"74.125.228.72"}]},{"k":"sendLinkedinInvitation","d":"Send Connection Request To Linkedin Profile","ed":"Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network! Thanks"}]},{"k":"sendLinkedinInvitationOrMessage","d":"Send Invitation Or Message To Linkedin Profile","ed":"Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message1","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network? Thanks"},{"n":"message2","r":true,"t":"string","p":"Hi {{first}}, thank you for accepting my invitation!"}]},{"k":"getProfileLinkedinByCompany","d":"Get LinkedIn URI By Company","ed":"Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPersonListByParams","d":"Get Employees By Parameters","ed":"Get employees by company name or domain, area, seniority and country","g":"company","p":[{"n":"country","r":true,"t":"options","p":"Spain","o":[{"name":"Afghanistan","value":"Afghanistan"},{"name":"Albania","value":"Albania"},{"name":"Algeria","value":"Algeria"},{"name":"American Samoa","value":"American Samoa"},{"name":"Andorra","value":"Andorra"},{"name":"Angola","value":"Angola"},{"name":"Anguilla","value":"Anguilla"},{"name":"Antarctica","value":"Antarctica"},{"name":"Antigua And Barbuda","value":"Antigua And Barbuda"},{"name":"Argentina","value":"Argentina"},{"name":"Armenia","value":"Armenia"},{"name":"Aruba","value":"Aruba"},{"name":"Australia","value":"Australia"},{"name":"Austria","value":"Austria"},{"name":"Azerbaijan","value":"Azerbaijan"},{"name":"Bahamas","value":"Bahamas"},{"name":"Bahrain","value":"Bahrain"},{"name":"Bangladesh","value":"Bangladesh"},{"name":"Barbados","value":"Barbados"},{"name":"Belarus","value":"Belarus"},{"name":"Belgium","value":"Belgium"},{"name":"Belize","value":"Belize"},{"name":"Benin","value":"Benin"},{"name":"Bermuda","value":"Bermuda"},{"name":"Bhutan","value":"Bhutan"},{"name":"Bolivia","value":"Bolivia"},{"name":"Bosnia And Herzegovina","value":"Bosnia And Herzegovina"},{"name":"Botswana","value":"Botswana"},{"name":"Bouvet Island","value":"Bouvet Island"},{"name":"Brazil","value":"Brazil"},{"name":"British Indian Ocean Territory","value":"British Indian Ocean Territory"},{"name":"Brunei Darussalam","value":"Brunei Darussalam"},{"name":"Bulgaria","value":"Bulgaria"},{"name":"Burkina Faso","value":"Burkina Faso"},{"name":"Burundi","value":"Burundi"},{"name":"Cambodia","value":"Cambodia"},{"name":"Cameroon","value":"Cameroon"},{"name":"Canada","value":"Canada"},{"name":"Cape Verde","value":"Cape Verde"},{"name":"Cayman Islands","value":"Cayman Islands"},{"name":"Central African Republic","value":"Central African Republic"},{"name":"Chad","value":"Chad"},{"name":"Chile","value":"Chile"},{"name":"China","value":"China"},{"name":"Christmas Island","value":"Christmas Island"},{"name":"Cocos (keeling) Islands","value":"Cocos (keeling) Islands"},{"name":"Colombia","value":"Colombia"},{"name":"Comoros","value":"Comoros"},{"name":"Congo","value":"Congo"},{"name":"Congo, The Democratic Republic Of The","value":"Congo, The Democratic Republic Of The"},{"name":"Cook Islands","value":"Cook Islands"},{"name":"Costa Rica","value":"Costa Rica"},{"name":"Cote D'ivoire","value":"Cote D'ivoire"},{"name":"Croatia","value":"Croatia"},{"name":"Cuba","value":"Cuba"},{"name":"Cyprus","value":"Cyprus"},{"name":"Czech Republic","value":"Czech Republic"},{"name":"Denmark","value":"Denmark"},{"name":"Djibouti","value":"Djibouti"},{"name":"Dominica","value":"Dominica"},{"name":"Dominican Republic","value":"Dominican Republic"},{"name":"East Timor","value":"East Timor"},{"name":"Ecuador","value":"Ecuador"},{"name":"Egypt","value":"Egypt"},{"name":"El Salvador","value":"El Salvador"},{"name":"Equatorial Guinea","value":"Equatorial Guinea"},{"name":"Eritrea","value":"Eritrea"},{"name":"Estonia","value":"Estonia"},{"name":"Ethiopia","value":"Ethiopia"},{"name":"Falkland Islands (malvinas)","value":"Falkland Islands (malvinas)"},{"name":"Faroe Islands","value":"Faroe Islands"},{"name":"Fiji","value":"Fiji"},{"name":"Finland","value":"Finland"},{"name":"France","value":"France"},{"name":"French Guiana","value":"French Guiana"},{"name":"French Polynesia","value":"French Polynesia"},{"name":"French Southern Territories","value":"French Southern Territories"},{"name":"Gabon","value":"Gabon"},{"name":"Gambia","value":"Gambia"},{"name":"Georgia","value":"Georgia"},{"name":"Germany","value":"Germany"},{"name":"Ghana","value":"Ghana"},{"name":"Gibraltar","value":"Gibraltar"},{"name":"Greece","value":"Greece"},{"name":"Greenland","value":"Greenland"},{"name":"Grenada","value":"Grenada"},{"name":"Guadeloupe","value":"Guadeloupe"},{"name":"Guam","value":"Guam"},{"name":"Guatemala","value":"Guatemala"},{"name":"Guinea","value":"Guinea"},{"name":"Guinea-bissau","value":"Guinea-bissau"},{"name":"Guyana","value":"Guyana"},{"name":"Haiti","value":"Haiti"},{"name":"Heard Island And Mcdonald Islands","value":"Heard Island And Mcdonald Islands"},{"name":"Holy See (vatican City State)","value":"Holy See (vatican City State)"},{"name":"Honduras","value":"Honduras"},{"name":"Hong Kong","value":"Hong Kong"},{"name":"Hungary","value":"Hungary"},{"name":"Iceland","value":"Iceland"},{"name":"India","value":"India"},{"name":"Indonesia","value":"Indonesia"},{"name":"Iran, Islamic Republic Of","value":"Iran, Islamic Republic Of"},{"name":"Iraq","value":"Iraq"},{"name":"Ireland","value":"Ireland"},{"name":"Israel","value":"Israel"},{"name":"Italy","value":"Italy"},{"name":"Jamaica","value":"Jamaica"},{"name":"Japan","value":"Japan"},{"name":"Jordan","value":"Jordan"},{"name":"Kazakstan","value":"Kazakstan"},{"name":"Kenya","value":"Kenya"},{"name":"Kiribati","value":"Kiribati"},{"name":"Korea, Democratic People's Republic Of","value":"Korea, Democratic People's Republic Of"},{"name":"Korea, Republic Of","value":"Korea, Republic Of"},{"name":"Kosovo","value":"Kosovo"},{"name":"Kuwait","value":"Kuwait"},{"name":"Kyrgyzstan","value":"Kyrgyzstan"},{"name":"Lao People's Democratic Republic","value":"Lao People's Democratic Republic"},{"name":"Latvia","value":"Latvia"},{"name":"Lebanon","value":"Lebanon"},{"name":"Lesotho","value":"Lesotho"},{"name":"Liberia","value":"Liberia"},{"name":"Libyan Arab Jamahiriya","value":"Libyan Arab Jamahiriya"},{"name":"Liechtenstein","value":"Liechtenstein"},{"name":"Lithuania","value":"Lithuania"},{"name":"Luxembourg","value":"Luxembourg"},{"name":"Macau","value":"Macau"},{"name":"Macedonia, The Former Yugoslav Republic Of","value":"Macedonia, The Former Yugoslav Republic Of"},{"name":"Madagascar","value":"Madagascar"},{"name":"Malawi","value":"Malawi"},{"name":"Malaysia","value":"Malaysia"},{"name":"Maldives","value":"Maldives"},{"name":"Mali","value":"Mali"},{"name":"Malta","value":"Malta"},{"name":"Marshall Islands","value":"Marshall Islands"},{"name":"Martinique","value":"Martinique"},{"name":"Mauritania","value":"Mauritania"},{"name":"Mauritius","value":"Mauritius"},{"name":"Mayotte","value":"Mayotte"},{"name":"Mexico","value":"Mexico"},{"name":"Micronesia, Federated States Of","value":"Micronesia, Federated States Of"},{"name":"Moldova, Republic Of","value":"Moldova, Republic Of"},{"name":"Monaco","value":"Monaco"},{"name":"Mongolia","value":"Mongolia"},{"name":"Montenegro","value":"Montenegro"},{"name":"Montserrat","value":"Montserrat"},{"name":"Morocco","value":"Morocco"},{"name":"Mozambique","value":"Mozambique"},{"name":"Myanmar","value":"Myanmar"},{"name":"Namibia","value":"Namibia"},{"name":"Nauru","value":"Nauru"},{"name":"Nepal","value":"Nepal"},{"name":"Netherlands","value":"Netherlands"},{"name":"Netherlands Antilles","value":"Netherlands Antilles"},{"name":"New Caledonia","value":"New Caledonia"},{"name":"New Zealand","value":"New Zealand"},{"name":"Nicaragua","value":"Nicaragua"},{"name":"Niger","value":"Niger"},{"name":"Nigeria","value":"Nigeria"},{"name":"Niue","value":"Niue"},{"name":"Norfolk Island","value":"Norfolk Island"},{"name":"Northern Mariana Islands","value":"Northern Mariana Islands"},{"name":"Norway","value":"Norway"},{"name":"Oman","value":"Oman"},{"name":"Pakistan","value":"Pakistan"},{"name":"Palau","value":"Palau"},{"name":"Palestinian Territory, Occupied","value":"Palestinian Territory, Occupied"},{"name":"Panama","value":"Panama"},{"name":"Papua New Guinea","value":"Papua New Guinea"},{"name":"Paraguay","value":"Paraguay"},{"name":"Peru","value":"Peru"},{"name":"Philippines","value":"Philippines"},{"name":"Pitcairn","value":"Pitcairn"},{"name":"Poland","value":"Poland"},{"name":"Portugal","value":"Portugal"},{"name":"Puerto Rico","value":"Puerto Rico"},{"name":"Qatar","value":"Qatar"},{"name":"Reunion","value":"Reunion"},{"name":"Romania","value":"Romania"},{"name":"Russian Federation","value":"Russian Federation"},{"name":"Rwanda","value":"Rwanda"},{"name":"Saint Helena","value":"Saint Helena"},{"name":"Saint Kitts And Nevis","value":"Saint Kitts And Nevis"},{"name":"Saint Lucia","value":"Saint Lucia"},{"name":"Saint Pierre And Miquelon","value":"Saint Pierre And Miquelon"},{"name":"Saint Vincent And The Grenadines","value":"Saint Vincent And The Grenadines"},{"name":"Samoa","value":"Samoa"},{"name":"San Marino","value":"San Marino"},{"name":"Sao Tome And Principe","value":"Sao Tome And Principe"},{"name":"Saudi Arabia","value":"Saudi Arabia"},{"name":"Senegal","value":"Senegal"},{"name":"Serbia","value":"Serbia"},{"name":"Seychelles","value":"Seychelles"},{"name":"Sierra Leone","value":"Sierra Leone"},{"name":"Singapore","value":"Singapore"},{"name":"Slovakia","value":"Slovakia"},{"name":"Slovenia","value":"Slovenia"},{"name":"Solomon Islands","value":"Solomon Islands"},{"name":"Somalia","value":"Somalia"},{"name":"South Africa","value":"South Africa"},{"name":"South Georgia And The South Sandwich Islands","value":"South Georgia And The South Sandwich Islands"},{"name":"Spain","value":"Spain"},{"name":"Sri Lanka","value":"Sri Lanka"},{"name":"Sudan","value":"Sudan"},{"name":"Suriname","value":"Suriname"},{"name":"Svalbard And Jan Mayen","value":"Svalbard And Jan Mayen"},{"name":"Swaziland","value":"Swaziland"},{"name":"Sweden","value":"Sweden"},{"name":"Switzerland","value":"Switzerland"},{"name":"Syrian Arab Republic","value":"Syrian Arab Republic"},{"name":"Taiwan, Province Of China","value":"Taiwan, Province Of China"},{"name":"Tajikistan","value":"Tajikistan"},{"name":"Tanzania, United Republic Of","value":"Tanzania, United Republic Of"},{"name":"Thailand","value":"Thailand"},{"name":"Togo","value":"Togo"},{"name":"Tokelau","value":"Tokelau"},{"name":"Tonga","value":"Tonga"},{"name":"Trinidad And Tobago","value":"Trinidad And Tobago"},{"name":"Tunisia","value":"Tunisia"},{"name":"Turkey","value":"Turkey"},{"name":"Turkmenistan","value":"Turkmenistan"},{"name":"Turks And Caicos Islands","value":"Turks And Caicos Islands"},{"name":"Tuvalu","value":"Tuvalu"},{"name":"Uganda","value":"Uganda"},{"name":"Ukraine","value":"Ukraine"},{"name":"United Arab Emirates","value":"United Arab Emirates"},{"name":"United Kingdom","value":"United Kingdom"},{"name":"United States","value":"United States"},{"name":"United States Minor Outlying Islands","value":"United States Minor Outlying Islands"},{"name":"Uruguay","value":"Uruguay"},{"name":"Uzbekistan","value":"Uzbekistan"},{"name":"Vanuatu","value":"Vanuatu"},{"name":"Venezuela","value":"Venezuela"},{"name":"Viet Nam","value":"Viet Nam"},{"name":"Virgin Islands, British","value":"Virgin Islands, British"},{"name":"Virgin Islands, U.s.","value":"Virgin Islands, U.s."},{"name":"Wallis And Futuna","value":"Wallis And Futuna"},{"name":"Western Sahara","value":"Western Sahara"},{"name":"Yemen","value":"Yemen"},{"name":"Zambia","value":"Zambia"},{"name":"Zimbabwe","value":"Zimbabwe"}]},{"n":"company","r":false,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"seniority","r":false,"t":"options","p":"","o":[{"name":"Apprentice","value":"Apprentice"},{"name":"Director","value":"Director"},{"name":"Executive","value":"Executive"},{"name":"Intermediate","value":"Intermediate"},{"name":"Manager","value":"Manager"}]},{"n":"email","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"phone","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]}]},{"k":"sendLinkedinMessage","d":"Send Message To Linkedin Profile","ed":"Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"message","r":true,"t":"string","p":"Hi {{first}}, would you like to be part of my network? Thanks"}]},{"k":"getPersonMultipleDecisionMakerBySearch","d":"Get Decision Makers By Search Engine","ed":"Discover up to ten decision makers using search engines (Bing) by company name and area (optional)","g":"company","p":[{"n":"company","r":true,"t":"string","p":"oracle"},{"n":"area","r":false,"t":"options","p":"","o":[{"name":"Communications","value":"Communications"},{"name":"Consulting","value":"Consulting"},{"name":"Customer service","value":"Customer service"},{"name":"Ecommerce","value":"Ecommerce"},{"name":"Education","value":"Education"},{"name":"Engineering","value":"Engineering"},{"name":"Finance","value":"Finance"},{"name":"Health professional","value":"Health professional"},{"name":"Human resources","value":"Human resources"},{"name":"Information technology","value":"Information technology"},{"name":"Legal","value":"Legal"},{"name":"Marketing","value":"Marketing"},{"name":"Operations","value":"Operations"},{"name":"Owner","value":"Owner"},{"name":"President","value":"President"},{"name":"Product","value":"Product"},{"name":"Public relations","value":"Public relations"},{"name":"Real estate","value":"Real estate"},{"name":"Recruiting","value":"Recruiting"},{"name":"Research","value":"Research"},{"name":"Sales","value":"Sales"}]},{"n":"clevel","r":false,"t":"options","p":"","o":[{"name":"No","value":"No"},{"name":"Yes","value":"Yes"}]},{"n":"location","r":false,"t":"string","p":""},{"n":"keyword","r":false,"t":"string","p":""}]},{"k":"getCompanyNameByDomain","d":"Get Company's Name By Domain","ed":"Get company name by company domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getCompanyPhoneByDomain","d":"Get Phone By Company Domain","ed":"Get company phone by company domain","g":"company","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getProfileTwitterByCompany","d":"Get Twitter URI By Company","ed":"Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies","g":"company","p":[{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getDistanceByAddresses","d":"Get Distance Between Addresses","ed":"Returns straight-line distance in kilometers between two addresses","g":"geographic","p":[{"n":"address1","r":true,"t":"string","p":"Mallorca 120, 08036, Barcelona"},{"n":"address2","r":true,"t":"string","p":"Mallorca 70, 08036, Barcelona"}]},{"k":"getRouteByAddresses","d":"Get Route Between Addresses","ed":"Returns driving routing time, distance, fuel consumption and cost between two addresses","g":"geographic","p":[{"n":"address1","r":true,"t":"string","p":"Mallorca 120, 08036, Barcelona"},{"n":"address2","r":true,"t":"string","p":"Mallorca 70, 08036, Barcelona"},{"n":"fuel_consumption","r":true,"t":"string","p":"5"},{"n":"price_liter","r":true,"t":"string","p":"1.2"}]},{"k":"getDistanceByCoordinates","d":"Get Distance Between Coordinates","ed":"Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"getRouteByCoordinates","d":"Get Route Between Coordinates","ed":"Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.30"}]},{"k":"getCoordinateByIp","d":"Get Coordinates By IP","ed":"Discover latitude and longitude coordinates of an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getDistanceByIps","d":"Get Distance Between IPs","ed":"Returns straight-line distance in kilometers between two IP addresses","g":"geographic","p":[{"n":"ip1","r":true,"t":"string","p":"95.23.100.79"},{"n":"ip2","r":true,"t":"string","p":"88.190.16.36"}]},{"k":"getRouteByIps","d":"Get Route Between IPs","ed":"Returns driving routing time, distance, fuel consumption and cost between two IP addresses","g":"geographic","p":[{"n":"ip1","r":true,"t":"string","p":"95.23.100.79"},{"n":"ip2","r":true,"t":"string","p":"88.190.16.36"},{"n":"fuel_consumption","r":true,"t":"string","p":"5"},{"n":"price_liter","r":true,"t":"string","p":"1.2"}]},{"k":"getDistanceByPhones","d":"Get Distance Between Phones","ed":"Returns straight-line distance in kilometers between two landline phones, using city and province of every phone","g":"geographic","p":[{"n":"phone1","r":true,"t":"string","p":"932187670"},{"n":"phone2","r":true,"t":"string","p":"91213111111"}]},{"k":"getRouteByPhones","d":"Get Route Between Phones","ed":"Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)","g":"geographic","p":[{"n":"phone1","r":true,"t":"string","p":"932187670"},{"n":"phone2","r":true,"t":"string","p":"91213111111"}]},{"k":"getDistanceByZipcodes","d":"Get Distance Between Zipcodes","ed":"Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode","g":"geographic","p":[{"n":"zipcode1","r":true,"t":"string","p":"08012"},{"n":"zipcode2","r":true,"t":"string","p":"28080"}]},{"k":"getRouteByZipcodes","d":"Get Route Between Zipcodes","ed":"Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode","g":"geographic","p":[{"n":"zipcode1","r":true,"t":"string","p":"08012"},{"n":"zipcode2","r":true,"t":"string","p":"28080"}]},{"k":"getCoordinateCartesian","d":"Get Cartesian Coordinates","ed":"Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCoordinateDecimal","d":"Get Decimal Coordinates","ed":"Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"checkDistanceEq","d":"Check Distance Is Equal","ed":"Discover if the distance between two coordinates is equal to another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"33.44"}]},{"k":"checkDistanceGe","d":"Check Distance Is Greater Or Equal","ed":"Discover if the distance in quilometers between two coordinates is greater or equal than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"33"}]},{"k":"checkDistanceGt","d":"Check Distance Is Greater","ed":"Discover if the distance in quilometers between two coordinates is greater than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"30"}]},{"k":"checkDistanceLe","d":"Check Distance Is Lower Or Equal","ed":"Discover if the distance in quilometers between two coordinates is lower or equal than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"34"}]},{"k":"checkDistanceLt","d":"Check Distance Is Lower","ed":"Discover if the distance in quilometers between two coordinates is lower than another","g":"geographic","p":[{"n":"coordinates1","r":true,"t":"string","p":"41.2522,-12.10"},{"n":"coordinates2","r":true,"t":"string","p":"41.2522,-12.50"},{"n":"distance","r":true,"t":"string","p":"50"}]},{"k":"getCoordinateUsng","d":"Get USNG Coordinates","ed":"Get USNG coordinates by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCoordinateUtm","d":"Get UTM Coordinates","ed":"Get UTM coordinates by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.38879,2.15899"}]},{"k":"getCountryByCode","d":"Get Country By ISO Code","ed":"Get country name by its ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCountryByCurrencyCode","d":"Get Country By Currency","ed":"Get country name by currency ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCountryByIp","d":"Get Country By IP","ed":"Get country name by IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCountryByName","d":"Get Country By Name","ed":"Get country by prefix","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spa"}]},{"k":"getCountryByPhone","d":"Get Country By Phone","ed":"Get country name by phone number, with worldwide coverage","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"57122000111"}]},{"k":"getCountryCodeByName","d":"Get Country Code By Name","ed":"Get Alpha2 code by country prefix or name","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCountryListByCode","d":"Get Countries By ISO Code","ed":"Get multiple countries by ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCountryListByCurrencyCode","d":"Get Countries By Currency","ed":"Get multiple country names by currency ISO code","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCountryListByName","d":"Get Countries By Prefix","ed":"Get multiple country names by initial name","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"S"}]},{"k":"getCountryNormalized","d":"Get Normalized Country","ed":"Allow to normalize a country, removing non allowed characters","g":"geographic","p":[{"n":"country","r":true,"t":"string","p":"Spa1n"}]},{"k":"checkCountryValidIso","d":"Check Country Code Exists","ed":"Check if country ISO code exists","g":"geographic","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getCurrencyByCountry","d":"Get Currency Code By Country Name","ed":"Get ISO currency code by a country name","g":"finance","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCurrencyByCountryIsocode","d":"Get Currency Code By Country Code","ed":"Get ISO currency code by an ISO country code","g":"finance","p":[{"n":"country_code","r":true,"t":"string","p":"ES"}]},{"k":"getCurrencyByIp","d":"Get Currency By IP","ed":"Get ISO currency code by IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCurrencyByIsocode","d":"Get Currency By ISO Currency Code","ed":"Get an ISO currency code by a currency ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"getCurrencyConvertedBetweenIsocodeDate","d":"Get Conversion By Currencies And Date","ed":"Convert amount between supported currencies and an exchange date","g":"finance","p":[{"n":"amount","r":true,"t":"string","p":"10"},{"n":"isocode1","r":true,"t":"options","p":"EUR","o":[{"name":"AUD","value":"AUD"},{"name":"BGN","value":"BGN"},{"name":"BRL","value":"BRL"},{"name":"CAD","value":"CAD"},{"name":"CHF","value":"CHF"},{"name":"CNY","value":"CNY"},{"name":"CZK","value":"CZK"},{"name":"DKK","value":"DKK"},{"name":"EUR","value":"EUR"},{"name":"GBP","value":"GBP"},{"name":"HKD","value":"HKD"},{"name":"HRK","value":"HRK"},{"name":"HUF","value":"HUF"},{"name":"IDR","value":"IDR"},{"name":"ILS","value":"ILS"},{"name":"INR","value":"INR"},{"name":"ISK","value":"ISK"},{"name":"JPY","value":"JPY"},{"name":"KRW","value":"KRW"},{"name":"MXN","value":"MXN"},{"name":"MYR","value":"MYR"},{"name":"NOK","value":"NOK"},{"name":"NZD","value":"NZD"},{"name":"PHP","value":"PHP"},{"name":"PLN","value":"PLN"},{"name":"RON","value":"RON"},{"name":"RUB","value":"RUB"},{"name":"SEK","value":"SEK"},{"name":"SGD","value":"SGD"},{"name":"THB","value":"THB"},{"name":"TRY","value":"TRY"},{"name":"USD","value":"USD"},{"name":"ZAR","value":"ZAR"}]},{"n":"isocode2","r":true,"t":"options","p":"USD","o":[{"name":"AUD","value":"AUD"},{"name":"BGN","value":"BGN"},{"name":"BRL","value":"BRL"},{"name":"CAD","value":"CAD"},{"name":"CHF","value":"CHF"},{"name":"CNY","value":"CNY"},{"name":"CZK","value":"CZK"},{"name":"DKK","value":"DKK"},{"name":"EUR","value":"EUR"},{"name":"GBP","value":"GBP"},{"name":"HKD","value":"HKD"},{"name":"HRK","value":"HRK"},{"name":"HUF","value":"HUF"},{"name":"IDR","value":"IDR"},{"name":"ILS","value":"ILS"},{"name":"INR","value":"INR"},{"name":"ISK","value":"ISK"},{"name":"JPY","value":"JPY"},{"name":"KRW","value":"KRW"},{"name":"MXN","value":"MXN"},{"name":"MYR","value":"MYR"},{"name":"NOK","value":"NOK"},{"name":"NZD","value":"NZD"},{"name":"PHP","value":"PHP"},{"name":"PLN","value":"PLN"},{"name":"RON","value":"RON"},{"name":"RUB","value":"RUB"},{"name":"SEK","value":"SEK"},{"name":"SGD","value":"SGD"},{"name":"THB","value":"THB"},{"name":"TRY","value":"TRY"},{"name":"USD","value":"USD"},{"name":"ZAR","value":"ZAR"}]},{"n":"date","r":false,"t":"string","p":"2018-02-12"}]},{"k":"getCurrencyListByCountry","d":"Get Currencies By Country","ed":"Get multiple ISO currency codes by a country name","g":"finance","p":[{"n":"country","r":true,"t":"string","p":"Spain"}]},{"k":"getCurrencyListByIp","d":"Get Currencies By IP","ed":"Get all ISO currency codes by an IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getCurrencyListByIsocode","d":"Get Currencies By ISO Code","ed":"Get multiple ISO currency codes by a country ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"checkCurrencyValidIso","d":"Check ISO Currency Code Is Valid","ed":"Discover if an ISO currency code is valid","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"EUR"}]},{"k":"checkDateBetw","d":"Check Date Is Between Dates","ed":"Discover if a date (date1) is betwen two dates (date2, date3)","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":true,"t":"string","p":"1975-05-19"},{"n":"date3","r":true,"t":"string","p":"1975-05-22"}]},{"k":"getDateDifference","d":"Get Difference Between Dates","ed":"Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"2018-10-10 00:00:00"},{"n":"date2","r":true,"t":"string","p":"2018-10-11 00:00:00"},{"n":"period","r":true,"t":"options","p":"seconds","o":[{"name":"Days","value":"days"},{"name":"Hours","value":"hours"},{"name":"Minutes","value":"minutes"},{"name":"Seconds","value":"seconds"}]}]},{"k":"checkDateEq","d":"Check Dates Are Equal","ed":"Discover if two dates are equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":false,"t":"string","p":"1975-05-20"}]},{"k":"checkDateGe","d":"Check Date Is Greater Or Equal","ed":"Discover if a date is greater or equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-22"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"checkDateGt","d":"Check Date Is Greater","ed":"Discover if a date is greater","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-22"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"checkDateLe","d":"Check Date Is Lower Or Equal","ed":"Discover if a date is lower or equal","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-19"},{"n":"date2","r":false,"t":"string","p":"1975-05-20"}]},{"k":"checkDateLeap","d":"Check Date Is Leap Year","ed":"Discover if a date belongs to a leap year","g":"personal","p":[{"n":"date","r":false,"t":"string","p":"2008-05-20"}]},{"k":"checkDateLt","d":"Check Date Is Lower","ed":"Discover if a date is lower","g":"personal","p":[{"n":"date1","r":true,"t":"string","p":"1975-05-20"},{"n":"date2","r":false,"t":"string","p":"1975-05-21"}]},{"k":"getDateNormalized","d":"Get Normalized Date","ed":"Allow to normalize a date, removing non allowed characters","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"20 /01/2018"}]},{"k":"getDateParsed","d":"Get Parsed Datetime","ed":"Parse datetime, without format dependency, into multiple fields","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"20/01/2018"}]},{"k":"checkDateValid","d":"Check Date Is Valid","ed":"Discover if a date has a valid format","g":"personal","p":[{"n":"date","r":true,"t":"string","p":"1975-05-20"}]},{"k":"getDeviceByUa","d":"Get Device By User Agent","ed":"Discover device features by user agent","g":"internet","p":[{"n":"useragent","r":true,"t":"string","p":"AppleTV5,3/9.1.1"}]},{"k":"getDomainBlacklists","d":"Get Domain Blacklists","ed":"Get all blacklists where a domain appears","g":"security","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getUrlByDomain","d":"Get Default URL By Domain","ed":"Get valid, existing and default URL when accessing a domain using a web browser.","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"getDomainByIp","d":"Get Domain By IP","ed":"Get the domain name related with the IP address","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"212.85.34.20"}]},{"k":"getDomainByUrl","d":"Get Root Domain By Web Address","ed":"Get root domain of any web address, removing non needed characters.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io"}]},{"k":"checkDomainCatchall","d":"Check Email Domain Is Catchall","ed":"Check if domain accepts all emails, existing or not","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"abinitio.es"}]},{"k":"checkDomainCertificate","d":"Check Domain Has Valid Certificate","ed":"Check if domain has a valid SSL certificate","g":"internet","p":[{"n":"domain","r":false,"t":"string","p":"uproc.io"}]},{"k":"getDomainCertificate","d":"Get Certificate By Domain","ed":"Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"checkDomainDisposable","d":"Check Email Domain Is Temporary","ed":"Check if domain is temporary or not","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cowstore.org"}]},{"k":"checkDomainExist","d":"Check Domain Exists","ed":"Check if domain exists","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"mydomain.com"}]},{"k":"checkDomainFormat","d":"Check Domain Has Valid Format","ed":"Check if domain has a valid format","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"checkDomainFree","d":"Check Email Domain Is Free","ed":"Check if domain is a free service domain provider","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainIsp","d":"Get ISP By Domain","ed":"Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainLogo","d":"Get Logo By Domain","ed":"Discover logo (favicon) used in domain","g":"image","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"checkDomainMx","d":"Check Domain Has MX Record","ed":"Check if domain has a MX record","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"getUrlPdf","d":"Get Pdf By URL","ed":"Generate a PDF file by URL provided using Chrome browser","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"}]},{"k":"checkDomainRecord","d":"Check Domain Has DNS Record","ed":"Check if domain has a record of that type","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"mydomain.com"},{"n":"type","r":false,"t":"options","p":"A","o":[{"name":"A","value":"A"},{"name":"AAAA","value":"AAAA"},{"name":"CNAME","value":"CNAME"},{"name":"MX","value":"MX"},{"name":"NS","value":"NS"},{"name":"TXT","value":"TXT"}]}]},{"k":"getDomainRecord","d":"Get Domain Record By DNS Type","ed":"Get the domain record by its type","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"},{"n":"type","r":false,"t":"options","p":"A","o":[{"name":"A","value":"A"},{"name":"AAAA","value":"AAAA"},{"name":"CNAME","value":"CNAME"},{"name":"MX","value":"MX"},{"name":"NS","value":"NS"},{"name":"TXT","value":"TXT"}]}]},{"k":"getDomainRecords","d":"Get Domain DNS Records","ed":"Get all domain dns records","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"google.es"}]},{"k":"checkDomainReverse","d":"Check Domain Has IP","ed":"Check if domain has assigned the IP address defined","g":"internet","p":[{"n":"domain","r":false,"t":"string","p":"mail.nova.es"},{"n":"ip","r":true,"t":"string","p":"212.85.34.20"}]},{"k":"getDomainReverseIp","d":"Get IP By Domain","ed":"Get the IPv4 address linked with a domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"www.gmail.com"}]},{"k":"getUrlScreenshot","d":"Get Screenshot By URL","ed":"Generate a screenshot by URL provided using Chrome browser","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"},{"n":"width","r":false,"t":"options","p":"640","o":[{"name":"1024","value":"1024"},{"name":"160","value":"160"},{"name":"320","value":"320"},{"name":"640","value":"640"},{"name":"800","value":"800"}]},{"n":"fullpage","r":false,"t":"options","p":"no","o":[{"name":"No","value":"no"},{"name":"Yes","value":"yes"}]},{"n":"useragent","r":false,"t":"string","p":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36"},{"n":"selector","r":false,"t":"string","p":"h1.mt-4"}]},{"k":"getUrlShareableLinks","d":"Get Shareable Links","ed":"Generates shareable URIs to use on social networks and email using a content URI and a text.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io/"},{"n":"text","r":true,"t":"string","p":"This is an amazing title for my content"}]},{"k":"getDomainTechnologies","d":"Get Technologies By Domain","ed":"Discover client and server technologies used in domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"getUrlTechnologies","d":"Get Technologies By URL","ed":"Discover client and server technologies used in web page","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.uproc.io/"}]},{"k":"getDomainVisits","d":"Get Visits By Domain","ed":"Get Website visits and rank of any domain","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"gmail.com"}]},{"k":"getDomainWhois","d":"Get Whois By Domain","ed":"Get the domain whois data by fields","g":"internet","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"}]},{"k":"getIpWhois","d":"Get Whois By IP Address","ed":"Get whois data fields by IP address provided.","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"140.82.118.4"}]},{"k":"sendEmailCustom","d":"Send Custom Email","ed":"Send a custom email (HTML supported) to a recipient","g":"communication","p":[{"n":"email_from","r":true,"t":"string","p":"mcolomer@killia.com"},{"n":"email_to","r":true,"t":"string","p":"mcolomer@gmail.com"},{"n":"subject","r":true,"t":"string","p":"Welcome email"},{"n":"body","r":true,"t":"string","p":"Hi!

Welcome to uProc and start improving your business processes!"}]},{"k":"checkEmailDisposable","d":"Check Email Is Disposable Domain","ed":"Check if email domain belongs to a disposable email service","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"info@jetable.com"}]},{"k":"getEmailDomain","d":"Get Domain By Email","ed":"Get domain part from an email","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailExists","d":"Check Email Exists (Simple)","ed":"Discover if the email recipient exists, returning email status","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailExistsExtended","d":"Check Email Exists (Extended)","ed":"Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getEmailFirstReferences","d":"Get First Web References Of An Email","ed":"Get three first web references of an email published on Internet","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@killia.com"}]},{"k":"getEmailFix","d":"Get Fixed Domain Email","ed":"Fix the email domain of those misspelled emails (supports all domains)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@gmil.com"}]},{"k":"checkEmailFormat","d":"Check Email Has Valid Format","ed":"Check if email has a valid format","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@test.com"}]},{"k":"checkEmailFree","d":"Check Email Is Free","ed":"Check if email belongs to free service provider, like gmail, hotmail, ...","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"info@gmail.com"}]},{"k":"getEmailGdprListByDomain","d":"Get GDPR Emails By Domain","ed":"Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"}]},{"k":"getEmailListByDomain","d":"Get Emails By Domain","ed":"Get emails list found on internet by domain or URI (similar to hunter.io)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uproc.io"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailListByEmail","d":"Get Emails By Email","ed":"Get emails list found on internet by non-free email (similar to hunter.io)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailListInSite","d":"Get Emails In Website","ed":"Get emails list found inside website by domain or URI (similar to hunter.io)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"uoc.edu"},{"n":"page","r":false,"t":"number","p":"1"}]},{"k":"getEmailNormalized","d":"Get Normalized Email","ed":"Normalize email address, removing non allowed characters","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test @gmail.com"}]},{"k":"getEmailRecipient","d":"Get Email By Name, Surname And Domain","ed":"Discover an email by company website or domain and prospect's firstname and lastname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":false,"t":"string","p":"Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByCompanyAndFullname","d":"Get Email By Fullname And Company","ed":"Discover an email by company's name and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"company","r":true,"t":"string","p":"uproc"},{"n":"fullname","r":true,"t":"string","p":"Miquel Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByDomainAndFullname","d":"Get Email By Fullname And Domain","ed":"Discover an email by company website or domain and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"fullname","r":true,"t":"string","p":"Miquel Colomer"},{"n":"mode","r":true,"t":"options","p":"guess","o":[{"name":"Guess","value":"guess"},{"name":"Verify","value":"verify"}]}]},{"k":"getEmailRecipientByProfile","d":"Get Email By Social Network Profile","ed":"Discover an email by contact's LinkedIn profile URI","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getEmailRecipientGdpr","d":"Get Public Email By Name, Surname And Domain (GDPR)","ed":"Discover an email by company website or domain and prospect's firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"killia.com"},{"n":"firstname","r":true,"t":"string","p":"hello"},{"n":"lastname","r":false,"t":"string","p":""}]},{"k":"getEmailReferences","d":"Get Web References Of An Email","ed":"Get web references of an email published on Internet","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@killia.com"}]},{"k":"checkEmailRole","d":"Check Email Is Role Based","ed":"Check if email belongs to a system or role based account","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"test@gmail.com"}]},{"k":"sendMobileSms","d":"Send Custom Sms","ed":"Send a custom sms to a recipient with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"},{"n":"text","r":true,"t":"string","p":"Thanks for your participation!"}]},{"k":"checkEmailSmtp","d":"Check Email Has SMTP Server","ed":"Check if email domain has an SMTP server to receive emails","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkEmailSpamtrap","d":"Check Email Is Spam Trap","ed":"Check if email is a spam trap","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"zzzwuzhdgvrxy@yahoo.co.jp"}]},{"k":"getEmailType","d":"Get Email Type","ed":"Get email type","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getFileCopiedBetweenUrls","d":"Get File Copied Between URLs","ed":"Copy file from one URL to another URL","g":"internet","p":[{"n":"source","r":true,"t":"string","p":"http://www.pdf995.com/samples/pdf.pdf"},{"n":"destination","r":true,"t":"string","p":"s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf"}]},{"k":"getFullnameParsed","d":"Get Parsed Fullname","ed":"Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender","g":"personal","p":[{"n":"fullname","r":true,"t":"string","p":"Colomer Salas Miquel"}]},{"k":"getGenderByEmail","d":"Get Gender By Email","ed":"Discover the gender of a person by the email, if person name is included in email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel.colomer@gmail.com"}]},{"k":"getGenderByPersonalName","d":"Get Gender By Name","ed":"Discover the gender of a person or company by name","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Marc"}]},{"k":"checkGenderValid","d":"Check Gender Is Valid","ed":"Discover if a gender value is valid (multilanguage)","g":"personal","p":[{"n":"gender","r":true,"t":"string","p":"male"}]},{"k":"getImageExif","d":"Get EXIF Metadata From Image","ed":"It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg"}]},{"k":"getImageWithText","d":"Get Image With Text","ed":"Generate a new image by URL and text","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg"},{"n":"text","r":true,"t":"string","p":"Hi Miquel!"},{"n":"size","r":false,"t":"string","p":"80"}]},{"k":"getQrDecoded","d":"Get Decoded QR Code","ed":"Get QR Code decoded content by an image URL","g":"image","p":[{"n":"url","r":true,"t":"string","p":"https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png"}]},{"k":"getQrEncoded","d":"Get Encoded QR Code","ed":"Get QR Code encoded by a text","g":"image","p":[{"n":"text","r":true,"t":"string","p":"Sample text to encode"}]},{"k":"getIpBlacklists","d":"Get Ip Blacklists","ed":"Get all blacklists where an IP address appears","g":"security","p":[{"n":"ip","r":true,"t":"string","p":"172.217.168.165"}]},{"k":"getLinkedinConnections","d":"Get LinkedIn Last Received Connections","ed":"Extract last 80 connections from your LinkedIn profile","g":"communication","p":[{"n":"list","r":false,"t":"string","p":"last-connections"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]}]},{"k":"getLinkedinGroupMembers","d":"Get LinkedIn Group Members","ed":"Get members in a LinkedIn group","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/groups/59923/members/"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinInvitations","d":"Get LinkedIn Last Sent Invitations","ed":"Extract last 80 invitations sent from your LinkedIn","g":"communication","p":[{"n":"list","r":false,"t":"string","p":"last-invitations"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]}]},{"k":"getLinkedinPostComments","d":"Get LinkedIn Post Comments","ed":"Get users who comment a post on LinkedIn","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinPostLikes","d":"Get LinkedIn Post Likes","ed":"Get users who like a post on LinkedIn","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getLinkedinProfile","d":"Get LinkedIn Profile","ed":"Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"},{"n":"list","r":false,"t":"string","p":"my-list"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"},{"name":"Slow","value":"slow"}]}]},{"k":"checkLinkedinProfileIsContact","d":"Check LinkedIn Profile Is Contact","ed":"Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact","g":"communication","p":[{"n":"profile","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas"}]},{"k":"getLinkedinProfiles","d":"Get LinkedIn Profiles","ed":"Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona"},{"n":"list","r":false,"t":"string","p":"my-list"},{"n":"mode","r":false,"t":"options","p":"fast","o":[{"name":"Fast","value":"fast"},{"name":"Normal","value":"normal"}]},{"n":"amount","r":false,"t":"string","p":"10"}]},{"k":"getLinkedinProfilesByCompany","d":"Get LinkedIn Company Employees","ed":"Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/company/ibm/"},{"n":"list","r":false,"t":"string","p":"employees"}]},{"k":"getLinkedinProfilesByContent","d":"Get LinkedIn Profiles By Content","ed":"Extract fastly last profiles that have published content on LinkedIn by specific keywords","g":"communication","p":[{"n":"keywords","r":false,"t":"string","p":"Growth"},{"n":"list","r":false,"t":"string","p":"content"}]},{"k":"sendLinkedinVisit","d":"Send LinkedIn Profile Visit","ed":"Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.linkedin.com/in/miquelcolomersalas/"}]},{"k":"checkListContains","d":"Check List Contains","ed":"Check if the list contains a specific item","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"2"}]},{"k":"checkListEnds","d":"Check List Ends With","ed":"Check if the list ends with a specific element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"3"}]},{"k":"checkListLengthBetw","d":"Check Length List Between","ed":"Check if the length of a list is between two quantities","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length1","r":true,"t":"number","p":"3"},{"n":"length2","r":true,"t":"number","p":"4"}]},{"k":"checkListLengthEq","d":"Check Length List Equal","ed":"Checks if the length of a list equals a specified quantity","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthGe","d":"Check Length List Greater Or Equal","ed":"Check if the length of a list is greater than or equal to a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthGt","d":"Check Length List Greater","ed":"Check if the length of a list is greater than a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"2"}]},{"k":"checkListLengthLe","d":"Check Length List Lower Or Equal","ed":"Check if the length of a list is less than or equal to a certain amount","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkListLengthLt","d":"Check Length List Lower","ed":"","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkListMax","d":"Check Greater Element","ed":"Checks if the largest item in a list matches the provided item","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,4,8,3,4,5"},{"n":"number","r":true,"t":"string","p":"8"}]},{"k":"getListMax","d":"Get Greater Element","ed":"Returns the largest item in a list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListMin","d":"Check Lower Element","ed":"Checks if the smallest element in a list matches the provided element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"5,6,1,3,7"},{"n":"number","r":true,"t":"string","p":"1"}]},{"k":"getListMin","d":"Get Lower Element","ed":"Returns the smallest item in a list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"getListSort","d":"Get Sorted List","ed":"Returns an ascending sorted list","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListSorted","d":"Check List Is Sorted","ed":"Check if a list is sorted in ascending order","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3,4,5"}]},{"k":"checkListStarts","d":"Check List Starts With","ed":"Check if the list starts with a specific element","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"text","r":true,"t":"string","p":"1"}]},{"k":"checkListUnique","d":"Check Unique Es List","ed":"Check if a list consists of unique elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3,4,5"}]},{"k":"getListUnique","d":"Get Unique List","ed":"Returns a single list, with no repeating elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"4,1,2,3,4"}]},{"k":"checkListValid","d":"Check Valid List","ed":"Check if the supplied values ​​form a valid list of elements","g":"text","p":[{"n":"list","r":true,"t":"string","p":"1,2,3"},{"n":"separator","r":true,"t":"string","p":","}]},{"k":"getLocaleByIp","d":"Get Locale Data By IP","ed":"Discover locale data (currency, language) by ipv4 or ipv6 address.","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationByCoordinates","d":"Get Location By Coordinates","ed":"Discover the city name, zipcode, province or country by latitude and longitude","g":"geographic","p":[{"n":"coordinates","r":true,"t":"string","p":"41.619206,2.2920828"}]},{"k":"getLocationByIp","d":"Get Location By IP","ed":"Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getReputationByIp","d":"Get Reputation By IP","ed":"Discover reputation by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getTimeByIp","d":"Get Time Data By IP","ed":"Discover datetime data by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationByName","d":"Get Location By Name","ed":"Discover location data by name","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Cyberclick S.L."}]},{"k":"getLocationByPhone","d":"Get Location By Landline Phone (ES)","ed":"Discover the city and the province from a landline phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"848491812"}]},{"k":"getLocationByZipcode","d":"Get Location By Zipcode (ES)","ed":"Discover the city and the province from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getLocationExtendedByIp","d":"Get Extended Location By IP","ed":"Discover geographical, company, timezone and reputation data by IPv4 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationGeocodedByIp","d":"Get Geocoded Location By IP","ed":"Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getLocationListByName","d":"Get Locations By Name","ed":"Get most relevants locations by name (Google Maps typical search)","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Pintores Granollers"}]},{"k":"getLocationListByParams","d":"Get Locations By Parameters","ed":"Get most relevants locations by name, category, location and radius","g":"geographic","p":[{"n":"name","r":false,"t":"string","p":"Saba"},{"n":"category","r":false,"t":"options","p":"parking","o":[{"name":"Accounting","value":"accounting"},{"name":"Airport","value":"airport"},{"name":"Amusement_park","value":"amusement_park"},{"name":"Aquarium","value":"aquarium"},{"name":"Art_gallery","value":"art_gallery"},{"name":"Atm","value":"atm"},{"name":"Bakery","value":"bakery"},{"name":"Bank","value":"bank"},{"name":"Bar","value":"bar"},{"name":"Beauty_salon","value":"beauty_salon"},{"name":"Bicycle_store","value":"bicycle_store"},{"name":"Book_store","value":"book_store"},{"name":"Bowling_alley","value":"bowling_alley"},{"name":"Bus_station","value":"bus_station"},{"name":"Cafe","value":"cafe"},{"name":"Campground","value":"campground"},{"name":"Car_dealer","value":"car_dealer"},{"name":"Car_rental","value":"car_rental"},{"name":"Car_repair","value":"car_repair"},{"name":"Car_wash","value":"car_wash"},{"name":"Casino","value":"casino"},{"name":"Cemetery","value":"cemetery"},{"name":"Church","value":"church"},{"name":"City_hall","value":"city_hall"},{"name":"Clothing_store","value":"clothing_store"},{"name":"Convenience_store","value":"convenience_store"},{"name":"Courthouse","value":"courthouse"},{"name":"Dentist","value":"dentist"},{"name":"Department_store","value":"department_store"},{"name":"Doctor","value":"doctor"},{"name":"Electrician","value":"electrician"},{"name":"Electronics_store","value":"electronics_store"},{"name":"Embassy","value":"embassy"},{"name":"Establishment","value":"establishment"},{"name":"Finance","value":"finance"},{"name":"Fire_station","value":"fire_station"},{"name":"Florist","value":"florist"},{"name":"Food","value":"food"},{"name":"Funeral_home","value":"funeral_home"},{"name":"Furniture_store","value":"furniture_store"},{"name":"Gas_station","value":"gas_station"},{"name":"General_contractor","value":"general_contractor"},{"name":"Grocery_or_supermarket","value":"grocery_or_supermarket"},{"name":"Gym","value":"gym"},{"name":"Hair_care","value":"hair_care"},{"name":"Hardware_store","value":"hardware_store"},{"name":"Health","value":"health"},{"name":"Hindu_temple","value":"hindu_temple"},{"name":"Home_goods_store","value":"home_goods_store"},{"name":"Hospital","value":"hospital"},{"name":"Insurance_agency","value":"insurance_agency"},{"name":"Jewelry_store","value":"jewelry_store"},{"name":"Laundry","value":"laundry"},{"name":"Lawyer","value":"lawyer"},{"name":"Library","value":"library"},{"name":"Liquor_store","value":"liquor_store"},{"name":"Local_government_office","value":"local_government_office"},{"name":"Locksmith","value":"locksmith"},{"name":"Lodging","value":"lodging"},{"name":"Meal_delivery","value":"meal_delivery"},{"name":"Meal_takeaway","value":"meal_takeaway"},{"name":"Mosque","value":"mosque"},{"name":"Movie_rental","value":"movie_rental"},{"name":"Movie_theater","value":"movie_theater"},{"name":"Moving_location","value":"moving_location"},{"name":"Museum","value":"museum"},{"name":"Night_club","value":"night_club"},{"name":"Painter","value":"painter"},{"name":"Park","value":"park"},{"name":"Parking","value":"parking"},{"name":"Pet_store","value":"pet_store"},{"name":"Pharmacy","value":"pharmacy"},{"name":"Physiotherapist","value":"physiotherapist"},{"name":"Place_of_worship","value":"place_of_worship"},{"name":"Plumber","value":"plumber"},{"name":"Police","value":"police"},{"name":"Post_office","value":"post_office"},{"name":"Real_estate_agency","value":"real_estate_agency"},{"name":"Restaurant","value":"restaurant"},{"name":"Roofing_contractor","value":"roofing_contractor"},{"name":"Rv_park","value":"rv_park"},{"name":"School","value":"school"},{"name":"Shoe_store","value":"shoe_store"},{"name":"Shopping_mall","value":"shopping_mall"},{"name":"Spa","value":"spa"},{"name":"Stadium","value":"stadium"},{"name":"Storage","value":"storage"},{"name":"Store","value":"store"},{"name":"Subway_station","value":"subway_station"},{"name":"Synagogue","value":"synagogue"},{"name":"Taxi_stand","value":"taxi_stand"},{"name":"Train_station","value":"train_station"},{"name":"Transit_station","value":"transit_station"},{"name":"Travel_agency","value":"travel_agency"},{"name":"University","value":"university"},{"name":"Veterinary_care","value":"veterinary_care"},{"name":"Zoo","value":"zoo"}]},{"n":"location","r":true,"t":"string","p":"41.3851,2.1734"},{"n":"radius","r":false,"t":"string","p":"250"}]},{"k":"checkMobileAlive","d":"Check Mobile Is Alive","ed":"Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don't return if mobile is alive (like Vodafone)","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileCountryCode","d":"Get Country ISO Code By Mobile","ed":"Allow to get country code (two chars) of a mobile phone number with international format","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileCountryPrefix","d":"Get Phone Prefix By Country ISO Code","ed":"Allow to get country prefix number by country code (2 characters)","g":"communication","p":[{"n":"country","r":true,"t":"string","p":"ES"}]},{"k":"checkMobileExist","d":"Check Mobile Exists","ed":"Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with \"Mobile lookup\" tool.","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileFormat","d":"Check Mobile Has Valid Format","ed":"Discover if mobile phone number has a valid format, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34623123213"},{"n":"country","r":true,"t":"string","p":"ES"}]},{"k":"checkMobileFormatEs","d":"Check Mobile Has Valid Format (ES)","ed":"Discover if mobile phone number has a valid format (only Spain)","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"623123213"}]},{"k":"getMobileFormatted","d":"Get Formatted Mobile","ed":"Format international mobile number by country ISO code (2 letters).","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"getMobileHlrLookup","d":"Get HLR Mobile Lookup","ed":"Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileImei","d":"Check Imei Is Valid","ed":"Discover if Imei number has a valid format","g":"communication","p":[{"n":"imei","r":true,"t":"string","p":"490154203237518"}]},{"k":"getMobileLookup","d":"Get Mobile Lookup","ed":"Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileMnpLookup","d":"Get Mobile Portability Lookup","ed":"Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileNormalized","d":"Get Normalized Mobile","ed":"Allow to normalize a mobile phone, removing non allowed characters","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34 62318 2 770"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"getMobileOrPhoneLookupEs","d":"Get Mobile/Landline Lookup (Spain)","ed":"Discover if mobile or landline prefix exists on Spain.","g":"communication","p":[{"n":"number","r":true,"t":"string","p":"34605281220"}]},{"k":"getMobileOrPhoneMnpEs","d":"Get Landline/Mobile Portability Lookup (ES)","ed":"Get portability data about a landline or mobile number, only for Spain","g":"communication","p":[{"n":"number","r":true,"t":"string","p":"605281220"}]},{"k":"checkMobileSms","d":"Check Mobile Supports Sms","ed":"Discover if a mobile number can receive sms, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileValidPrefix","d":"Check Mobile Has Valid Prefix","ed":"Discover if mobile phone number has a valid prefix, with worldwide coverage","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"checkMobileValidPrefixEs","d":"Check Mobile Has Valid Prefix (ES)","ed":"Discover if spanish mobile phone number has a valid prefix","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"605281220"}]},{"k":"getNameByPrefix","d":"Get Name By Prefix (ES)","ed":"Get first personal name matching by prefix and gender from INE data source (only Spain)","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Marce"},{"n":"gender","r":false,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]}]},{"k":"checkNameExist","d":"Check Name Exists (ES)","ed":"Check if a personal name exists in INE data source (only Spain)","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Juan"}]},{"k":"getNameListByPrefix","d":"Get Names By Prefix","ed":"Get multiple personal names by prefix","g":"geographic","p":[{"n":"name","r":true,"t":"string","p":"Marce"},{"n":"gender","r":false,"t":"options","p":"male","o":[{"name":"Female","value":"female"},{"name":"Male","value":"male"}]}]},{"k":"getNameNormalized","d":"Get Normalized Name","ed":"Normalize name removing non allowed characters","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"M4rc"}]},{"k":"checkNameValid","d":"Check Name Has Valid Format","ed":"Check if name contains accepted characters","g":"personal","p":[{"n":"name","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getUrlAnalysis","d":"Get URL Analysis","ed":"Analyze URL's health status about SSL, broken links, conflictive HTTP links with SSL, and more.","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"}]},{"k":"getNetAton","d":"Get Number By IP","ed":"Convert an IP address to numeric notation","g":"internet","p":[{"n":"ip","r":true,"t":"string","p":"62.12.22.11"}]},{"k":"getNetByIp","d":"Get Network By IP","ed":"Discover network data by ipv4 or ipv6 address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"checkUrlContains","d":"Check URL Contains","ed":"Check if an URL contains string or regular expression (case insensitive)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://uproc.io"},{"n":"regex","r":true,"t":"string","p":"uProc"}]},{"k":"getUrlContents","d":"Get Contents From URL","ed":"Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf"},{"n":"selector","r":false,"t":"string","p":"emails"}]},{"k":"getUrlContentsParsed","d":"Get Parsed Contents From URL","ed":"Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.bing.com/search?q=killia+technologies"}]},{"k":"getUrlDecode","d":"Get Decoded URL","ed":"Decode URL to recover original","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https%3A%2F%2Fgoogle.es"}]},{"k":"getUrlEncode","d":"Get Encoded URL","ed":"Encode URL to avoid problems","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://google.com"}]},{"k":"checkUrlExist","d":"Check URL Exists","ed":"Check if an URL exists","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://www.google.com"}]},{"k":"getNetFixip","d":"Get Fixed IP","ed":"Fix an IP address to the right format","g":"internet","p":[{"n":"number","r":true,"t":"string","p":"212169160147"}]},{"k":"checkNetHostAlive","d":"Check Host Is Up","ed":"Discover if a computer is switched on","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"www.google.es"}]},{"k":"checkStringIp","d":"Check IP Has Valid Format","ed":"Check if IPv4 or IPv6 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"23.45.57.123"}]},{"k":"checkStringIp4","d":"Check IPv4 Has Valid Format","ed":"Check if IPv4 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"127.0.0.1"}]},{"k":"checkStringIp6","d":"Check IPv6 Has Valid Format","ed":"Check if IPv6 address has a valid format","g":"text","p":[{"n":"ip","r":true,"t":"string","p":"2a01:c50e:3544:bd00:4df0:7609:251a:f6d0"}]},{"k":"getUrlListContentsParsed","d":"Get Parsed Contents From Results URL","ed":"Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://www.bing.com/search?q=killia+technologies"}]},{"k":"getNetNtoa","d":"Get IP By Number","ed":"Convert a number to an IP address","g":"internet","p":[{"n":"number","r":true,"t":"string","p":"1501706957"}]},{"k":"getUrlParsed","d":"Get Parsed URL","ed":"Decode URL into multiple fields","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf"}]},{"k":"getNetScan","d":"Get Opened Ports In Host","ed":"Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"google.es"}]},{"k":"checkNetServiceUp","d":"Check Service Is Up","ed":"Discover if a service in a port is available","g":"internet","p":[{"n":"host","r":true,"t":"string","p":"www.google.com"},{"n":"port","r":true,"t":"string","p":"80"}]},{"k":"getUrlTables","d":"Get Table From URL","ed":"Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2"},{"n":"table","r":false,"t":"string","p":"3"}]},{"k":"checkUrlValid","d":"Check URL Is Valid","ed":"Check that an URL has a valid format","g":"internet","p":[{"n":"url","r":true,"t":"string","p":"http://www.google.com"}]},{"k":"checkNumberBetw","d":"Check Number Is Between","ed":"Check if number is between two values","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"21"},{"n":"number3","r":true,"t":"string","p":"24"}]},{"k":"checkNumberDecimal","d":"Check Decimal Number Is Valid","ed":"Check if value is a decimal number","p":[{"n":"number","r":true,"t":"string","p":"0.23"}]},{"k":"checkNumberEq","d":"Check Number Is Equal","ed":"Check if number is equal to another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberEven","d":"Check Even Number Is Valid","ed":"Check if number is even","p":[{"n":"number","r":true,"t":"string","p":"2"}]},{"k":"checkNumberGe","d":"Check Number Is Greater Or Equal","ed":"Check if number is greater or equal than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberGt","d":"Check Number Is Greater","ed":"Check if number is greater than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"22"}]},{"k":"checkNumberLe","d":"Check Number Is Lower Or Equal","ed":"Check if number is lower or equal than another","p":[{"n":"number1","r":true,"t":"string","p":"23"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberLt","d":"Check Number Is Lower","ed":"Check if number is lower than another","p":[{"n":"number1","r":true,"t":"string","p":"22"},{"n":"number2","r":true,"t":"string","p":"23"}]},{"k":"checkNumberLuhn","d":"Check Luhn Number Is Valid","ed":"Check if it a valid Luhn number","g":"security","p":[{"n":"luhn","r":true,"t":"string","p":"79927398713"}]},{"k":"checkNumberMod","d":"Check Modulus Is Equals","ed":"Check if modulus between two numbers is equal to a value","p":[{"n":"number","r":true,"t":"string","p":"10"},{"n":"mod","r":true,"t":"string","p":"2"},{"n":"rest","r":true,"t":"string","p":"0"}]},{"k":"checkNumberNatural","d":"Check Natural Number Is Valid","ed":"Check if value is a natural number","p":[{"n":"number","r":true,"t":"string","p":"0"}]},{"k":"checkStringNumeric","d":"Check Numeric String Is Valid","ed":"Check if string length contains only numbers","g":"text","p":[{"n":"text","r":true,"t":"string","p":"123"}]},{"k":"checkNumberOdd","d":"Check Odd Number Is Valid","ed":"Check if number is odd","p":[{"n":"number","r":true,"t":"string","p":"3"}]},{"k":"checkNumberPrime","d":"Check Prime Number Is Valid","ed":"Check if number is prime","p":[{"n":"number","r":true,"t":"string","p":"11"}]},{"k":"checkPasswordStrong","d":"Check Password Is Strong","ed":"Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters","g":"security","p":[{"n":"password","r":true,"t":"string","p":"1agdA*$#"}]},{"k":"getPersonByEmail","d":"Get Person By Email","ed":"Get personal data by email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getPersonByFirstnameLastnameCompanyLocation","d":"Get Person By Firstname, Lastname, Company And Location","ed":"Get personal data by firstname, lastname, company and location","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":true,"t":"string","p":"Colomer"},{"n":"company","r":false,"t":"string","p":"uProc"},{"n":"location","r":false,"t":"string","p":""}]},{"k":"getPersonByMobile","d":"Get Person By Mobile","ed":"Get personal data by mobile","g":"personal","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"sendPersonEmailToList","d":"Send Email's Contact To List","ed":"Add a contact email to a person list","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"list","r":false,"t":"string","p":"my-list"}]},{"k":"getPersonExtendedByEmail","d":"Get Person (Extended) By Email","ed":"Get prospect's contact data and company's location and social data by email","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getPersonExtendedByEmailAndCompany","d":"Get Person (Extended) By Email And Company","ed":"Get contact, location and social data by email and company name and location","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"},{"n":"company","r":false,"t":"string","p":"uProc"}]},{"k":"getPersonFakedData","d":"Get Random Person Data","ed":"Generates random fake data","g":"personal","p":[{"n":"locality","r":true,"t":"options","p":"English","o":[{"name":"Australia (English)","value":"Australia (English)"},{"name":"Australia Ocker (English)","value":"Australia Ocker (English)"},{"name":"Azerbaijani","value":"Azerbaijani"},{"name":"Bork (English)","value":"Bork (English)"},{"name":"Canada (English)","value":"Canada (English)"},{"name":"Canada (French)","value":"Canada (French)"},{"name":"Chinese","value":"Chinese"},{"name":"Chinese (Taiwan)","value":"Chinese (Taiwan)"},{"name":"Czech","value":"Czech"},{"name":"Dutch","value":"Dutch"},{"name":"English","value":"English"},{"name":"Farsi","value":"Farsi"},{"name":"French","value":"French"},{"name":"Georgian","value":"Georgian"},{"name":"German","value":"German"},{"name":"German (Austria)","value":"German (Austria)"},{"name":"German (Switzerland)","value":"German (Switzerland)"},{"name":"Great Britain (English)","value":"Great Britain (English)"},{"name":"India (English)","value":"India (English)"},{"name":"Indonesia","value":"Indonesia"},{"name":"Ireland (English)","value":"Ireland (English)"},{"name":"Italian","value":"Italian"},{"name":"Japanese","value":"Japanese"},{"name":"Korean","value":"Korean"},{"name":"Nepalese","value":"Nepalese"},{"name":"Norwegian","value":"Norwegian"},{"name":"Polish","value":"Polish"},{"name":"Portuguese (Brazil)","value":"Portuguese (Brazil)"},{"name":"Russian","value":"Russian"},{"name":"Slovakian","value":"Slovakian"},{"name":"Spanish","value":"Spanish"},{"name":"Spanish Mexico","value":"Spanish Mexico"},{"name":"Swedish","value":"Swedish"},{"name":"Turkish","value":"Turkish"},{"name":"Ukrainian","value":"Ukrainian"},{"name":"United States (English)","value":"United States (English)"},{"name":"Vietnamese","value":"Vietnamese"}]}]},{"k":"getProfileByEmployeeData","d":"Get LinkedIn URI By First, Last And Company","ed":"Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Miquel"},{"n":"lastname","r":true,"t":"string","p":"Colomer"},{"n":"company","r":true,"t":"string","p":"uProc"}]},{"k":"getSurnameByPrefix","d":"Get Surname By Prefix (ES)","ed":"Get first personal surname matching by prefix from INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Col"}]},{"k":"checkSurnameExist","d":"Check Surname Is Valid (ES)","ed":"Check if a personal surname appears in INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getProfileLinkedinByEmail","d":"Get LinkedIn URI By Email","ed":"Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"getSurnameListByPrefix","d":"Get Surnames By Prefix (ES)","ed":"Get personal surnames matching by prefix from INE data source (only Spain)","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Co"}]},{"k":"getSurnameNormalized","d":"Get Normalized Surname","ed":"Normalize surname","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"C0lomer"}]},{"k":"getProfileTwitterByEmployeeData","d":"Get Twitter URI By First, Last And Company","ed":"Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"Carlos"},{"n":"lastname","r":true,"t":"string","p":"Blanco"},{"n":"company","r":true,"t":"string","p":"Encomenda"}]},{"k":"checkSurnameValid","d":"Check Surname Has Valid Format","ed":"Check if surname contains accepted characters","g":"personal","p":[{"n":"surname","r":true,"t":"string","p":"Gonzalez"}]},{"k":"getProfileXingByEmployeeData","d":"Get Xing URI By First, Last And Company","ed":"Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies","g":"personal","p":[{"n":"firstname","r":true,"t":"string","p":"David"},{"n":"lastname","r":true,"t":"string","p":"Tomás"},{"n":"company","r":true,"t":"string","p":"Cyberclick"}]},{"k":"getPhoneFixed","d":"Get Fixed Phone","ed":"Fix the international prefix of a phone based on the ISO code of a country","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"+1605281220"},{"n":"country","r":true,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneFormat","d":"Check Valid Phone Format By Country","ed":"Allow to discover if landline number has a good international format, depending on country ","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"},{"n":"country","r":true,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneFormatEs","d":"Check Valid Phone Format (ES)","ed":"Discover if landline phone number is valid, with Spain coverage","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"932187670"}]},{"k":"getPhoneNormalized","d":"Get Cleaned Phone","ed":"Clean a phone removing non allowed characters","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"3493218 767o"},{"n":"country","r":false,"t":"options","p":"ES","o":[{"name":"AD","value":"AD"},{"name":"AE","value":"AE"},{"name":"AF","value":"AF"},{"name":"AG","value":"AG"},{"name":"AI","value":"AI"},{"name":"AL","value":"AL"},{"name":"AM","value":"AM"},{"name":"AO","value":"AO"},{"name":"AQ","value":"AQ"},{"name":"AR","value":"AR"},{"name":"AS","value":"AS"},{"name":"AT","value":"AT"},{"name":"AU","value":"AU"},{"name":"AW","value":"AW"},{"name":"AX","value":"AX"},{"name":"AZ","value":"AZ"},{"name":"BA","value":"BA"},{"name":"BB","value":"BB"},{"name":"BD","value":"BD"},{"name":"BE","value":"BE"},{"name":"BF","value":"BF"},{"name":"BG","value":"BG"},{"name":"BH","value":"BH"},{"name":"BI","value":"BI"},{"name":"BJ","value":"BJ"},{"name":"BL","value":"BL"},{"name":"BM","value":"BM"},{"name":"BN","value":"BN"},{"name":"BO","value":"BO"},{"name":"BQ","value":"BQ"},{"name":"BR","value":"BR"},{"name":"BS","value":"BS"},{"name":"BT","value":"BT"},{"name":"BV","value":"BV"},{"name":"BW","value":"BW"},{"name":"BY","value":"BY"},{"name":"BZ","value":"BZ"},{"name":"CA","value":"CA"},{"name":"CC","value":"CC"},{"name":"CD","value":"CD"},{"name":"CF","value":"CF"},{"name":"CG","value":"CG"},{"name":"CH","value":"CH"},{"name":"CI","value":"CI"},{"name":"CK","value":"CK"},{"name":"CL","value":"CL"},{"name":"CM","value":"CM"},{"name":"CN","value":"CN"},{"name":"CO","value":"CO"},{"name":"CR","value":"CR"},{"name":"CU","value":"CU"},{"name":"CV","value":"CV"},{"name":"CW","value":"CW"},{"name":"CX","value":"CX"},{"name":"CY","value":"CY"},{"name":"CZ","value":"CZ"},{"name":"DE","value":"DE"},{"name":"DJ","value":"DJ"},{"name":"DK","value":"DK"},{"name":"DM","value":"DM"},{"name":"DO","value":"DO"},{"name":"DZ","value":"DZ"},{"name":"EC","value":"EC"},{"name":"EE","value":"EE"},{"name":"EG","value":"EG"},{"name":"EH","value":"EH"},{"name":"ER","value":"ER"},{"name":"ES","value":"ES"},{"name":"ET","value":"ET"},{"name":"FI","value":"FI"},{"name":"FJ","value":"FJ"},{"name":"FK","value":"FK"},{"name":"FM","value":"FM"},{"name":"FO","value":"FO"},{"name":"FR","value":"FR"},{"name":"GA","value":"GA"},{"name":"GB","value":"GB"},{"name":"GD","value":"GD"},{"name":"GE","value":"GE"},{"name":"GF","value":"GF"},{"name":"GG","value":"GG"},{"name":"GH","value":"GH"},{"name":"GI","value":"GI"},{"name":"GL","value":"GL"},{"name":"GM","value":"GM"},{"name":"GN","value":"GN"},{"name":"GP","value":"GP"},{"name":"GQ","value":"GQ"},{"name":"GR","value":"GR"},{"name":"GS","value":"GS"},{"name":"GT","value":"GT"},{"name":"GU","value":"GU"},{"name":"GW","value":"GW"},{"name":"GY","value":"GY"},{"name":"HK","value":"HK"},{"name":"HM","value":"HM"},{"name":"HN","value":"HN"},{"name":"HR","value":"HR"},{"name":"HT","value":"HT"},{"name":"HU","value":"HU"},{"name":"ID","value":"ID"},{"name":"IE","value":"IE"},{"name":"IL","value":"IL"},{"name":"IM","value":"IM"},{"name":"IN","value":"IN"},{"name":"IO","value":"IO"},{"name":"IQ","value":"IQ"},{"name":"IR","value":"IR"},{"name":"IS","value":"IS"},{"name":"IT","value":"IT"},{"name":"JE","value":"JE"},{"name":"JM","value":"JM"},{"name":"JO","value":"JO"},{"name":"JP","value":"JP"},{"name":"KE","value":"KE"},{"name":"KG","value":"KG"},{"name":"KH","value":"KH"},{"name":"KI","value":"KI"},{"name":"KM","value":"KM"},{"name":"KN","value":"KN"},{"name":"KP","value":"KP"},{"name":"KR","value":"KR"},{"name":"KW","value":"KW"},{"name":"KY","value":"KY"},{"name":"KZ","value":"KZ"},{"name":"LA","value":"LA"},{"name":"LB","value":"LB"},{"name":"LC","value":"LC"},{"name":"LI","value":"LI"},{"name":"LK","value":"LK"},{"name":"LR","value":"LR"},{"name":"LS","value":"LS"},{"name":"LT","value":"LT"},{"name":"LU","value":"LU"},{"name":"LV","value":"LV"},{"name":"LY","value":"LY"},{"name":"MA","value":"MA"},{"name":"MC","value":"MC"},{"name":"MD","value":"MD"},{"name":"ME","value":"ME"},{"name":"MF","value":"MF"},{"name":"MG","value":"MG"},{"name":"MH","value":"MH"},{"name":"MK","value":"MK"},{"name":"ML","value":"ML"},{"name":"MM","value":"MM"},{"name":"MN","value":"MN"},{"name":"MO","value":"MO"},{"name":"MP","value":"MP"},{"name":"MQ","value":"MQ"},{"name":"MR","value":"MR"},{"name":"MS","value":"MS"},{"name":"MT","value":"MT"},{"name":"MU","value":"MU"},{"name":"MV","value":"MV"},{"name":"MW","value":"MW"},{"name":"MX","value":"MX"},{"name":"MY","value":"MY"},{"name":"MZ","value":"MZ"},{"name":"NA","value":"NA"},{"name":"NC","value":"NC"},{"name":"NE","value":"NE"},{"name":"NF","value":"NF"},{"name":"NG","value":"NG"},{"name":"NI","value":"NI"},{"name":"NL","value":"NL"},{"name":"NO","value":"NO"},{"name":"NP","value":"NP"},{"name":"NR","value":"NR"},{"name":"NU","value":"NU"},{"name":"NZ","value":"NZ"},{"name":"OM","value":"OM"},{"name":"PA","value":"PA"},{"name":"PE","value":"PE"},{"name":"PF","value":"PF"},{"name":"PG","value":"PG"},{"name":"PH","value":"PH"},{"name":"PK","value":"PK"},{"name":"PL","value":"PL"},{"name":"PM","value":"PM"},{"name":"PN","value":"PN"},{"name":"PR","value":"PR"},{"name":"PS","value":"PS"},{"name":"PT","value":"PT"},{"name":"PW","value":"PW"},{"name":"PY","value":"PY"},{"name":"QA","value":"QA"},{"name":"RE","value":"RE"},{"name":"RO","value":"RO"},{"name":"RS","value":"RS"},{"name":"RU","value":"RU"},{"name":"RW","value":"RW"},{"name":"SA","value":"SA"},{"name":"SB","value":"SB"},{"name":"SC","value":"SC"},{"name":"SD","value":"SD"},{"name":"SE","value":"SE"},{"name":"SG","value":"SG"},{"name":"SH","value":"SH"},{"name":"SI","value":"SI"},{"name":"SJ","value":"SJ"},{"name":"SK","value":"SK"},{"name":"SL","value":"SL"},{"name":"SM","value":"SM"},{"name":"SN","value":"SN"},{"name":"SO","value":"SO"},{"name":"SR","value":"SR"},{"name":"SS","value":"SS"},{"name":"ST","value":"ST"},{"name":"SV","value":"SV"},{"name":"SX","value":"SX"},{"name":"SY","value":"SY"},{"name":"SZ","value":"SZ"},{"name":"TC","value":"TC"},{"name":"TD","value":"TD"},{"name":"TF","value":"TF"},{"name":"TG","value":"TG"},{"name":"TH","value":"TH"},{"name":"TJ","value":"TJ"},{"name":"TK","value":"TK"},{"name":"TL","value":"TL"},{"name":"TM","value":"TM"},{"name":"TN","value":"TN"},{"name":"TO","value":"TO"},{"name":"TR","value":"TR"},{"name":"TT","value":"TT"},{"name":"TV","value":"TV"},{"name":"TW","value":"TW"},{"name":"TZ","value":"TZ"},{"name":"UA","value":"UA"},{"name":"UG","value":"UG"},{"name":"UM","value":"UM"},{"name":"US","value":"US"},{"name":"UY","value":"UY"},{"name":"UZ","value":"UZ"},{"name":"VA","value":"VA"},{"name":"VC","value":"VC"},{"name":"VE","value":"VE"},{"name":"VG","value":"VG"},{"name":"VI","value":"VI"},{"name":"VN","value":"VN"},{"name":"VU","value":"VU"},{"name":"WF","value":"WF"},{"name":"WS","value":"WS"},{"name":"YE","value":"YE"},{"name":"YT","value":"YT"},{"name":"ZA","value":"ZA"},{"name":"ZM","value":"ZM"},{"name":"ZW","value":"ZW"}]}]},{"k":"checkPhoneOrMobileValid","d":"Check Phone Or Mobile Valid","ed":"Discover if landline or mobile number has a valid prefix","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"},{"n":"country","r":false,"t":"string","p":"ES"}]},{"k":"getPhoneParsed","d":"Get Parsed And Validated Phone","ed":"Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked)","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"}]},{"k":"checkPhoneValidPrefix","d":"Check Valid Phone Prefix","ed":"Discover if a landline phone number prefix exists, with worldwide coverage","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"34932187670"}]},{"k":"getProvinceByIp","d":"Get Province By IP","ed":"Discover the province name from an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getProvinceByName","d":"Get Province By Name (ES)","ed":"You can get the first province by a name prefix (only Spain)","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"B"}]},{"k":"getProvinceByPhone","d":"Get Province By Phone (ES)","ed":"Discover the province name from a landline phone number (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932"}]},{"k":"getProvinceByZipcode","d":"Get Province By Zipcode (ES)","ed":"Discover the province name from a zipcode number (only Spain)","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08"}]},{"k":"getProvinceListByName","d":"Get Provinces By Name (ES)","ed":"You can get a province list by a name prefix (only Spain)","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"B"}]},{"k":"getProvinceListByPhone","d":"Get Provinces By Phone (ES)","ed":"You can get a province list by a phone prefix (only Spain)","g":"geographic","p":[{"n":"phone","r":true,"t":"string","p":"932"}]},{"k":"getProvinceListByZipcode","d":"Get Provinces By Zipcode (ES)","ed":"You can get a province list by a zipcode prefix, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"0"}]},{"k":"getProvinceNormalized","d":"Get Normalized Province","ed":"Allow to normalize a province, removing non allowed characters","g":"geographic","p":[{"n":"province","r":true,"t":"string","p":"Barce lona"}]},{"k":"checkRobinsonEmailExist","d":"Check Email Is Robinson (ES)","ed":"Discover if an email exists in the Robinson list (only Spain)","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"manzaned@uvigo.es"}]},{"k":"checkRobinsonNifExist","d":"Check Nif Number Is Robinson (ES)","ed":"Discover if an nif exists in the Robinson list (only Spain)","g":"personal","p":[{"n":"nif","r":true,"t":"string","p":"00002206K"}]},{"k":"checkRobinsonPhoneExist","d":"Check Phone Is Robinson (ES)","ed":"Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)","g":"communication","p":[{"n":"phone","r":true,"t":"string","p":"917156252"}]},{"k":"getSentimentByText","d":"Get Sentiment From A Text","ed":"It allows to analyze an english text with Emojis and detect sentiment","g":"text","p":[{"n":"text","r":true,"t":"string","p":"I am very happy"}]},{"k":"checkSocialDomainExist","d":"Check Domain Has Social Activity","ed":"Discover if a domain has social network presence","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getSocialDomainLookup","d":"Get Social Networks By Domain","ed":"Discover if a domain or a website has social activity and returns all social network profiles found","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"getSocialDomainParsed","d":"Get Social Networks Activity By Domain","ed":"Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)","g":"communication","p":[{"n":"domain","r":true,"t":"string","p":"cyberclick.es"}]},{"k":"checkSocialEmailExist","d":"Check Email Has Social Activity","ed":"Discover if the email has social network presence","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"mcolomer@gmail.com"}]},{"k":"getSocialEmailLookup","d":"Get Social Networks By Email","ed":"Discover if an email has social activity, and get all social network profiles found","g":"communication","p":[{"n":"email","r":true,"t":"string","p":"miquel@uproc.io"}]},{"k":"checkSocialMobileExist","d":"Check Mobile Has Social Activity","ed":"Discover if the mobile phone has social network presence","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getSocialMobileLookup","d":"Get Social Networks By Mobile","ed":"Discover if an mobile phone has social activity, and get all social network profiles found","g":"communication","p":[{"n":"mobile","r":true,"t":"string","p":"34605281220"}]},{"k":"getSocialUriParsed","d":"Get Social Network Activity","ed":"This tools parses a social uri address and extracts any available indicators","g":"communication","p":[{"n":"url","r":true,"t":"string","p":"https://www.facebook.com/uprocdataquality"}]},{"k":"checkStringAlpha","d":"Check Alphabetic String Is Valid","ed":"Check if string length contains only letters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"asc"}]},{"k":"checkStringAlphanumeric","d":"Check Alphanumeric String Is Valid","ed":"Check if string length contains only numbers and letters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"aa11"}]},{"k":"getStringBase64","d":"Get BASE64 Value","ed":"Convert a string to a BASE64 encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"checkStringBlank","d":"Check String Is Empty","ed":"Check if string has no content","g":"text","p":[{"n":"text","r":true,"t":"string","p":""}]},{"k":"checkStringBoolean","d":"Check Boolean String Is Valid","ed":"Check if string is true or false","g":"text","p":[{"n":"text","r":true,"t":"string","p":"true"}]},{"k":"getStringByFormat","d":"Get Formatted String By Pattern","ed":"It allows to format a string using a format pattern","g":"text","p":[{"n":"text","r":true,"t":"string","p":"1122"},{"n":"format","r":true,"t":"string","p":"%09d"}]},{"k":"getStringByRegex","d":"Get Generated Text By Pattern","ed":"Generate a random string using a regular expression as a pattern","g":"text","p":[{"n":"regex","r":true,"t":"string","p":"[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*"}]},{"k":"checkStringContains","d":"Check String Contains Char","ed":"Check if string contains a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"checkStringEnds","d":"Check String Ends With","ed":"Check if string ends with a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"getStringFieldName","d":"Get Field Type By Value","ed":"Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address","g":"text","p":[{"n":"text","r":true,"t":"string","p":"myemail@mydomain.com"}]},{"k":"getStringJoin","d":"Get Merged Values By Text","ed":"Join a character or string to join two values","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"hi"},{"n":"text2","r":true,"t":"string","p":"good morning!"},{"n":"glue","r":true,"t":"string","p":","}]},{"k":"getStringLength","d":"Get String Length","ed":"Get length of a string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"checkStringLengthBetw","d":"Check String Length Is Between","ed":"Check if string length is between two numbers","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length1","r":true,"t":"number","p":"3"},{"n":"length2","r":true,"t":"number","p":"5"}]},{"k":"checkStringLengthEq","d":"Check String Length Is Equal","ed":"Check if string length is equal to number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthGe","d":"Check String Length Is Greater Or Equal","ed":"Check if string length is greater or equal than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthGt","d":"Check String Length Is Greater","ed":"Check if string length is greater than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"3"}]},{"k":"checkStringLengthLe","d":"Check String Length Is Lower Or Equal","ed":"Check if string length is lower or equal than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"4"}]},{"k":"checkStringLengthLt","d":"Check String Length Is Lower","ed":"Check if string length is lower than number","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"length","r":true,"t":"number","p":"5"}]},{"k":"checkStringLowercase","d":"Check Text Is Lowercased","ed":"Check if string only contains lowercase characters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"aaa"}]},{"k":"getStringLowercase","d":"Get Lowercased Text","ed":"Convert all letters found in a string to lowercase","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"getStringMd5","d":"Get MD5 String","ed":"Convert a string to a MD5 encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"getStringNormalized","d":"Get Normalized String By Field","ed":"Normalize a string depending on the field name","g":"text","p":[{"n":"field","r":true,"t":"options","p":"name","o":[{"name":"Alphabetic","value":"alphabetic"},{"name":"Alphanumeric","value":"alphanumeric"},{"name":"Cif","value":"cif"},{"name":"City","value":"city"},{"name":"Country","value":"country"},{"name":"Date","value":"date"},{"name":"Decimal","value":"decimal"},{"name":"Dni","value":"dni"},{"name":"Domain","value":"domain"},{"name":"Email","value":"email"},{"name":"Gender","value":"gender"},{"name":"Integer","value":"integer"},{"name":"Ip","value":"ip"},{"name":"Mobile","value":"mobile"},{"name":"Name","value":"name"},{"name":"Nie","value":"nie"},{"name":"Nif","value":"nif"},{"name":"Phone","value":"phone"},{"name":"Province","value":"province"},{"name":"Zipcode","value":"zipcode"}]},{"n":"text","r":true,"t":"string","p":"JMª Gº.Fco.gtez. Gro."}]},{"k":"getStringParsed","d":"Get Parsed Text","ed":"Analyze string and return all emails, phones, zipcodes and links detected","g":"text","p":[{"n":"text","r":true,"t":"string","p":"My email is miquel@uproc.io and my phone is 34605281220"}]},{"k":"checkStringRandom","d":"Check String Is Random","ed":"Check if string contains random characters without sense","g":"text","p":[{"n":"text","r":true,"t":"string","p":"t2 chhsdfitoixcv"}]},{"k":"checkStringRegex","d":"Check String Is Valid By Pattern","ed":"Check if string contains a value that matches with a regular expression","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"},{"n":"regex","r":true,"t":"string","p":"^test$"}]},{"k":"getStringReplaceAll","d":"Get Texts Replaced By String","ed":"Replace all values found in a string by another","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"find","r":true,"t":"string","p":"o"},{"n":"replace","r":true,"t":"string","p":"u"}]},{"k":"getStringReplaceFirst","d":"Get Text Replaced By String","ed":"Replace first value found in a string by another","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"find","r":true,"t":"string","p":"o"},{"n":"replace","r":true,"t":"string","p":"u"}]},{"k":"getStringSha","d":"Get SHA String","ed":"Convert a string to a SHA encoded value","g":"text","p":[{"n":"text","r":true,"t":"string","p":"test"}]},{"k":"getStringSplit","d":"Get Splitted Values By Separator","ed":"Split a value in two parts, using a separator present in the original string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Texto largo, separado por coma"},{"n":"separator","r":true,"t":"string","p":","}]},{"k":"getStringSplitAndJoin","d":"Get Splitted And Merged Values By Separator","ed":"Split a value in two parts and join them, using a separator present in the original string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, good morning!"},{"n":"separator","r":true,"t":"string","p":","},{"n":"glue","r":true,"t":"string","p":";"}]},{"k":"checkStringStarts","d":"Check String Starts With","ed":"Check if string starts with a character","g":"text","p":[{"n":"text1","r":true,"t":"string","p":"test"},{"n":"text2","r":true,"t":"string","p":"t"}]},{"k":"getStringTranslated","d":"Get Translated Text","ed":"It allows to translate a text to any language","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, my name is Mike"},{"n":"language","r":true,"t":"options","p":"Spanish","o":[{"name":"Afrikaans","value":"Afrikaans"},{"name":"Albanian","value":"Albanian"},{"name":"Amharic","value":"Amharic"},{"name":"Arabic","value":"Arabic"},{"name":"Armenian","value":"Armenian"},{"name":"Azeerbaijani","value":"Azeerbaijani"},{"name":"Basque","value":"Basque"},{"name":"Belarusian","value":"Belarusian"},{"name":"Bengali","value":"Bengali"},{"name":"Bosnian","value":"Bosnian"},{"name":"Bulgarian","value":"Bulgarian"},{"name":"Catalan","value":"Catalan"},{"name":"Cebuano","value":"Cebuano"},{"name":"Chinese (Simplified)","value":"Chinese (Simplified)"},{"name":"Chinese (Traditional)","value":"Chinese (Traditional)"},{"name":"Corsican","value":"Corsican"},{"name":"Croatian","value":"Croatian"},{"name":"Czech","value":"Czech"},{"name":"Danish","value":"Danish"},{"name":"Dutch","value":"Dutch"},{"name":"English","value":"English"},{"name":"Esperanto","value":"Esperanto"},{"name":"Estonian","value":"Estonian"},{"name":"Finnish","value":"Finnish"},{"name":"French","value":"French"},{"name":"Frisian","value":"Frisian"},{"name":"Galician","value":"Galician"},{"name":"Georgian","value":"Georgian"},{"name":"German","value":"German"},{"name":"Greek","value":"Greek"},{"name":"Gujarati","value":"Gujarati"},{"name":"Haitian Creole","value":"Haitian Creole"},{"name":"Hausa","value":"Hausa"},{"name":"Hawaiian","value":"Hawaiian"},{"name":"Hebrew","value":"Hebrew"},{"name":"Hindi","value":"Hindi"},{"name":"Hmong","value":"Hmong"},{"name":"Hungarian","value":"Hungarian"},{"name":"Icelandic","value":"Icelandic"},{"name":"Igbo","value":"Igbo"},{"name":"Indonesian","value":"Indonesian"},{"name":"Irish","value":"Irish"},{"name":"Italian","value":"Italian"},{"name":"Japanese","value":"Japanese"},{"name":"Javanese","value":"Javanese"},{"name":"Kannada","value":"Kannada"},{"name":"Kazakh","value":"Kazakh"},{"name":"Khmer","value":"Khmer"},{"name":"Korean","value":"Korean"},{"name":"Kurdish","value":"Kurdish"},{"name":"Kyrgyz","value":"Kyrgyz"},{"name":"Lao","value":"Lao"},{"name":"Latin","value":"Latin"},{"name":"Latvian","value":"Latvian"},{"name":"Lithuanian","value":"Lithuanian"},{"name":"Luxembourgish","value":"Luxembourgish"},{"name":"Macedonian","value":"Macedonian"},{"name":"Malagasy","value":"Malagasy"},{"name":"Malay","value":"Malay"},{"name":"Malayalam","value":"Malayalam"},{"name":"Maltese","value":"Maltese"},{"name":"Maori","value":"Maori"},{"name":"Marathi","value":"Marathi"},{"name":"Mongolian","value":"Mongolian"},{"name":"Myanmar (Burmese)","value":"Myanmar (Burmese)"},{"name":"Nepali","value":"Nepali"},{"name":"Norwegian","value":"Norwegian"},{"name":"Nyanja (Chichewa)","value":"Nyanja (Chichewa)"},{"name":"Pashto","value":"Pashto"},{"name":"Persian","value":"Persian"},{"name":"Polish","value":"Polish"},{"name":"Portuguese (Portugal, Brazil)","value":"Portuguese (Portugal, Brazil)"},{"name":"Punjabi","value":"Punjabi"},{"name":"Romanian","value":"Romanian"},{"name":"Russian","value":"Russian"},{"name":"Samoan","value":"Samoan"},{"name":"Scots Gaelic","value":"Scots Gaelic"},{"name":"Serbian","value":"Serbian"},{"name":"Sesotho","value":"Sesotho"},{"name":"Shona","value":"Shona"},{"name":"Sindhi","value":"Sindhi"},{"name":"Sinhala (Sinhalese)","value":"Sinhala (Sinhalese)"},{"name":"Slovak","value":"Slovak"},{"name":"Slovenian","value":"Slovenian"},{"name":"Somali","value":"Somali"},{"name":"Spanish","value":"Spanish"},{"name":"Sundanese","value":"Sundanese"},{"name":"Swahili","value":"Swahili"},{"name":"Swedish","value":"Swedish"},{"name":"Tagalog (Filipino)","value":"Tagalog (Filipino)"},{"name":"Tajik","value":"Tajik"},{"name":"Tamil","value":"Tamil"},{"name":"Telugu","value":"Telugu"},{"name":"Thai","value":"Thai"},{"name":"Turkish","value":"Turkish"},{"name":"Ukrainian","value":"Ukrainian"},{"name":"Urdu","value":"Urdu"},{"name":"Uzbek","value":"Uzbek"},{"name":"Vietnamese","value":"Vietnamese"},{"name":"Welsh","value":"Welsh"},{"name":"Xhosa","value":"Xhosa"},{"name":"Yiddish","value":"Yiddish"},{"name":"Yoruba","value":"Yoruba"},{"name":"Zulu","value":"Zulu"}]}]},{"k":"checkStringUppercase","d":"Check Text Is Uppercased","ed":"Check if string only contains uppercase characters","g":"text","p":[{"n":"text","r":true,"t":"string","p":"AAA"}]},{"k":"getStringUppercase","d":"Get Uppercased Text","ed":"Convert all letters found in a string to uppercase","g":"text","p":[{"n":"text","r":true,"t":"string","p":"Hi, Mike!"}]},{"k":"getStringVlookup","d":"Get String VLookup","ed":"Lookup string between multiple values by fuzzy logic and regex patterns","g":"text","p":[{"n":"text","r":true,"t":"string","p":"s4mple"},{"n":"texts","r":true,"t":"string","p":"sample,samples"}]},{"k":"getVatByAddress","d":"Get VAT% By Address","ed":"Get country VAT by address","g":"finance","p":[{"n":"address","r":true,"t":"string","p":"Mallorca, 120 España"}]},{"k":"getVatByCoordinates","d":"Get VAT% By Coordinates","ed":"Get country VAT by coordinates","g":"finance","p":[{"n":"coordinates","r":true,"t":"string","p":"41.61921,2.2904413"}]},{"k":"getVatByIp","d":"Get VAT% By IP","ed":"Get VAT by IP address","g":"finance","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getVatByIsocode","d":"Get VAT% By ISO Code","ed":"Get VAT value by country ISO code","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"}]},{"k":"getVatByNumber","d":"Get Data By TIN (VIES)","ed":"Get related european TIN number in Europe","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"},{"n":"tin","r":true,"t":"string","p":"44016116G"}]},{"k":"getVatByPhone","d":"Get VAT% By Phone","ed":"Get VAT by phone number, with worldwide coverage","g":"finance","p":[{"n":"phone","r":true,"t":"string","p":"57122000111"}]},{"k":"getVatByZipcode","d":"Get VAT% By Zipcode","ed":"Get VAT by zipcode","g":"finance","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"checkVatExist","d":"Check TIN Exists (VIES)","ed":"Check if TIN number exists in Europe","g":"finance","p":[{"n":"isocode","r":true,"t":"string","p":"ES"},{"n":"tin","r":true,"t":"string","p":"44016116G"}]},{"k":"getWordBanned","d":"Get Banned Words","ed":"Discover English banned words in the email body or subject","g":"text","p":[{"n":"text","r":true,"t":"string","p":"I am so thrilled to inform you that our new amazing feature is live!"}]},{"k":"getWordCleanAbuse","d":"Get Text Cleaned Without Abuse Words","ed":"Clean abuse words from a string","g":"text","p":[{"n":"text","r":true,"t":"string","p":"comentario de un maldito personaje"}]},{"k":"getWordCount","d":"Get Words Count","ed":"Count total words in a text","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"}]},{"k":"checkWordCountBetw","d":"Check Word Count Between","ed":"Check if the number of words in a sentence is between two determined quantities","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count1","r":true,"t":"string","p":"1"},{"n":"count2","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountEq","d":"Check Word Count Equal","ed":"Check if the number of words in a sentence equals a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountGe","d":"Check Word Count Greater Or Equal","ed":"Check if the number of words in a sentence is greater than or equal to a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountGt","d":"Check Word Count Greater","ed":"Check if the number of words in a sentence is greater than a certain amount","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"1"}]},{"k":"checkWordCountLe","d":"Check Word Count Lower Or Equal","ed":"Check if the number of words present in a sentence is less than or equal to a quantity","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"2"}]},{"k":"checkWordCountLt","d":"Check Word Count Lower","ed":"","g":"text","p":[{"n":"text","r":true,"t":"string","p":"sample text"},{"n":"count","r":true,"t":"string","p":"3"}]},{"k":"getZipcodeByIp","d":"Get Zipcode By IP","ed":"Discover the zipcode if you have an IP address","g":"geographic","p":[{"n":"ip","r":true,"t":"string","p":"95.23.100.79"}]},{"k":"getZipcodeByPrefix","d":"Get Zipcode By Prefix (ES)","ed":"Get first zipcode by prefix, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"080"}]},{"k":"checkZipcodeExist","d":"Check Zipcode By Prefix Exists (ES)","ed":"Discover if a zipcode number prefix exists, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"checkZipcodeFormat","d":"Check Zipcode Has Valid Format (ES)","ed":"Discover if a zipcode number has a valid format, only for Spain","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08012"}]},{"k":"getZipcodeListByPrefix","d":"Get Zipcodes By Prefix (ES)","ed":"Get multiple zipcodes by prefix, with worldwide coverage","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"080"}]},{"k":"getZipcodeNormalized","d":"Get Normalized Zipcode","ed":"Allow to normalize a zipcode, removing non allowed characters","g":"geographic","p":[{"n":"zipcode","r":true,"t":"string","p":"08i 12"}]}]}; \ No newline at end of file +export const tools = {processors: [{'k':'checkCreditcardChecksum','d':'Check Card Number Has Valid Format','ed':'Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getCreditcardType','d':'Get Credit Card Type By Number','ed':'Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getAddressBySearch','d':'Get Exact Address By Search','ed':'Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona, España'}]},{'k':'getCoordinateBySearch','d':'Get Coordinates By Search','ed':'Discover latitude and longitude coordinates of a postal address','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona, España'}]},{'k':'checkAddressExist','d':'Check Exact Address Exists','ed':'Check if an exact address exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressNormalized','d':'Get Normalized Address','ed':'Allow to normalize an address, removing non allowed characters','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona Spain'}]},{'k':'checkAddressNumberExist','d':'Check Street Number Exists','ed':'Check if a house number exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressSplitted','d':'Get Parsed Address','ed':'Parse postal address into separated fields, getting a basic resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'getAddressSplittedBest','d':'Get Improved Parsed Address','ed':'Parse postal address into separated fields, getting an improved resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'checkCoordinateValid','d':'Check Valid Coordinates','ed':'Check if coordinates have a valid format','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'checkAgeBetw','d':'Check Age Between','ed':'Check if age is between two numbers','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years1','r':true,'t':'number','p':'35'},{'n':'years2','r':true,'t':'number','p':'50'}]},{'k':'getAgeByDate','d':'Get Age By Date','ed':'Discover the age of a birth date (multiple formats allowed)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeEq','d':'Check Ages Are Equal','ed':'Check if ages are equal','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'45'}]},{'k':'checkAgeGe','d':'Check Age Is Greater Or Equal','ed':'Check if age is greater or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'43'}]},{'k':'checkAgeGt','d':'Check Age Is Greater','ed':'Check if age is greater than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'40'}]},{'k':'checkAgeIsAdult','d':'Check Age Is Greater Than Or Equal To 18 Years','ed':'Check if birth date belongs to an adult: 18 years old (Spain)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1950-05-20'}]},{'k':'checkAgeIsForties','d':'Check Age Is Between 40 And 49 Years','ed':'Check if date returns an age between 40 and 49 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeIsRetired','d':'Check Age Is Greater Than 64 Years','ed':'Check if birth date returns an age greater than 64 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1954-05-20'}]},{'k':'checkAgeIsTwenties','d':'Check Age Is Between 20 And 29 Years','ed':'Check if date returns an age between 20 and 29 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'2000-05-20'}]},{'k':'checkAgeLe','d':'Check Age Is Lower Or Equal','ed':'Check if age is lower or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'checkAgeLt','d':'Check Age Is Lower','ed':'Chekc if age is lower than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'getAgeRange','d':'Get Age Range By Date','ed':'Discover the age range of a person by birth date','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getAsinByEan','d':'Get ASIN By EAN','ed':'Get ASIN code by EAN code querying Internet.','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkAsinExist','d':'Check ASIN Exists','ed':'Check if a ASIN code exists on Amazon marketplace','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkAsinValid','d':'Check ASIN Valid','ed':'Check if a ASIN code has a valid format','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'getAudioAdvancedSpeechByText','d':'Get Advanced Speech By Text','ed':'Get advanced human audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'Arabic','value':'arabic'},{'name':'Bengali','value':'bengali'},{'name':'British','value':'british'},{'name':'Czech','value':'czech'},{'name':'Danish','value':'danish'},{'name':'Dutch','value':'dutch'},{'name':'Filipino','value':'filipino'},{'name':'Finnish','value':'finnish'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Greek','value':'greek'},{'name':'Gujurati','value':'gujurati'},{'name':'Hindi','value':'hindi'},{'name':'Hungarian','value':'hungarian'},{'name':'Indonesian','value':'indonesian'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Kannada','value':'kannada'},{'name':'Korean','value':'korean'},{'name':'Malayalam','value':'malayalam'},{'name':'Mandarin','value':'mandarin'},{'name':'Norwegian','value':'norwegian'},{'name':'Polish','value':'polish'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Slovak','value':'slovak'},{'name':'Spanish','value':'spanish'},{'name':'Tamil','value':'tamil'},{'name':'Telugu','value':'telugu'},{'name':'Thai','value':'thai'},{'name':'Turkish','value':'turkish'},{'name':'Ukranian','value':'ukranian'},{'name':'Vietnamese','value':'vietnamese'}]}]},{'k':'getAudioSpeechByText','d':'Get Speech By Text','ed':'Get audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Spanish','value':'spanish'}]}]},{'k':'checkBankAccountValidEs','d':'Check Bank Account Is Valid (ES)','ed':'Discover if account number has a valid format','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'}]},{'k':'checkBankBicValid','d':'Check BIC Is Valid','ed':'Discover if BIC number has a valid format','g':'finance','p':[{'n':'bic','r':true,'t':'string','p':'DABAIE2D'}]},{'k':'getBankIbanByAccount','d':'Get IBAN By Account','ed':'Get IBAN number by account number of the country','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'},{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getBankIbanLookup','d':'Get IBAN Lookup','ed':'Get to search data bank information by IBAN account number','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'NL91ABNA0417164300'}]},{'k':'checkBankIbanValid','d':'Check IBAN Is Valid','ed':'Discover if IBAN account number has a valid format','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'ES3314650120311716144388'}]},{'k':'getBarcodeEncoded','d':'Get Encoded Barcode','ed':'Get an encoded barcode by number and required standard','g':'image','p':[{'n':'text','r':true,'t':'string','p':'0635753490879'},{'n':'bcid','r':true,'t':'options','p':'ean13','o':[{'name':'Auspost','value':'auspost'},{'name':'Azteccode','value':'azteccode'},{'name':'Azteccodecompact','value':'azteccodecompact'},{'name':'Aztecrune','value':'aztecrune'},{'name':'Bc412','value':'bc412'},{'name':'Channelcode','value':'channelcode'},{'name':'Codablockf','value':'codablockf'},{'name':'Code11','value':'code11'},{'name':'Code128','value':'code128'},{'name':'Code16k','value':'code16k'},{'name':'Code2of5','value':'code2of5'},{'name':'Code32','value':'code32'},{'name':'Code39','value':'code39'},{'name':'Code39ext','value':'code39ext'},{'name':'Code49','value':'code49'},{'name':'Code93','value':'code93'},{'name':'Code93ext','value':'code93ext'},{'name':'Codeone','value':'codeone'},{'name':'Coop2of5','value':'coop2of5'},{'name':'Daft','value':'daft'},{'name':'Databarexpanded','value':'databarexpanded'},{'name':'Databarexpandedcomposite','value':'databarexpandedcomposite'},{'name':'Databarexpandedstacked','value':'databarexpandedstacked'},{'name':'Databarexpandedstackedcomposite','value':'databarexpandedstackedcomposite'},{'name':'Databarlimited','value':'databarlimited'},{'name':'Databarlimitedcomposite','value':'databarlimitedcomposite'},{'name':'Databaromni','value':'databaromni'},{'name':'Databaromnicomposite','value':'databaromnicomposite'},{'name':'Databarstacked','value':'databarstacked'},{'name':'Databarstackedcomposite','value':'databarstackedcomposite'},{'name':'Databarstackedomni','value':'databarstackedomni'},{'name':'Databarstackedomnicomposite','value':'databarstackedomnicomposite'},{'name':'Databartruncated','value':'databartruncated'},{'name':'Databartruncatedcomposite','value':'databartruncatedcomposite'},{'name':'Datalogic2of5','value':'datalogic2of5'},{'name':'Datamatrix','value':'datamatrix'},{'name':'Datamatrixrectangular','value':'datamatrixrectangular'},{'name':'Dotcode','value':'dotcode'},{'name':'Ean13','value':'ean13'},{'name':'Ean13composite','value':'ean13composite'},{'name':'Ean14','value':'ean14'},{'name':'Ean2','value':'ean2'},{'name':'Ean5','value':'ean5'},{'name':'Ean8','value':'ean8'},{'name':'Ean8composite','value':'ean8composite'},{'name':'Flattermarken','value':'flattermarken'},{'name':'Gs1-128','value':'gs1-128'},{'name':'Gs1-128composite','value':'gs1-128composite'},{'name':'Gs1-cc','value':'gs1-cc'},{'name':'Gs1datamatrix','value':'gs1datamatrix'},{'name':'Gs1datamatrixrectangular','value':'gs1datamatrixrectangular'},{'name':'Gs1northamericancoupon','value':'gs1northamericancoupon'},{'name':'Hanxin','value':'hanxin'},{'name':'Hibcazteccode','value':'hibcazteccode'},{'name':'Hibccodablockf','value':'hibccodablockf'},{'name':'Hibccode128','value':'hibccode128'},{'name':'Hibccode39','value':'hibccode39'},{'name':'Hibcdatamatrix','value':'hibcdatamatrix'},{'name':'Hibcdatamatrixrectangular','value':'hibcdatamatrixrectangular'},{'name':'Hibcmicropdf417','value':'hibcmicropdf417'},{'name':'Hibcpdf417','value':'hibcpdf417'},{'name':'Iata2of5','value':'iata2of5'},{'name':'Identcode','value':'identcode'},{'name':'Industrial2of5','value':'industrial2of5'},{'name':'Interleaved2of5','value':'interleaved2of5'},{'name':'Isbn','value':'isbn'},{'name':'Ismn','value':'ismn'},{'name':'Issn','value':'issn'},{'name':'Itf14','value':'itf14'},{'name':'Japanpost','value':'japanpost'},{'name':'Kix','value':'kix'},{'name':'Leitcode','value':'leitcode'},{'name':'Matrix2of5','value':'matrix2of5'},{'name':'Maxicode','value':'maxicode'},{'name':'Micropdf417','value':'micropdf417'},{'name':'Msi','value':'msi'},{'name':'Onecode','value':'onecode'},{'name':'Pdf417','value':'pdf417'},{'name':'Pdf417compact','value':'pdf417compact'},{'name':'Pharmacode','value':'pharmacode'},{'name':'Pharmacode2','value':'pharmacode2'},{'name':'Planet','value':'planet'},{'name':'Plessey','value':'plessey'},{'name':'Posicode','value':'posicode'},{'name':'Postnet','value':'postnet'},{'name':'Pzn','value':'pzn'},{'name':'RationalizedCodabar','value':'rationalizedCodabar'},{'name':'Raw','value':'raw'},{'name':'Royalmail','value':'royalmail'},{'name':'Sscc18','value':'sscc18'},{'name':'Symbol','value':'symbol'},{'name':'Telepen','value':'telepen'},{'name':'Telepennumeric','value':'telepennumeric'},{'name':'Ultracode','value':'ultracode'},{'name':'Upca','value':'upca'},{'name':'Upcacomposite','value':'upcacomposite'},{'name':'Upce','value':'upce'},{'name':'Upcecomposite','value':'upcecomposite'}]}]},{'k':'getBookAuthorLookup','d':'Get Book By Author','ed':'Get book by author's surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookCategoryLookup','d':'Get Book By Category','ed':'Get all publications by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'checkBookIsbn','d':'Check ISBN Code Is Valid','ed':'Allow to check if an ISBN10/13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbnExist','d':'Check ISBN Code Exists','ed':'Allow to check if an ISBN book exist','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookIsbnLookup','d':'Get Book By ISBN','ed':'Get book or publication data by 10 or 13 digits ISBN code','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'checkBookIsbn10','d':'Check ISBN10 Code Is Valid','ed':'Allow to check if an ISBN10 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbn13','d':'Check ISBN13 Code Is Valid','ed':'Allow to check if an ISBN13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookListAuthorLookup','d':'Get Books By Author','ed':'Get books by author's surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookListCategoryLookup','d':'Get Books By Category','ed':'Get all books by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'getBookListPublisherLookup','d':'Get Books By Editor','ed':'Get all books by editor','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookListTitleLookup','d':'Get Books By Title','ed':'Get all books by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'Science'}]},{'k':'getBookPublisherLookup','d':'Get Book By Editor','ed':'Get book data by editor's name','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookTitleLookup','d':'Get Book By Title','ed':'Get book data by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'La empresa más feliz del mundo'}]},{'k':'getNifByDni','d':'Get NIF By DNI (ES)','ed':'Discover the letter of a dni card number','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'getCifNormalized','d':'Get Normalized CIF','ed':'Allow to normalize a CIF number, removing non allowed characters','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B 62084 959'}]},{'k':'getDniNormalized','d':'Get Normalized DNI (ES)','ed':'Allow to normalize a DNI number, removing non allowed characters','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016a116'}]},{'k':'getNieNormalized','d':'Get Normalized NIE (ES)','ed':'Allow to normalize a NIE number, removing non allowed characters','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'X402001 122g'}]},{'k':'getNifNormalized','d':'Get Normalized NIF (ES)','ed':'Allow to normalize a NIF number, removing non allowed characters','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'402001 122g'}]},{'k':'checkCifValid','d':'Check CIF Is Valid (ES)','ed':'Discover if a cif card number is valid','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'A58818501'}]},{'k':'checkDniValid','d':'Check Valid Dni (ES)','ed':'Discover if a dni card number is valid','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'checkNieValid','d':'Check NIE Is Valid (ES)','ed':'Discover if a NIE card number is valid','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'Y2918527W'}]},{'k':'checkNifValid','d':'Check NIF Is Valid (ES)','ed':'Discover if a nif card number is valid','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'44016116G'}]},{'k':'getCityByIp','d':'Get City By IP','ed':'Get city from ip','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCityByName','d':'Get City By Name (ES)','ed':'City search by partial name (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Bar'}]},{'k':'getCityByPhone','d':'Get City By Phone (ES)','ed':'Discover the city name by the local phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getCityByZipcode','d':'Get City By Zipcode (ES)','ed':'Discover the city name by the zipcode (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCityListByName','d':'Get Cities By Prefix (ES)','ed':'Get multiple cities by partial initial text (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barce'}]},{'k':'getCityListByPhone','d':'Get Cities By Phone (ES)','ed':'Get multiple cities by phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'938499145'}]},{'k':'getCityListByZipcode','d':'Get Cities By Zipcode (ES)','ed':'Get multiple cities by zipcode prefix (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'234'}]},{'k':'getCityNormalized','d':'Get Normalized City','ed':'Allow to normalize a city, removing non allowed characters','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barc3l0na'}]},{'k':'checkEan13Valid','d':'Check EAN13 Is Valid','ed':'Check if a EAN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkGtin13Valid','d':'Check GTIN13 Is Valid','ed':'Check if a GTIN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkEan14Valid','d':'Check EAN14 Is Valid','ed':'Check if a EAN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkGtin14Valid','d':'Check GTIN14 Is Valid','ed':'Check if a GTIN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkEan18Valid','d':'Check EAN18 Is Valid','ed':'Check if a EAN barcode of 18 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'000004006381333931'}]},{'k':'checkEan8Valid','d':'Check EAN8 Is Valid','ed':'Check if a EAN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtin8Valid','d':'Check GTIN8 Is Valid','ed':'Check if a GTIN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getEanByAsin','d':'Get EAN By ASIN','ed':'Get EAN code by ASIN code querying Internet.','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkEanExist','d':'Check EAN Exists','ed':'Check if a EAN code exists on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkUpcExist','d':'Check UPC Exists','ed':'Check if a UPC code exists','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkUpcFormat','d':'Check UPC Has Valid Format','ed':'Check if a UPC code has a valid format','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberIsin','d':'Check ISIN Code Is Valid','ed':'Check if ISIN number is valid','g':'company','p':[{'n':'isin','r':true,'t':'string','p':'US0378331005'}]},{'k':'getUpcLookup','d':'Get Product By UPC','ed':'Get product data of an UPC code on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberSsEs','d':'Check Social Security Number Is Valid (ES)','ed':'Check if SS number is valid, only for Spain','g':'company','p':[{'n':'number','r':true,'t':'string','p':'998239812282'}]},{'k':'checkNumberUuid','d':'Check UUID Number Is Valid','ed':'Check if it a valid UUID number','g':'security','p':[{'n':'uuid','r':true,'t':'string','p':'550e8400-e29b-41d4-a716-446655440000'}]},{'k':'checkEanValid','d':'Check EAN Is Valid','ed':'Check if a EAN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtinValid','d':'Check GTIN Is Valid','ed':'Check if a GTIN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getCommunityByZipcode','d':'Get Community By Zipcode (ES)','ed':'Discover the community name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCompanyByCif','d':'Get Company By CIF (ES)','ed':'Get company data by CIF','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B66998592'}]},{'k':'getCompanyByDomain','d':'Get Company By Domain','ed':'Get company data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyByDuns','d':'Get Company By DUNS (ES)','ed':'Get company data by DUNS','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'464016690'}]},{'k':'getCompanyByEmail','d':'Get Company By Email','ed':'Get company data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getCompanyByIp','d':'Get Company By IP','ed':'Get company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'getCompanyByName','d':'Get Company By Name','ed':'Get company data by name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'},{'n':'country','r':false,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D'ivoire','value':'Cote D'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People's Republic Of','value':'Korea, Democratic People's Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People's Democratic Republic','value':'Lao People's Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]}]},{'k':'getCompanyByPhone','d':'Get Company By Phone','ed':'Get company data by phone number','g':'company','p':[{'n':'phone','r':true,'t':'string','p':'34933197570'}]},{'k':'getCompanyByProfile','d':'Get Company By Social Profile','ed':'Get company data by social network uri (LinkedIn, Twitter, ...)','g':'company','p':[{'n':'url','r':true,'t':'string','p':'https://twitter.com/Cloudflare'}]},{'k':'getPersonByProfile','d':'Get Person By Social Profile','ed':'Get personal data by social network profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getRoleClassified','d':'Get Classified Role','ed':'Identify and classify a prospect role detecting the right area and seniority to filter later','g':'company','p':[{'n':'role','r':true,'t':'string','p':'Project Manager'}]},{'k':'checkCompanyDebtorByTaxid','d':'Check Company Is Debtor By TaxId (ES)','ed':'Check if company is debtor by TaxId','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B04363115'}]},{'k':'getPersonDecisionMaker','d':'Get Decision Maker','ed':'Get professional data of a decision maker by company name/domain and area','g':'company','p':[{'n':'company','r':true,'t':'string','p':'uproc.io'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getPersonDecisionMakerBySearch','d':'Get Decision Maker By Search Engine','ed':'Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyDomainByName','d':'Get Domain By Company Name','ed':'Get company domain by company name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonEmailsByDomainAndArea','d':'Get Decision Maker's Emails By Domain And Area','ed':'Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'oracle.com'},{'n':'area','r':true,'t':'options','p':'Marketing','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getCompanyExtendedByDomain','d':'Get Company (Extended) By Domain','ed':'Get company contact, social and technology data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyExtendedByEmail','d':'Get Company (Extended) By Email','ed':'Get company contact, social and technology data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getPersonExtendedByProfile','d':'Get Person (Extended) By Profile','ed':'Get personal and social data by social profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getProfileFacebookByCompany','d':'Get Facebook URI By Company','ed':'Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getCompanyFinancialByDomain','d':'Get Sales Data By Company's Domain','ed':'Get company sales data by company's domain name.

Next countries are supported: Spain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyFinancialByDuns','d':'Get Sales Data By Company's DUNS','ed':'Get company sales data by company's DUNS number.

Next countries are supported: Spain','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'461809423'}]},{'k':'getCompanyFinancialByName','d':'Get Sales Data By Company's Name','ed':'Get company sales data by company's name.

Next countries are supported: Spain','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getCompanyFinancialByTaxid','d':'Get Sales Data By Company's Taxid','ed':'Get company sales data by company's taxid (CIF).

Next countries are supported: Spain','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B62084959'}]},{'k':'getCompanyGeocodedByIp','d':'Get Geocoded Company By IP','ed':'Get geocoded company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'sendLinkedinInvitation','d':'Send Connection Request To Linkedin Profile','ed':'Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network! Thanks'}]},{'k':'sendLinkedinInvitationOrMessage','d':'Send Invitation Or Message To Linkedin Profile','ed':'Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message1','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'},{'n':'message2','r':true,'t':'string','p':'Hi {{first}}, thank you for accepting my invitation!'}]},{'k':'getProfileLinkedinByCompany','d':'Get LinkedIn URI By Company','ed':'Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonListByParams','d':'Get Employees By Parameters','ed':'Get employees by company name or domain, area, seniority and country','g':'company','p':[{'n':'country','r':true,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D'ivoire','value':'Cote D'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People's Republic Of','value':'Korea, Democratic People's Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People's Democratic Republic','value':'Lao People's Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]},{'n':'company','r':false,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'seniority','r':false,'t':'options','p':'','o':[{'name':'Apprentice','value':'Apprentice'},{'name':'Director','value':'Director'},{'name':'Executive','value':'Executive'},{'name':'Intermediate','value':'Intermediate'},{'name':'Manager','value':'Manager'}]},{'n':'email','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'phone','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]}]},{'k':'sendLinkedinMessage','d':'Send Message To Linkedin Profile','ed':'Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'}]},{'k':'getPersonMultipleDecisionMakerBySearch','d':'Get Decision Makers By Search Engine','ed':'Discover up to ten decision makers using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyNameByDomain','d':'Get Company's Name By Domain','ed':'Get company name by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyPhoneByDomain','d':'Get Phone By Company Domain','ed':'Get company phone by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getProfileTwitterByCompany','d':'Get Twitter URI By Company','ed':'Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getDistanceByAddresses','d':'Get Distance Between Addresses','ed':'Returns straight-line distance in kilometers between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'}]},{'k':'getRouteByAddresses','d':'Get Route Between Addresses','ed':'Returns driving routing time, distance, fuel consumption and cost between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByCoordinates','d':'Get Distance Between Coordinates','ed':'Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getRouteByCoordinates','d':'Get Route Between Coordinates','ed':'Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getCoordinateByIp','d':'Get Coordinates By IP','ed':'Discover latitude and longitude coordinates of an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getDistanceByIps','d':'Get Distance Between IPs','ed':'Returns straight-line distance in kilometers between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'}]},{'k':'getRouteByIps','d':'Get Route Between IPs','ed':'Returns driving routing time, distance, fuel consumption and cost between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByPhones','d':'Get Distance Between Phones','ed':'Returns straight-line distance in kilometers between two landline phones, using city and province of every phone','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getRouteByPhones','d':'Get Route Between Phones','ed':'Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getDistanceByZipcodes','d':'Get Distance Between Zipcodes','ed':'Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getRouteByZipcodes','d':'Get Route Between Zipcodes','ed':'Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getCoordinateCartesian','d':'Get Cartesian Coordinates','ed':'Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateDecimal','d':'Get Decimal Coordinates','ed':'Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'checkDistanceEq','d':'Check Distance Is Equal','ed':'Discover if the distance between two coordinates is equal to another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33.44'}]},{'k':'checkDistanceGe','d':'Check Distance Is Greater Or Equal','ed':'Discover if the distance in quilometers between two coordinates is greater or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33'}]},{'k':'checkDistanceGt','d':'Check Distance Is Greater','ed':'Discover if the distance in quilometers between two coordinates is greater than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'30'}]},{'k':'checkDistanceLe','d':'Check Distance Is Lower Or Equal','ed':'Discover if the distance in quilometers between two coordinates is lower or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'34'}]},{'k':'checkDistanceLt','d':'Check Distance Is Lower','ed':'Discover if the distance in quilometers between two coordinates is lower than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'50'}]},{'k':'getCoordinateUsng','d':'Get USNG Coordinates','ed':'Get USNG coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateUtm','d':'Get UTM Coordinates','ed':'Get UTM coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCountryByCode','d':'Get Country By ISO Code','ed':'Get country name by its ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryByCurrencyCode','d':'Get Country By Currency','ed':'Get country name by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryByIp','d':'Get Country By IP','ed':'Get country name by IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCountryByName','d':'Get Country By Name','ed':'Get country by prefix','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa'}]},{'k':'getCountryByPhone','d':'Get Country By Phone','ed':'Get country name by phone number, with worldwide coverage','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getCountryCodeByName','d':'Get Country Code By Name','ed':'Get Alpha2 code by country prefix or name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCountryListByCode','d':'Get Countries By ISO Code','ed':'Get multiple countries by ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryListByCurrencyCode','d':'Get Countries By Currency','ed':'Get multiple country names by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryListByName','d':'Get Countries By Prefix','ed':'Get multiple country names by initial name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'S'}]},{'k':'getCountryNormalized','d':'Get Normalized Country','ed':'Allow to normalize a country, removing non allowed characters','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa1n'}]},{'k':'checkCountryValidIso','d':'Check Country Code Exists','ed':'Check if country ISO code exists','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByCountry','d':'Get Currency Code By Country Name','ed':'Get ISO currency code by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyByCountryIsocode','d':'Get Currency Code By Country Code','ed':'Get ISO currency code by an ISO country code','g':'finance','p':[{'n':'country_code','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByIp','d':'Get Currency By IP','ed':'Get ISO currency code by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyByIsocode','d':'Get Currency By ISO Currency Code','ed':'Get an ISO currency code by a currency ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCurrencyConvertedBetweenIsocodeDate','d':'Get Conversion By Currencies And Date','ed':'Convert amount between supported currencies and an exchange date','g':'finance','p':[{'n':'amount','r':true,'t':'string','p':'10'},{'n':'isocode1','r':true,'t':'options','p':'EUR','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'isocode2','r':true,'t':'options','p':'USD','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'date','r':false,'t':'string','p':'2018-02-12'}]},{'k':'getCurrencyListByCountry','d':'Get Currencies By Country','ed':'Get multiple ISO currency codes by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyListByIp','d':'Get Currencies By IP','ed':'Get all ISO currency codes by an IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyListByIsocode','d':'Get Currencies By ISO Code','ed':'Get multiple ISO currency codes by a country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkCurrencyValidIso','d':'Check ISO Currency Code Is Valid','ed':'Discover if an ISO currency code is valid','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkDateBetw','d':'Check Date Is Between Dates','ed':'Discover if a date (date1) is betwen two dates (date2, date3)','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':true,'t':'string','p':'1975-05-19'},{'n':'date3','r':true,'t':'string','p':'1975-05-22'}]},{'k':'getDateDifference','d':'Get Difference Between Dates','ed':'Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'2018-10-10 00:00:00'},{'n':'date2','r':true,'t':'string','p':'2018-10-11 00:00:00'},{'n':'period','r':true,'t':'options','p':'seconds','o':[{'name':'Days','value':'days'},{'name':'Hours','value':'hours'},{'name':'Minutes','value':'minutes'},{'name':'Seconds','value':'seconds'}]}]},{'k':'checkDateEq','d':'Check Dates Are Equal','ed':'Discover if two dates are equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateGe','d':'Check Date Is Greater Or Equal','ed':'Discover if a date is greater or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateGt','d':'Check Date Is Greater','ed':'Discover if a date is greater','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateLe','d':'Check Date Is Lower Or Equal','ed':'Discover if a date is lower or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-19'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateLeap','d':'Check Date Is Leap Year','ed':'Discover if a date belongs to a leap year','g':'personal','p':[{'n':'date','r':false,'t':'string','p':'2008-05-20'}]},{'k':'checkDateLt','d':'Check Date Is Lower','ed':'Discover if a date is lower','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'getDateNormalized','d':'Get Normalized Date','ed':'Allow to normalize a date, removing non allowed characters','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20 /01/2018'}]},{'k':'getDateParsed','d':'Get Parsed Datetime','ed':'Parse datetime, without format dependency, into multiple fields','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20/01/2018'}]},{'k':'checkDateValid','d':'Check Date Is Valid','ed':'Discover if a date has a valid format','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getDeviceByUa','d':'Get Device By User Agent','ed':'Discover device features by user agent','g':'internet','p':[{'n':'useragent','r':true,'t':'string','p':'AppleTV5,3/9.1.1'}]},{'k':'getDomainBlacklists','d':'Get Domain Blacklists','ed':'Get all blacklists where a domain appears','g':'security','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getUrlByDomain','d':'Get Default URL By Domain','ed':'Get valid, existing and default URL when accessing a domain using a web browser.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getDomainByIp','d':'Get Domain By IP','ed':'Get the domain name related with the IP address','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainByUrl','d':'Get Root Domain By Web Address','ed':'Get root domain of any web address, removing non needed characters.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io'}]},{'k':'checkDomainCatchall','d':'Check Email Domain Is Catchall','ed':'Check if domain accepts all emails, existing or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'abinitio.es'}]},{'k':'checkDomainCertificate','d':'Check Domain Has Valid Certificate','ed':'Check if domain has a valid SSL certificate','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'uproc.io'}]},{'k':'getDomainCertificate','d':'Get Certificate By Domain','ed':'Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainDisposable','d':'Check Email Domain Is Temporary','ed':'Check if domain is temporary or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cowstore.org'}]},{'k':'checkDomainExist','d':'Check Domain Exists','ed':'Check if domain exists','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'}]},{'k':'checkDomainFormat','d':'Check Domain Has Valid Format','ed':'Check if domain has a valid format','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainFree','d':'Check Email Domain Is Free','ed':'Check if domain is a free service domain provider','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainIsp','d':'Get ISP By Domain','ed':'Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainLogo','d':'Get Logo By Domain','ed':'Discover logo (favicon) used in domain','g':'image','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainMx','d':'Check Domain Has MX Record','ed':'Check if domain has a MX record','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getUrlPdf','d':'Get Pdf By URL','ed':'Generate a PDF file by URL provided using Chrome browser','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'checkDomainRecord','d':'Check Domain Has DNS Record','ed':'Check if domain has a record of that type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecord','d':'Get Domain Record By DNS Type','ed':'Get the domain record by its type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecords','d':'Get Domain DNS Records','ed':'Get all domain dns records','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainReverse','d':'Check Domain Has IP','ed':'Check if domain has assigned the IP address defined','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'mail.nova.es'},{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainReverseIp','d':'Get IP By Domain','ed':'Get the IPv4 address linked with a domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'www.gmail.com'}]},{'k':'getUrlScreenshot','d':'Get Screenshot By URL','ed':'Generate a screenshot by URL provided using Chrome browser','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'width','r':false,'t':'options','p':'640','o':[{'name':'1024','value':'1024'},{'name':'160','value':'160'},{'name':'320','value':'320'},{'name':'640','value':'640'},{'name':'800','value':'800'}]},{'n':'fullpage','r':false,'t':'options','p':'no','o':[{'name':'No','value':'no'},{'name':'Yes','value':'yes'}]},{'n':'useragent','r':false,'t':'string','p':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36'},{'n':'selector','r':false,'t':'string','p':'h1.mt-4'}]},{'k':'getUrlShareableLinks','d':'Get Shareable Links','ed':'Generates shareable URIs to use on social networks and email using a content URI and a text.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'},{'n':'text','r':true,'t':'string','p':'This is an amazing title for my content'}]},{'k':'getDomainTechnologies','d':'Get Technologies By Domain','ed':'Discover client and server technologies used in domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getUrlTechnologies','d':'Get Technologies By URL','ed':'Discover client and server technologies used in web page','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'}]},{'k':'getDomainVisits','d':'Get Visits By Domain','ed':'Get Website visits and rank of any domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainWhois','d':'Get Whois By Domain','ed':'Get the domain whois data by fields','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getIpWhois','d':'Get Whois By IP Address','ed':'Get whois data fields by IP address provided.','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'140.82.118.4'}]},{'k':'sendEmailCustom','d':'Send Custom Email','ed':'Send a custom email (HTML supported) to a recipient','g':'communication','p':[{'n':'email_from','r':true,'t':'string','p':'mcolomer@killia.com'},{'n':'email_to','r':true,'t':'string','p':'mcolomer@gmail.com'},{'n':'subject','r':true,'t':'string','p':'Welcome email'},{'n':'body','r':true,'t':'string','p':'Hi!

Welcome to uProc and start improving your business processes!'}]},{'k':'checkEmailDisposable','d':'Check Email Is Disposable Domain','ed':'Check if email domain belongs to a disposable email service','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@jetable.com'}]},{'k':'getEmailDomain','d':'Get Domain By Email','ed':'Get domain part from an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExists','d':'Check Email Exists (Simple)','ed':'Discover if the email recipient exists, returning email status','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExistsExtended','d':'Check Email Exists (Extended)','ed':'Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getEmailFirstReferences','d':'Get First Web References Of An Email','ed':'Get three first web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'getEmailFix','d':'Get Fixed Domain Email','ed':'Fix the email domain of those misspelled emails (supports all domains)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmil.com'}]},{'k':'checkEmailFormat','d':'Check Email Has Valid Format','ed':'Check if email has a valid format','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@test.com'}]},{'k':'checkEmailFree','d':'Check Email Is Free','ed':'Check if email belongs to free service provider, like gmail, hotmail, ...','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@gmail.com'}]},{'k':'getEmailGdprListByDomain','d':'Get GDPR Emails By Domain','ed':'Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getEmailListByDomain','d':'Get Emails By Domain','ed':'Get emails list found on internet by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListByEmail','d':'Get Emails By Email','ed':'Get emails list found on internet by non-free email (similar to hunter.io)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListInSite','d':'Get Emails In Website','ed':'Get emails list found inside website by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uoc.edu'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailNormalized','d':'Get Normalized Email','ed':'Normalize email address, removing non allowed characters','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test @gmail.com'}]},{'k':'getEmailRecipient','d':'Get Email By Name, Surname And Domain','ed':'Discover an email by company website or domain and prospect's firstname and lastname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':false,'t':'string','p':'Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByCompanyAndFullname','d':'Get Email By Fullname And Company','ed':'Discover an email by company's name and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'company','r':true,'t':'string','p':'uproc'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByDomainAndFullname','d':'Get Email By Fullname And Domain','ed':'Discover an email by company website or domain and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByProfile','d':'Get Email By Social Network Profile','ed':'Discover an email by contact's LinkedIn profile URI','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getEmailRecipientGdpr','d':'Get Public Email By Name, Surname And Domain (GDPR)','ed':'Discover an email by company website or domain and prospect's firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'hello'},{'n':'lastname','r':false,'t':'string','p':''}]},{'k':'getEmailReferences','d':'Get Web References Of An Email','ed':'Get web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'checkEmailRole','d':'Check Email Is Role Based','ed':'Check if email belongs to a system or role based account','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmail.com'}]},{'k':'sendMobileSms','d':'Send Custom Sms','ed':'Send a custom sms to a recipient with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'text','r':true,'t':'string','p':'Thanks for your participation!'}]},{'k':'checkEmailSmtp','d':'Check Email Has SMTP Server','ed':'Check if email domain has an SMTP server to receive emails','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailSpamtrap','d':'Check Email Is Spam Trap','ed':'Check if email is a spam trap','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'zzzwuzhdgvrxy@yahoo.co.jp'}]},{'k':'getEmailType','d':'Get Email Type','ed':'Get email type','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getFileCopiedBetweenUrls','d':'Get File Copied Between URLs','ed':'Copy file from one URL to another URL','g':'internet','p':[{'n':'source','r':true,'t':'string','p':'https://habilon.com/wp-content/uploads/2019/09/11b07c01.pdf'},{'n':'destination','r':true,'t':'string','p':'s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf'}]},{'k':'getFullnameParsed','d':'Get Parsed Fullname','ed':'Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender','g':'personal','p':[{'n':'fullname','r':true,'t':'string','p':'Colomer Salas Miquel'}]},{'k':'getGenderByEmail','d':'Get Gender By Email','ed':'Discover the gender of a person by the email, if person name is included in email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel.colomer@gmail.com'}]},{'k':'getGenderByPersonalName','d':'Get Gender By Name','ed':'Discover the gender of a person or company by name','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marc'}]},{'k':'checkGenderValid','d':'Check Gender Is Valid','ed':'Discover if a gender value is valid (multilanguage)','g':'personal','p':[{'n':'gender','r':true,'t':'string','p':'male'}]},{'k':'getImageExif','d':'Get EXIF Metadata From Image','ed':'It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg'}]},{'k':'getImageWithText','d':'Get Image With Text','ed':'Generate a new image by URL and text','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg'},{'n':'text','r':true,'t':'string','p':'Hi Miquel!'},{'n':'size','r':false,'t':'string','p':'80'}]},{'k':'getQrDecoded','d':'Get Decoded QR Code','ed':'Get QR Code decoded content by an image URL','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png'}]},{'k':'getQrEncoded','d':'Get Encoded QR Code','ed':'Get QR Code encoded by a text','g':'image','p':[{'n':'text','r':true,'t':'string','p':'Sample text to encode'}]},{'k':'getIpBlacklists','d':'Get Ip Blacklists','ed':'Get all blacklists where an IP address appears','g':'security','p':[{'n':'ip','r':true,'t':'string','p':'172.217.168.165'}]},{'k':'getLinkedinConnections','d':'Get LinkedIn Last Received Connections','ed':'Extract last 80 connections from your LinkedIn profile','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-connections'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinGroupMembers','d':'Get LinkedIn Group Members','ed':'Get members in a LinkedIn group','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/groups/59923/members/'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinInvitations','d':'Get LinkedIn Last Sent Invitations','ed':'Extract last 80 invitations sent from your LinkedIn','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-invitations'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinPostComments','d':'Get LinkedIn Post Comments','ed':'Get users who comment a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinPostLikes','d':'Get LinkedIn Post Likes','ed':'Get users who like a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinProfile','d':'Get LinkedIn Profile','ed':'Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'},{'name':'Slow','value':'slow'}]}]},{'k':'checkLinkedinProfileIsContact','d':'Check LinkedIn Profile Is Contact','ed':'Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getLinkedinProfiles','d':'Get LinkedIn Profiles','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]},{'n':'amount','r':false,'t':'string','p':'10'}]},{'k':'getLinkedinProfilesByCompany','d':'Get LinkedIn Company Employees','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/company/ibm/'},{'n':'list','r':false,'t':'string','p':'employees'}]},{'k':'getLinkedinProfilesByContent','d':'Get LinkedIn Profiles By Content','ed':'Extract fastly last profiles that have published content on LinkedIn by specific keywords','g':'communication','p':[{'n':'keywords','r':false,'t':'string','p':'Growth'},{'n':'list','r':false,'t':'string','p':'content'}]},{'k':'sendLinkedinVisit','d':'Send LinkedIn Profile Visit','ed':'Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas/'}]},{'k':'checkListContains','d':'Check List Contains','ed':'Check if the list contains a specific item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'2'}]},{'k':'checkListEnds','d':'Check List Ends With','ed':'Check if the list ends with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'3'}]},{'k':'checkListLengthBetw','d':'Check Length List Between','ed':'Check if the length of a list is between two quantities','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'4'}]},{'k':'checkListLengthEq','d':'Check Length List Equal','ed':'Checks if the length of a list equals a specified quantity','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGe','d':'Check Length List Greater Or Equal','ed':'Check if the length of a list is greater than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGt','d':'Check Length List Greater','ed':'Check if the length of a list is greater than a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'2'}]},{'k':'checkListLengthLe','d':'Check Length List Lower Or Equal','ed':'Check if the length of a list is less than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthLt','d':'Check Length List Lower','ed':'','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkListMax','d':'Check Greater Element','ed':'Checks if the largest item in a list matches the provided item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,4,8,3,4,5'},{'n':'number','r':true,'t':'string','p':'8'}]},{'k':'getListMax','d':'Get Greater Element','ed':'Returns the largest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListMin','d':'Check Lower Element','ed':'Checks if the smallest element in a list matches the provided element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'5,6,1,3,7'},{'n':'number','r':true,'t':'string','p':'1'}]},{'k':'getListMin','d':'Get Lower Element','ed':'Returns the smallest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'getListSort','d':'Get Sorted List','ed':'Returns an ascending sorted list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListSorted','d':'Check List Is Sorted','ed':'Check if a list is sorted in ascending order','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'checkListStarts','d':'Check List Starts With','ed':'Check if the list starts with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'1'}]},{'k':'checkListUnique','d':'Check Unique Es List','ed':'Check if a list consists of unique elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'getListUnique','d':'Get Unique List','ed':'Returns a single list, with no repeating elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListValid','d':'Check Valid List','ed':'Check if the supplied values ​​form a valid list of elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getLocaleByIp','d':'Get Locale Data By IP','ed':'Discover locale data (currency, language) by ipv4 or ipv6 address.','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByCoordinates','d':'Get Location By Coordinates','ed':'Discover the city name, zipcode, province or country by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.619206,2.2920828'}]},{'k':'getLocationByIp','d':'Get Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getReputationByIp','d':'Get Reputation By IP','ed':'Discover reputation by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getTimeByIp','d':'Get Time Data By IP','ed':'Discover datetime data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByName','d':'Get Location By Name','ed':'Discover location data by name','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getLocationByPhone','d':'Get Location By Landline Phone (ES)','ed':'Discover the city and the province from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'848491812'}]},{'k':'getLocationByZipcode','d':'Get Location By Zipcode (ES)','ed':'Discover the city and the province from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getLocationExtendedByIp','d':'Get Extended Location By IP','ed':'Discover geographical, company, timezone and reputation data by IPv4 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationGeocodedByIp','d':'Get Geocoded Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationListByName','d':'Get Locations By Name','ed':'Get most relevants locations by name (Google Maps typical search)','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Pintores Granollers'}]},{'k':'getLocationListByParams','d':'Get Locations By Parameters','ed':'Get most relevants locations by name, category, location and radius','g':'geographic','p':[{'n':'name','r':false,'t':'string','p':'Saba'},{'n':'category','r':false,'t':'options','p':'parking','o':[{'name':'Accounting','value':'accounting'},{'name':'Airport','value':'airport'},{'name':'Amusement_park','value':'amusement_park'},{'name':'Aquarium','value':'aquarium'},{'name':'Art_gallery','value':'art_gallery'},{'name':'Atm','value':'atm'},{'name':'Bakery','value':'bakery'},{'name':'Bank','value':'bank'},{'name':'Bar','value':'bar'},{'name':'Beauty_salon','value':'beauty_salon'},{'name':'Bicycle_store','value':'bicycle_store'},{'name':'Book_store','value':'book_store'},{'name':'Bowling_alley','value':'bowling_alley'},{'name':'Bus_station','value':'bus_station'},{'name':'Cafe','value':'cafe'},{'name':'Campground','value':'campground'},{'name':'Car_dealer','value':'car_dealer'},{'name':'Car_rental','value':'car_rental'},{'name':'Car_repair','value':'car_repair'},{'name':'Car_wash','value':'car_wash'},{'name':'Casino','value':'casino'},{'name':'Cemetery','value':'cemetery'},{'name':'Church','value':'church'},{'name':'City_hall','value':'city_hall'},{'name':'Clothing_store','value':'clothing_store'},{'name':'Convenience_store','value':'convenience_store'},{'name':'Courthouse','value':'courthouse'},{'name':'Dentist','value':'dentist'},{'name':'Department_store','value':'department_store'},{'name':'Doctor','value':'doctor'},{'name':'Electrician','value':'electrician'},{'name':'Electronics_store','value':'electronics_store'},{'name':'Embassy','value':'embassy'},{'name':'Establishment','value':'establishment'},{'name':'Finance','value':'finance'},{'name':'Fire_station','value':'fire_station'},{'name':'Florist','value':'florist'},{'name':'Food','value':'food'},{'name':'Funeral_home','value':'funeral_home'},{'name':'Furniture_store','value':'furniture_store'},{'name':'Gas_station','value':'gas_station'},{'name':'General_contractor','value':'general_contractor'},{'name':'Grocery_or_supermarket','value':'grocery_or_supermarket'},{'name':'Gym','value':'gym'},{'name':'Hair_care','value':'hair_care'},{'name':'Hardware_store','value':'hardware_store'},{'name':'Health','value':'health'},{'name':'Hindu_temple','value':'hindu_temple'},{'name':'Home_goods_store','value':'home_goods_store'},{'name':'Hospital','value':'hospital'},{'name':'Insurance_agency','value':'insurance_agency'},{'name':'Jewelry_store','value':'jewelry_store'},{'name':'Laundry','value':'laundry'},{'name':'Lawyer','value':'lawyer'},{'name':'Library','value':'library'},{'name':'Liquor_store','value':'liquor_store'},{'name':'Local_government_office','value':'local_government_office'},{'name':'Locksmith','value':'locksmith'},{'name':'Lodging','value':'lodging'},{'name':'Meal_delivery','value':'meal_delivery'},{'name':'Meal_takeaway','value':'meal_takeaway'},{'name':'Mosque','value':'mosque'},{'name':'Movie_rental','value':'movie_rental'},{'name':'Movie_theater','value':'movie_theater'},{'name':'Moving_location','value':'moving_location'},{'name':'Museum','value':'museum'},{'name':'Night_club','value':'night_club'},{'name':'Painter','value':'painter'},{'name':'Park','value':'park'},{'name':'Parking','value':'parking'},{'name':'Pet_store','value':'pet_store'},{'name':'Pharmacy','value':'pharmacy'},{'name':'Physiotherapist','value':'physiotherapist'},{'name':'Place_of_worship','value':'place_of_worship'},{'name':'Plumber','value':'plumber'},{'name':'Police','value':'police'},{'name':'Post_office','value':'post_office'},{'name':'Real_estate_agency','value':'real_estate_agency'},{'name':'Restaurant','value':'restaurant'},{'name':'Roofing_contractor','value':'roofing_contractor'},{'name':'Rv_park','value':'rv_park'},{'name':'School','value':'school'},{'name':'Shoe_store','value':'shoe_store'},{'name':'Shopping_mall','value':'shopping_mall'},{'name':'Spa','value':'spa'},{'name':'Stadium','value':'stadium'},{'name':'Storage','value':'storage'},{'name':'Store','value':'store'},{'name':'Subway_station','value':'subway_station'},{'name':'Synagogue','value':'synagogue'},{'name':'Taxi_stand','value':'taxi_stand'},{'name':'Train_station','value':'train_station'},{'name':'Transit_station','value':'transit_station'},{'name':'Travel_agency','value':'travel_agency'},{'name':'University','value':'university'},{'name':'Veterinary_care','value':'veterinary_care'},{'name':'Zoo','value':'zoo'}]},{'n':'location','r':true,'t':'string','p':'41.3851,2.1734'},{'n':'radius','r':false,'t':'string','p':'250'}]},{'k':'checkMobileAlive','d':'Check Mobile Is Alive','ed':'Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don't return if mobile is alive (like Vodafone)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryCode','d':'Get Country ISO Code By Mobile','ed':'Allow to get country code (two chars) of a mobile phone number with international format','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryPrefix','d':'Get Phone Prefix By Country ISO Code','ed':'Allow to get country prefix number by country code (2 characters)','g':'communication','p':[{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileExist','d':'Check Mobile Exists','ed':'Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with \'Mobile lookup\' tool.','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileFormat','d':'Check Mobile Has Valid Format','ed':'Discover if mobile phone number has a valid format, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34623123213'},{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileFormatEs','d':'Check Mobile Has Valid Format (ES)','ed':'Discover if mobile phone number has a valid format (only Spain)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'623123213'}]},{'k':'getMobileFormatted','d':'Get Formatted Mobile','ed':'Format international mobile number by country ISO code (2 letters).','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileHlrLookup','d':'Get HLR Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileImei','d':'Check Imei Is Valid','ed':'Discover if Imei number has a valid format','g':'communication','p':[{'n':'imei','r':true,'t':'string','p':'490154203237518'}]},{'k':'getMobileLookup','d':'Get Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileMnpLookup','d':'Get Mobile Portability Lookup','ed':'Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileNormalized','d':'Get Normalized Mobile','ed':'Allow to normalize a mobile phone, removing non allowed characters','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34 62318 2 770'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileOrPhoneLookupEs','d':'Get Mobile/Landline Lookup (Spain)','ed':'Discover if mobile or landline prefix exists on Spain.','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileOrPhoneMnpEs','d':'Get Landline/Mobile Portability Lookup (ES)','ed':'Get portability data about a landline or mobile number, only for Spain','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'605281220'}]},{'k':'checkMobileSms','d':'Check Mobile Supports Sms','ed':'Discover if a mobile number can receive sms, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefix','d':'Check Mobile Has Valid Prefix','ed':'Discover if mobile phone number has a valid prefix, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefixEs','d':'Check Mobile Has Valid Prefix (ES)','ed':'Discover if spanish mobile phone number has a valid prefix','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'605281220'}]},{'k':'getNameByPrefix','d':'Get Name By Prefix (ES)','ed':'Get first personal name matching by prefix and gender from INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'checkNameExist','d':'Check Name Exists (ES)','ed':'Check if a personal name exists in INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Juan'}]},{'k':'getNameListByPrefix','d':'Get Names By Prefix','ed':'Get multiple personal names by prefix','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'getNameNormalized','d':'Get Normalized Name','ed':'Normalize name removing non allowed characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'M4rc'}]},{'k':'checkNameValid','d':'Check Name Has Valid Format','ed':'Check if name contains accepted characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getUrlAnalysis','d':'Get URL Analysis','ed':'Analyze URL's health status about SSL, broken links, conflictive HTTP links with SSL, and more.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'getNetAton','d':'Get Number By IP','ed':'Convert an IP address to numeric notation','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'62.12.22.11'}]},{'k':'getNetByIp','d':'Get Network By IP','ed':'Discover network data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'checkUrlContains','d':'Check URL Contains','ed':'Check if an URL contains string or regular expression (case insensitive)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'regex','r':true,'t':'string','p':'uProc'}]},{'k':'getUrlContents','d':'Get Contents From URL','ed':'Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'},{'n':'selector','r':false,'t':'string','p':'emails'}]},{'k':'getUrlContentsParsed','d':'Get Parsed Contents From URL','ed':'Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getUrlDecode','d':'Get Decoded URL','ed':'Decode URL to recover original','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https%3A%2F%2Fgoogle.es'}]},{'k':'getUrlEncode','d':'Get Encoded URL','ed':'Encode URL to avoid problems','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://google.com'}]},{'k':'checkUrlExist','d':'Check URL Exists','ed':'Check if an URL exists','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'getNetFixip','d':'Get Fixed IP','ed':'Fix an IP address to the right format','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'212169160147'}]},{'k':'checkNetHostAlive','d':'Check Host Is Up','ed':'Discover if a computer is switched on','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.es'}]},{'k':'checkStringIp','d':'Check IP Has Valid Format','ed':'Check if IPv4 or IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'23.45.57.123'}]},{'k':'checkStringIp4','d':'Check IPv4 Has Valid Format','ed':'Check if IPv4 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'127.0.0.1'}]},{'k':'checkStringIp6','d':'Check IPv6 Has Valid Format','ed':'Check if IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'2a01:c50e:3544:bd00:4df0:7609:251a:f6d0'}]},{'k':'getUrlListContentsParsed','d':'Get Parsed Contents From Results URL','ed':'Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getNetNtoa','d':'Get IP By Number','ed':'Convert a number to an IP address','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'1501706957'}]},{'k':'getUrlParsed','d':'Get Parsed URL','ed':'Decode URL into multiple fields','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'}]},{'k':'getNetScan','d':'Get Opened Ports In Host','ed':'Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'google.es'}]},{'k':'checkNetServiceUp','d':'Check Service Is Up','ed':'Discover if a service in a port is available','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.com'},{'n':'port','r':true,'t':'string','p':'80'}]},{'k':'getUrlTables','d':'Get Table From URL','ed':'Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2'},{'n':'table','r':false,'t':'string','p':'3'}]},{'k':'checkUrlValid','d':'Check URL Is Valid','ed':'Check that an URL has a valid format','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'checkNumberBetw','d':'Check Number Is Between','ed':'Check if number is between two values','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'21'},{'n':'number3','r':true,'t':'string','p':'24'}]},{'k':'checkNumberDecimal','d':'Check Decimal Number Is Valid','ed':'Check if value is a decimal number','p':[{'n':'number','r':true,'t':'string','p':'0.23'}]},{'k':'checkNumberEq','d':'Check Number Is Equal','ed':'Check if number is equal to another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberEven','d':'Check Even Number Is Valid','ed':'Check if number is even','p':[{'n':'number','r':true,'t':'string','p':'2'}]},{'k':'checkNumberGe','d':'Check Number Is Greater Or Equal','ed':'Check if number is greater or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberGt','d':'Check Number Is Greater','ed':'Check if number is greater than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'22'}]},{'k':'checkNumberLe','d':'Check Number Is Lower Or Equal','ed':'Check if number is lower or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLt','d':'Check Number Is Lower','ed':'Check if number is lower than another','p':[{'n':'number1','r':true,'t':'string','p':'22'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLuhn','d':'Check Luhn Number Is Valid','ed':'Check if it a valid Luhn number','g':'security','p':[{'n':'luhn','r':true,'t':'string','p':'79927398713'}]},{'k':'checkNumberMod','d':'Check Modulus Is Equals','ed':'Check if modulus between two numbers is equal to a value','p':[{'n':'number','r':true,'t':'string','p':'10'},{'n':'mod','r':true,'t':'string','p':'2'},{'n':'rest','r':true,'t':'string','p':'0'}]},{'k':'checkNumberNatural','d':'Check Natural Number Is Valid','ed':'Check if value is a natural number','p':[{'n':'number','r':true,'t':'string','p':'0'}]},{'k':'checkStringNumeric','d':'Check Numeric String Is Valid','ed':'Check if string length contains only numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'123'}]},{'k':'checkNumberOdd','d':'Check Odd Number Is Valid','ed':'Check if number is odd','p':[{'n':'number','r':true,'t':'string','p':'3'}]},{'k':'checkNumberPrime','d':'Check Prime Number Is Valid','ed':'Check if number is prime','p':[{'n':'number','r':true,'t':'string','p':'11'}]},{'k':'checkPasswordStrong','d':'Check Password Is Strong','ed':'Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters','g':'security','p':[{'n':'password','r':true,'t':'string','p':'1agdA*$#'}]},{'k':'getPersonByEmail','d':'Get Person By Email','ed':'Get personal data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonByFirstnameLastnameCompanyLocation','d':'Get Person By Firstname, Lastname, Company And Location','ed':'Get personal data by firstname, lastname, company and location','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':false,'t':'string','p':'uProc'},{'n':'location','r':false,'t':'string','p':''}]},{'k':'getPersonByMobile','d':'Get Person By Mobile','ed':'Get personal data by mobile','g':'personal','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'sendPersonEmailToList','d':'Send Email's Contact To List','ed':'Add a contact email to a person list','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getPersonExtendedByEmail','d':'Get Person (Extended) By Email','ed':'Get prospect's contact data and company's location and social data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonExtendedByEmailAndCompany','d':'Get Person (Extended) By Email And Company','ed':'Get contact, location and social data by email and company name and location','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'company','r':false,'t':'string','p':'uProc'}]},{'k':'getPersonFakedData','d':'Get Random Person Data','ed':'Generates random fake data','g':'personal','p':[{'n':'locality','r':true,'t':'options','p':'English','o':[{'name':'Australia (English)','value':'Australia (English)'},{'name':'Australia Ocker (English)','value':'Australia Ocker (English)'},{'name':'Azerbaijani','value':'Azerbaijani'},{'name':'Bork (English)','value':'Bork (English)'},{'name':'Canada (English)','value':'Canada (English)'},{'name':'Canada (French)','value':'Canada (French)'},{'name':'Chinese','value':'Chinese'},{'name':'Chinese (Taiwan)','value':'Chinese (Taiwan)'},{'name':'Czech','value':'Czech'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Farsi','value':'Farsi'},{'name':'French','value':'French'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'German (Austria)','value':'German (Austria)'},{'name':'German (Switzerland)','value':'German (Switzerland)'},{'name':'Great Britain (English)','value':'Great Britain (English)'},{'name':'India (English)','value':'India (English)'},{'name':'Indonesia','value':'Indonesia'},{'name':'Ireland (English)','value':'Ireland (English)'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Korean','value':'Korean'},{'name':'Nepalese','value':'Nepalese'},{'name':'Norwegian','value':'Norwegian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Brazil)','value':'Portuguese (Brazil)'},{'name':'Russian','value':'Russian'},{'name':'Slovakian','value':'Slovakian'},{'name':'Spanish','value':'Spanish'},{'name':'Spanish Mexico','value':'Spanish Mexico'},{'name':'Swedish','value':'Swedish'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'United States (English)','value':'United States (English)'},{'name':'Vietnamese','value':'Vietnamese'}]}]},{'k':'getProfileByEmployeeData','d':'Get LinkedIn URI By First, Last And Company','ed':'Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':true,'t':'string','p':'uProc'}]},{'k':'getSurnameByPrefix','d':'Get Surname By Prefix (ES)','ed':'Get first personal surname matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Col'}]},{'k':'checkSurnameExist','d':'Check Surname Is Valid (ES)','ed':'Check if a personal surname appears in INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileLinkedinByEmail','d':'Get LinkedIn URI By Email','ed':'Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getSurnameListByPrefix','d':'Get Surnames By Prefix (ES)','ed':'Get personal surnames matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Co'}]},{'k':'getSurnameNormalized','d':'Get Normalized Surname','ed':'Normalize surname','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'C0lomer'}]},{'k':'getProfileTwitterByEmployeeData','d':'Get Twitter URI By First, Last And Company','ed':'Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Carlos'},{'n':'lastname','r':true,'t':'string','p':'Blanco'},{'n':'company','r':true,'t':'string','p':'Encomenda'}]},{'k':'checkSurnameValid','d':'Check Surname Has Valid Format','ed':'Check if surname contains accepted characters','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileXingByEmployeeData','d':'Get Xing URI By First, Last And Company','ed':'Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'David'},{'n':'lastname','r':true,'t':'string','p':'Tomás'},{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPhoneFixed','d':'Get Fixed Phone','ed':'Fix the international prefix of a phone based on the ISO code of a country','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'+1605281220'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormat','d':'Check Valid Phone Format By Country','ed':'Allow to discover if landline number has a good international format, depending on country ','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormatEs','d':'Check Valid Phone Format (ES)','ed':'Discover if landline phone number is valid, with Spain coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getPhoneNormalized','d':'Get Cleaned Phone','ed':'Clean a phone removing non allowed characters','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'3493218 767o'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneOrMobileValid','d':'Check Phone Or Mobile Valid','ed':'Discover if landline or mobile number has a valid prefix','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getPhoneParsed','d':'Get Parsed And Validated Phone','ed':'Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'checkPhoneValidPrefix','d':'Check Valid Phone Prefix','ed':'Discover if a landline phone number prefix exists, with worldwide coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'getProvinceByIp','d':'Get Province By IP','ed':'Discover the province name from an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getProvinceByName','d':'Get Province By Name (ES)','ed':'You can get the first province by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceByPhone','d':'Get Province By Phone (ES)','ed':'Discover the province name from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceByZipcode','d':'Get Province By Zipcode (ES)','ed':'Discover the province name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08'}]},{'k':'getProvinceListByName','d':'Get Provinces By Name (ES)','ed':'You can get a province list by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceListByPhone','d':'Get Provinces By Phone (ES)','ed':'You can get a province list by a phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceListByZipcode','d':'Get Provinces By Zipcode (ES)','ed':'You can get a province list by a zipcode prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'0'}]},{'k':'getProvinceNormalized','d':'Get Normalized Province','ed':'Allow to normalize a province, removing non allowed characters','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'Barce lona'}]},{'k':'checkRobinsonEmailExist','d':'Check Email Is Robinson (ES)','ed':'Discover if an email exists in the Robinson list (only Spain)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'manzaned@uvigo.es'}]},{'k':'checkRobinsonNifExist','d':'Check Nif Number Is Robinson (ES)','ed':'Discover if an nif exists in the Robinson list (only Spain)','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'00002206K'}]},{'k':'checkRobinsonPhoneExist','d':'Check Phone Is Robinson (ES)','ed':'Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'917156252'}]},{'k':'getSentimentByText','d':'Get Sentiment From A Text','ed':'It allows to analyze an english text with Emojis and detect sentiment','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am very happy'}]},{'k':'checkSocialDomainExist','d':'Check Domain Has Social Activity','ed':'Discover if a domain has social network presence','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainLookup','d':'Get Social Networks By Domain','ed':'Discover if a domain or a website has social activity and returns all social network profiles found','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainParsed','d':'Get Social Networks Activity By Domain','ed':'Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'checkSocialEmailExist','d':'Check Email Has Social Activity','ed':'Discover if the email has social network presence','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@gmail.com'}]},{'k':'getSocialEmailLookup','d':'Get Social Networks By Email','ed':'Discover if an email has social activity, and get all social network profiles found','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkSocialMobileExist','d':'Check Mobile Has Social Activity','ed':'Discover if the mobile phone has social network presence','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialMobileLookup','d':'Get Social Networks By Mobile','ed':'Discover if an mobile phone has social activity, and get all social network profiles found','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialUriParsed','d':'Get Social Network Activity','ed':'This tools parses a social uri address and extracts any available indicators','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.facebook.com/uprocdataquality'}]},{'k':'checkStringAlpha','d':'Check Alphabetic String Is Valid','ed':'Check if string length contains only letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'asc'}]},{'k':'checkStringAlphanumeric','d':'Check Alphanumeric String Is Valid','ed':'Check if string length contains only numbers and letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aa11'}]},{'k':'getStringBase64','d':'Get BASE64 Value','ed':'Convert a string to a BASE64 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'checkStringBlank','d':'Check String Is Empty','ed':'Check if string has no content','g':'text','p':[{'n':'text','r':true,'t':'string','p':''}]},{'k':'checkStringBoolean','d':'Check Boolean String Is Valid','ed':'Check if string is true or false','g':'text','p':[{'n':'text','r':true,'t':'string','p':'true'}]},{'k':'getStringByFormat','d':'Get Formatted String By Pattern','ed':'It allows to format a string using a format pattern','g':'text','p':[{'n':'text','r':true,'t':'string','p':'1122'},{'n':'format','r':true,'t':'string','p':'%09d'}]},{'k':'getStringByRegex','d':'Get Generated Text By Pattern','ed':'Generate a random string using a regular expression as a pattern','g':'text','p':[{'n':'regex','r':true,'t':'string','p':'[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*'}]},{'k':'checkStringContains','d':'Check String Contains Char','ed':'Check if string contains a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'checkStringEnds','d':'Check String Ends With','ed':'Check if string ends with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringFieldName','d':'Get Field Type By Value','ed':'Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address','g':'text','p':[{'n':'text','r':true,'t':'string','p':'myemail@mydomain.com'}]},{'k':'getStringJoin','d':'Get Merged Values By Text','ed':'Join a character or string to join two values','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'hi'},{'n':'text2','r':true,'t':'string','p':'good morning!'},{'n':'glue','r':true,'t':'string','p':','}]},{'k':'getStringLength','d':'Get String Length','ed':'Get length of a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'checkStringLengthBetw','d':'Check String Length Is Between','ed':'Check if string length is between two numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'5'}]},{'k':'checkStringLengthEq','d':'Check String Length Is Equal','ed':'Check if string length is equal to number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGe','d':'Check String Length Is Greater Or Equal','ed':'Check if string length is greater or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGt','d':'Check String Length Is Greater','ed':'Check if string length is greater than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkStringLengthLe','d':'Check String Length Is Lower Or Equal','ed':'Check if string length is lower or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthLt','d':'Check String Length Is Lower','ed':'Check if string length is lower than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'5'}]},{'k':'checkStringLowercase','d':'Check Text Is Lowercased','ed':'Check if string only contains lowercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aaa'}]},{'k':'getStringLowercase','d':'Get Lowercased Text','ed':'Convert all letters found in a string to lowercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringMd5','d':'Get MD5 String','ed':'Convert a string to a MD5 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringNormalized','d':'Get Normalized String By Field','ed':'Normalize a string depending on the field name','g':'text','p':[{'n':'field','r':true,'t':'options','p':'name','o':[{'name':'Alphabetic','value':'alphabetic'},{'name':'Alphanumeric','value':'alphanumeric'},{'name':'Cif','value':'cif'},{'name':'City','value':'city'},{'name':'Country','value':'country'},{'name':'Date','value':'date'},{'name':'Decimal','value':'decimal'},{'name':'Dni','value':'dni'},{'name':'Domain','value':'domain'},{'name':'Email','value':'email'},{'name':'Gender','value':'gender'},{'name':'Integer','value':'integer'},{'name':'Ip','value':'ip'},{'name':'Mobile','value':'mobile'},{'name':'Name','value':'name'},{'name':'Nie','value':'nie'},{'name':'Nif','value':'nif'},{'name':'Phone','value':'phone'},{'name':'Province','value':'province'},{'name':'Zipcode','value':'zipcode'}]},{'n':'text','r':true,'t':'string','p':'JMª Gº.Fco.gtez. Gro.'}]},{'k':'getStringParsed','d':'Get Parsed Text','ed':'Analyze string and return all emails, phones, zipcodes and links detected','g':'text','p':[{'n':'text','r':true,'t':'string','p':'My email is miquel@uproc.io and my phone is 34605281220'}]},{'k':'checkStringRandom','d':'Check String Is Random','ed':'Check if string contains random characters without sense','g':'text','p':[{'n':'text','r':true,'t':'string','p':'t2 chhsdfitoixcv'}]},{'k':'checkStringRegex','d':'Check String Is Valid By Pattern','ed':'Check if string contains a value that matches with a regular expression','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'regex','r':true,'t':'string','p':'^test$'}]},{'k':'getStringReplaceAll','d':'Get Texts Replaced By String','ed':'Replace all values found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringReplaceFirst','d':'Get Text Replaced By String','ed':'Replace first value found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringSha','d':'Get SHA String','ed':'Convert a string to a SHA encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringSplit','d':'Get Splitted Values By Separator','ed':'Split a value in two parts, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Texto largo, separado por coma'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getStringSplitAndJoin','d':'Get Splitted And Merged Values By Separator','ed':'Split a value in two parts and join them, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'separator','r':true,'t':'string','p':','},{'n':'glue','r':true,'t':'string','p':';'}]},{'k':'checkStringStarts','d':'Check String Starts With','ed':'Check if string starts with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringTranslated','d':'Get Translated Text','ed':'It allows to translate a text to any language','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, my name is Mike'},{'n':'language','r':true,'t':'options','p':'Spanish','o':[{'name':'Afrikaans','value':'Afrikaans'},{'name':'Albanian','value':'Albanian'},{'name':'Amharic','value':'Amharic'},{'name':'Arabic','value':'Arabic'},{'name':'Armenian','value':'Armenian'},{'name':'Azeerbaijani','value':'Azeerbaijani'},{'name':'Basque','value':'Basque'},{'name':'Belarusian','value':'Belarusian'},{'name':'Bengali','value':'Bengali'},{'name':'Bosnian','value':'Bosnian'},{'name':'Bulgarian','value':'Bulgarian'},{'name':'Catalan','value':'Catalan'},{'name':'Cebuano','value':'Cebuano'},{'name':'Chinese (Simplified)','value':'Chinese (Simplified)'},{'name':'Chinese (Traditional)','value':'Chinese (Traditional)'},{'name':'Corsican','value':'Corsican'},{'name':'Croatian','value':'Croatian'},{'name':'Czech','value':'Czech'},{'name':'Danish','value':'Danish'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Esperanto','value':'Esperanto'},{'name':'Estonian','value':'Estonian'},{'name':'Finnish','value':'Finnish'},{'name':'French','value':'French'},{'name':'Frisian','value':'Frisian'},{'name':'Galician','value':'Galician'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'Greek','value':'Greek'},{'name':'Gujarati','value':'Gujarati'},{'name':'Haitian Creole','value':'Haitian Creole'},{'name':'Hausa','value':'Hausa'},{'name':'Hawaiian','value':'Hawaiian'},{'name':'Hebrew','value':'Hebrew'},{'name':'Hindi','value':'Hindi'},{'name':'Hmong','value':'Hmong'},{'name':'Hungarian','value':'Hungarian'},{'name':'Icelandic','value':'Icelandic'},{'name':'Igbo','value':'Igbo'},{'name':'Indonesian','value':'Indonesian'},{'name':'Irish','value':'Irish'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Javanese','value':'Javanese'},{'name':'Kannada','value':'Kannada'},{'name':'Kazakh','value':'Kazakh'},{'name':'Khmer','value':'Khmer'},{'name':'Korean','value':'Korean'},{'name':'Kurdish','value':'Kurdish'},{'name':'Kyrgyz','value':'Kyrgyz'},{'name':'Lao','value':'Lao'},{'name':'Latin','value':'Latin'},{'name':'Latvian','value':'Latvian'},{'name':'Lithuanian','value':'Lithuanian'},{'name':'Luxembourgish','value':'Luxembourgish'},{'name':'Macedonian','value':'Macedonian'},{'name':'Malagasy','value':'Malagasy'},{'name':'Malay','value':'Malay'},{'name':'Malayalam','value':'Malayalam'},{'name':'Maltese','value':'Maltese'},{'name':'Maori','value':'Maori'},{'name':'Marathi','value':'Marathi'},{'name':'Mongolian','value':'Mongolian'},{'name':'Myanmar (Burmese)','value':'Myanmar (Burmese)'},{'name':'Nepali','value':'Nepali'},{'name':'Norwegian','value':'Norwegian'},{'name':'Nyanja (Chichewa)','value':'Nyanja (Chichewa)'},{'name':'Pashto','value':'Pashto'},{'name':'Persian','value':'Persian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Portugal, Brazil)','value':'Portuguese (Portugal, Brazil)'},{'name':'Punjabi','value':'Punjabi'},{'name':'Romanian','value':'Romanian'},{'name':'Russian','value':'Russian'},{'name':'Samoan','value':'Samoan'},{'name':'Scots Gaelic','value':'Scots Gaelic'},{'name':'Serbian','value':'Serbian'},{'name':'Sesotho','value':'Sesotho'},{'name':'Shona','value':'Shona'},{'name':'Sindhi','value':'Sindhi'},{'name':'Sinhala (Sinhalese)','value':'Sinhala (Sinhalese)'},{'name':'Slovak','value':'Slovak'},{'name':'Slovenian','value':'Slovenian'},{'name':'Somali','value':'Somali'},{'name':'Spanish','value':'Spanish'},{'name':'Sundanese','value':'Sundanese'},{'name':'Swahili','value':'Swahili'},{'name':'Swedish','value':'Swedish'},{'name':'Tagalog (Filipino)','value':'Tagalog (Filipino)'},{'name':'Tajik','value':'Tajik'},{'name':'Tamil','value':'Tamil'},{'name':'Telugu','value':'Telugu'},{'name':'Thai','value':'Thai'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'Urdu','value':'Urdu'},{'name':'Uzbek','value':'Uzbek'},{'name':'Vietnamese','value':'Vietnamese'},{'name':'Welsh','value':'Welsh'},{'name':'Xhosa','value':'Xhosa'},{'name':'Yiddish','value':'Yiddish'},{'name':'Yoruba','value':'Yoruba'},{'name':'Zulu','value':'Zulu'}]}]},{'k':'checkStringUppercase','d':'Check Text Is Uppercased','ed':'Check if string only contains uppercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'AAA'}]},{'k':'getStringUppercase','d':'Get Uppercased Text','ed':'Convert all letters found in a string to uppercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringVlookup','d':'Get String VLookup','ed':'Lookup string between multiple values by fuzzy logic and regex patterns','g':'text','p':[{'n':'text','r':true,'t':'string','p':'s4mple'},{'n':'texts','r':true,'t':'string','p':'sample,samples'}]},{'k':'getVatByAddress','d':'Get VAT% By Address','ed':'Get country VAT by address','g':'finance','p':[{'n':'address','r':true,'t':'string','p':'Mallorca, 120 España'}]},{'k':'getVatByCoordinates','d':'Get VAT% By Coordinates','ed':'Get country VAT by coordinates','g':'finance','p':[{'n':'coordinates','r':true,'t':'string','p':'41.61921,2.2904413'}]},{'k':'getVatByIp','d':'Get VAT% By IP','ed':'Get VAT by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getVatByIsocode','d':'Get VAT% By ISO Code','ed':'Get VAT value by country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getVatByNumber','d':'Get Data By TIN (VIES)','ed':'Get related european TIN number in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getVatByPhone','d':'Get VAT% By Phone','ed':'Get VAT by phone number, with worldwide coverage','g':'finance','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getVatByZipcode','d':'Get VAT% By Zipcode','ed':'Get VAT by zipcode','g':'finance','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkVatExist','d':'Check TIN Exists (VIES)','ed':'Check if TIN number exists in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getWordBanned','d':'Get Banned Words','ed':'Discover English banned words in the email body or subject','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am so thrilled to inform you that our new amazing feature is live!'}]},{'k':'getWordCleanAbuse','d':'Get Text Cleaned Without Abuse Words','ed':'Clean abuse words from a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'comentario de un maldito personaje'}]},{'k':'getWordCount','d':'Get Words Count','ed':'Count total words in a text','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'}]},{'k':'checkWordCountBetw','d':'Check Word Count Between','ed':'Check if the number of words in a sentence is between two determined quantities','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count1','r':true,'t':'string','p':'1'},{'n':'count2','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountEq','d':'Check Word Count Equal','ed':'Check if the number of words in a sentence equals a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGe','d':'Check Word Count Greater Or Equal','ed':'Check if the number of words in a sentence is greater than or equal to a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGt','d':'Check Word Count Greater','ed':'Check if the number of words in a sentence is greater than a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'1'}]},{'k':'checkWordCountLe','d':'Check Word Count Lower Or Equal','ed':'Check if the number of words present in a sentence is less than or equal to a quantity','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountLt','d':'Check Word Count Lower','ed':'','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'3'}]},{'k':'getZipcodeByIp','d':'Get Zipcode By IP','ed':'Discover the zipcode if you have an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getZipcodeByPrefix','d':'Get Zipcode By Prefix (ES)','ed':'Get first zipcode by prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'checkZipcodeExist','d':'Check Zipcode By Prefix Exists (ES)','ed':'Discover if a zipcode number prefix exists, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkZipcodeFormat','d':'Check Zipcode Has Valid Format (ES)','ed':'Discover if a zipcode number has a valid format, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getZipcodeListByPrefix','d':'Get Zipcodes By Prefix (ES)','ed':'Get multiple zipcodes by prefix, with worldwide coverage','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'getZipcodeNormalized','d':'Get Normalized Zipcode','ed':'Allow to normalize a zipcode, removing non allowed characters','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08i 12'}]}]}; \ No newline at end of file From f7bd3060bdb91363e205955dbc33f3dc937539ff Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 12 Mar 2021 05:24:40 -0500 Subject: [PATCH 029/137] :zap: Add operation file:update to Google Drive node (#1523) * :zap: Add operation file:update to Google Drive node * :zap: Improvements * :zap: Small changes Co-authored-by: Jan Oberhauser --- .../nodes/Google/Drive/GoogleDrive.node.ts | 196 +++++++++++++++++- 1 file changed, 194 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts index d654e9fa76..14e58f3826 100644 --- a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts +++ b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts @@ -136,6 +136,11 @@ export class GoogleDrive implements INodeType { value: 'share', description: 'Share a file', }, + { + name: 'Update', + value: 'update', + description: 'Update a file', + }, { name: 'Upload', value: 'upload', @@ -205,7 +210,6 @@ export class GoogleDrive implements INodeType { description: 'The ID of the file to copy.', }, - // ---------------------------------- // file/folder:delete // ---------------------------------- @@ -710,7 +714,174 @@ export class GoogleDrive implements INodeType { placeholder: '', description: 'Name of the binary property which contains
the data for the file to be uploaded.', }, - + // ---------------------------------- + // file:update + // ---------------------------------- + { + displayName: 'ID', + name: 'fileId', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'file', + ], + }, + }, + description: 'The ID of the file to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'file', + ], + }, + }, + options: [ + { + displayName: 'Keep Revision Forever', + name: 'keepRevisionForever', + type: 'boolean', + default: false, + description: `Whether to set the 'keepForever' field in the new head revision.
+ his is only applicable to files with binary content in Google Drive.
+ Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.`, + }, + { + displayName: 'OCR Language', + name: 'ocrLanguage', + type: 'string', + default: '', + description: `A language hint for OCR processing during image import (ISO 639-1 code).`, + }, + { + displayName: 'Parent ID', + name: 'parentId', + type: 'string', + default: '', + description: `The ID of the parent to set.`, + }, + { + displayName: 'Use Content As Indexable Text', + name: 'useContentAsIndexableText', + type: 'boolean', + default: false, + description: `Whether to use the uploaded content as indexable text.`, + }, + ], + }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'file', + ], + }, + }, + options: [ + { + displayName: 'Fields', + name: 'fields', + type: 'multiOptions', + options: [ + { + name: '*', + value: '*', + description: 'All fields.', + }, + { + name: 'explicitlyTrashed', + value: 'explicitlyTrashed', + }, + { + name: 'exportLinks', + value: 'exportLinks', + }, + { + name: 'iconLink', + value: 'iconLink', + }, + { + name: 'hasThumbnail', + value: 'hasThumbnail', + }, + { + name: 'id', + value: 'id', + }, + { + name: 'kind', + value: 'kind', + }, + { + name: 'name', + value: 'name', + }, + { + name: 'mimeType', + value: 'mimeType', + }, + { + name: 'permissions', + value: 'permissions', + }, + { + name: 'shared', + value: 'shared', + }, + { + name: 'spaces', + value: 'spaces', + }, + { + name: 'starred', + value: 'starred', + }, + { + name: 'thumbnailLink', + value: 'thumbnailLink', + }, + { + name: 'trashed', + value: 'trashed', + }, + { + name: 'version', + value: 'version', + }, + { + name: 'webViewLink', + value: 'webViewLink', + }, + ], + required: true, + default: [], + description: 'The fields to return.', + }, + ], + }, // ---------------------------------- // file:upload // ---------------------------------- @@ -2032,6 +2203,27 @@ export class GoogleDrive implements INodeType { } returnData.push(response as IDataObject); + } else if (operation === 'update') { + // ---------------------------------- + // file:update + // ---------------------------------- + + const id = this.getNodeParameter('fileId', i) as string; + const updateFields = this.getNodeParameter('updateFields', i, {}) as IDataObject; + + const qs: IDataObject = { + supportsAllDrives: true, + }; + + Object.assign(qs, options); + + qs.fields = queryFields; + + if (updateFields.parentId && updateFields.parentId !== '') + qs.addParents = updateFields.parentId; + + const responseData = await googleApiRequest.call(this, 'PATCH', `/drive/v3/files/${id}`, {}, qs); + returnData.push(responseData as IDataObject); } } else if (resource === 'folder') { From ac4e4cd17df4a8828e6b0662bd4b43aca85e2174 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 12 Mar 2021 05:32:04 -0500 Subject: [PATCH 030/137] :zap: Add boadItem:move ooperation (Monday.com) (#1533) Thanks a lot. Got merged. --- .../nodes/MondayCom/BoardItemDescription.ts | 117 ++++++++++++++---- .../nodes/MondayCom/MondayCom.node.ts | 24 +++- 2 files changed, 115 insertions(+), 26 deletions(-) diff --git a/packages/nodes-base/nodes/MondayCom/BoardItemDescription.ts b/packages/nodes-base/nodes/MondayCom/BoardItemDescription.ts index 6bccd6dc38..7f17409585 100644 --- a/packages/nodes-base/nodes/MondayCom/BoardItemDescription.ts +++ b/packages/nodes-base/nodes/MondayCom/BoardItemDescription.ts @@ -55,6 +55,11 @@ export const boardItemOperations = [ value: 'getByColumnValue', description: 'Get items by column value', }, + { + name: 'Move', + value: 'move', + description: 'Move item to group', + }, ], default: 'create', description: 'The operation to perform.', @@ -63,9 +68,9 @@ export const boardItemOperations = [ export const boardItemFields = [ -/* -------------------------------------------------------------------------- */ -/* boardItem:addUpdate */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:addUpdate */ + /* -------------------------------------------------------------------------- */ { displayName: 'Item ID', name: 'itemId', @@ -102,9 +107,9 @@ export const boardItemFields = [ }, description: 'The update text to add.', }, -/* -------------------------------------------------------------------------- */ -/* boardItem:changeColumnValue */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:changeColumnValue */ + /* -------------------------------------------------------------------------- */ { displayName: 'Board ID', name: 'boardId', @@ -186,9 +191,9 @@ export const boardItemFields = [ }, description: 'The column value in JSON format. Documentation can be found here.', }, -/* -------------------------------------------------------------------------- */ -/* boardItem:changeMultipleColumnValues */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:changeMultipleColumnValues */ + /* -------------------------------------------------------------------------- */ { displayName: 'Board ID', name: 'boardId', @@ -249,9 +254,9 @@ export const boardItemFields = [ alwaysOpenEditWindow: true, }, }, -/* -------------------------------------------------------------------------- */ -/* boardItem:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Board ID', name: 'boardId', @@ -342,9 +347,9 @@ export const boardItemFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* boardItem:delete */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Item ID', name: 'itemId', @@ -363,9 +368,9 @@ export const boardItemFields = [ }, description: `Item's ID`, }, -/* -------------------------------------------------------------------------- */ -/* boardItem:get */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Item ID', name: 'itemId', @@ -384,9 +389,9 @@ export const boardItemFields = [ }, description: `Item's ID (Multiple can be added separated by comma)`, }, -/* -------------------------------------------------------------------------- */ -/* boardItem:getAll */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Board ID', name: 'boardId', @@ -471,9 +476,9 @@ export const boardItemFields = [ default: 50, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* boardItem:getByColumnValue */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* boardItem:getByColumnValue */ + /* -------------------------------------------------------------------------- */ { displayName: 'Board ID', name: 'boardId', @@ -578,4 +583,68 @@ export const boardItemFields = [ default: 50, description: 'How many results to return.', }, + /* -------------------------------------------------------------------------- */ + /* boardItem:move */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Board ID', + name: 'boardId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getBoards', + }, + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'boardItem', + ], + operation: [ + 'move', + ], + }, + }, + }, + { + displayName: 'Item ID', + name: 'itemId', + type: 'string', + required: true, + displayOptions: { + show: { + operation: [ + 'move', + ], + resource: [ + 'boardItem', + ], + }, + }, + default: '', + description: `The item's ID`, + }, + { + displayName: 'Group ID', + name: 'groupId', + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getGroups', + loadOptionsDependsOn: [ + 'boardId', + ], + }, + required: true, + displayOptions: { + show: { + resource: [ + 'boardItem', + ], + operation: [ + 'move', + ], + }, + }, + }, ] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts b/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts index b790df1b6c..413ca91531 100644 --- a/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts +++ b/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts @@ -38,7 +38,7 @@ import { import { snakeCase, - } from 'change-case'; +} from 'change-case'; interface IGraphqlBody { query: string; @@ -322,7 +322,7 @@ export class MondayCom implements INodeType { if (returnAll === true) { responseData = await mondayComApiRequestAllItems.call(this, 'data.boards', body); } else { - body.variables.limit = this.getNodeParameter('limit', i) as number; + body.variables.limit = this.getNodeParameter('limit', i) as number; responseData = await mondayComApiRequest.call(this, body); responseData = responseData.data.boards; } @@ -695,6 +695,26 @@ export class MondayCom implements INodeType { responseData = responseData.data.items_by_column_values; } } + if (operation === 'move') { + const groupId = this.getNodeParameter('groupId', i) as string; + const itemId = parseInt(this.getNodeParameter('itemId', i) as string, 10); + + const body: IGraphqlBody = { + query: + `mutation ($groupId: String!, $itemId: Int!) { + move_item_to_group (group_id: $groupId, item_id: $itemId) { + id + } + }`, + variables: { + groupId, + itemId, + }, + }; + + responseData = await mondayComApiRequest.call(this, body); + responseData = responseData.data.move_item_to_group; + } } if (Array.isArray(responseData)) { returnData.push.apply(returnData, responseData as IDataObject[]); From 8095c4a2643485bc5c6b678734dcfc20854019e0 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Fri, 12 Mar 2021 11:35:23 +0100 Subject: [PATCH 031/137] :zap: Add debug information for pending workflows on exit (#1536) --- packages/cli/commands/start.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cli/commands/start.ts b/packages/cli/commands/start.ts index 112e751df9..36cd9c4547 100644 --- a/packages/cli/commands/start.ts +++ b/packages/cli/commands/start.ts @@ -103,6 +103,9 @@ export class Start extends Command { while (executingWorkflows.length !== 0) { if (count++ % 4 === 0) { console.log(`Waiting for ${executingWorkflows.length} active executions to finish...`); + executingWorkflows.map(execution => { + console.log(` - Execution ID ${execution.id}, workflow ID: ${execution.workflowId}`); + }); } await new Promise((resolve) => { setTimeout(resolve, 500); From bae61fb40c283db8b65bde72e346af4ad2fe777d Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 11:45:50 +0100 Subject: [PATCH 032/137] :zap: Fix icon name --- packages/nodes-base/nodes/MongoDb/mongo.node.options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts b/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts index ec09998450..5fa8972c51 100644 --- a/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts +++ b/packages/nodes-base/nodes/MongoDb/mongo.node.options.ts @@ -8,7 +8,7 @@ import { export const nodeDescription: INodeTypeDescription = { displayName: 'MongoDB', name: 'mongoDb', - icon: 'file:mongoDb.svg', + icon: 'file:mongodb.svg', group: ['input'], version: 1, description: 'Find, insert and update documents in MongoDB.', From 8d9555bf52b8a239d233899c10f68ab18df9adc2 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 11:50:26 +0100 Subject: [PATCH 033/137] :construction_worker: No longer run tests in Node.js v10 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 348ae253e0..4beac42b36 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x] + node-version: [12.x, 14.x] steps: - uses: actions/checkout@v1 From e419d3ccbe5b502571c6368c1cfac598931596cd Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 11:51:35 +0100 Subject: [PATCH 034/137] :zap: Fix small issues --- packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts index 14e58f3826..01200aef01 100644 --- a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts +++ b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts @@ -2219,8 +2219,9 @@ export class GoogleDrive implements INodeType { qs.fields = queryFields; - if (updateFields.parentId && updateFields.parentId !== '') - qs.addParents = updateFields.parentId; + if (updateFields.parentId && updateFields.parentId !== '') { + qs.addParents = updateFields.parentId; + } const responseData = await googleApiRequest.call(this, 'PATCH', `/drive/v3/files/${id}`, {}, qs); returnData.push(responseData as IDataObject); From f77c74616f87e97ef50f66648ad9c5a560f3c694 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 12:36:44 +0100 Subject: [PATCH 035/137] :bookmark: Release n8n-nodes-base@0.108.0 --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 0a28bdc505..89b4bbc0cb 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "0.107.3", + "version": "0.108.0", "description": "Base nodes of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 98a4e200513394d39210f13347bf9d79ae9bc617 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 12:38:49 +0100 Subject: [PATCH 036/137] :bookmark: Release n8n-editor-ui@0.81.0 --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index ed8e38d452..fe2a26628a 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "0.80.0", + "version": "0.81.0", "description": "Workflow Editor UI for n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 8bbdf05e5186f53957cc275907e5e01c41bfdf9b Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 12:40:06 +0100 Subject: [PATCH 037/137] :arrow_up: Set n8n-editor-ui@0.81.0 and n8n-nodes-base@0.108.0 on n8n --- packages/cli/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 18e32adba0..aea590bf44 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -105,8 +105,8 @@ "lodash.get": "^4.4.2", "mysql2": "~2.1.0", "n8n-core": "~0.64.0", - "n8n-editor-ui": "~0.80.0", - "n8n-nodes-base": "~0.107.3", + "n8n-editor-ui": "~0.81.0", + "n8n-nodes-base": "~0.108.0", "n8n-workflow": "~0.53.0", "oauth-1.0a": "^2.2.6", "open": "^7.0.0", From 06dd4236482d345b1193b87b993c944b117698bd Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 12 Mar 2021 12:40:30 +0100 Subject: [PATCH 038/137] :bookmark: Release n8n@0.111.0 --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index aea590bf44..405dd78c49 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "0.110.3", + "version": "0.111.0", "description": "n8n Workflow Automation Tool", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 7c21e611512f18b6e60eac4976f833eeb971e380 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Tue, 16 Mar 2021 16:23:54 -0400 Subject: [PATCH 039/137] :bug: Reflect correctly Dropbox breaking change. (#1544) --- packages/cli/BREAKING-CHANGES.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/cli/BREAKING-CHANGES.md b/packages/cli/BREAKING-CHANGES.md index f3eca82a12..4eca7f0cc0 100644 --- a/packages/cli/BREAKING-CHANGES.md +++ b/packages/cli/BREAKING-CHANGES.md @@ -8,11 +8,16 @@ This list shows all the versions which include breaking changes and how to upgra In the Dropbox node, now all operations are performed relative to the user's root directory. ### When is action necessary? + +If you are using any resource/operation with OAuth2 authentication. + If you are using the `folder:list` operation with the parameter `Folder Path` empty (root path) and have a Team Space in your Dropbox account. ### How to upgrade: -Open the Dropbox node, go to the `folder:list` operation, and make sure your logic is taking into account the team folders in the response. +Open the Dropbox node, go to the OAuth2 credential you are using and reconnect it again. + +Also, if you are using the `folder:list` operation, make sure your logic is taking into account the team folders in the response. ## 0.105.0 From 3cb8cd115e3287d2b1599faab62bb417350a1e8c Mon Sep 17 00:00:00 2001 From: Craig McElroy Date: Wed, 17 Mar 2021 14:17:21 -0500 Subject: [PATCH 040/137] Salesforce Custom Object Get All : Fix TypeError: options.fields.split is not a function --- packages/nodes-base/nodes/Salesforce/GenericFunctions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts index dee94afbb6..c01af004b8 100644 --- a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts @@ -163,7 +163,7 @@ export function getDefaultFields(sobject: string) { export function getQuery(options: IDataObject, sobject: string, returnAll: boolean, limit = 0) { const fields: string[] = []; if (options.fields) { - fields.push.apply(fields, (options.fields as string).split(',')); + fields.push.apply(fields, options.fields.toString().split(',')); } else { fields.push.apply(fields, (getDefaultFields(sobject) as string || 'id').split(',')); } From 09d9e12db9534f272c8bbd9ed0f2a374e0cab180 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Wed, 17 Mar 2021 21:28:22 +0100 Subject: [PATCH 041/137] :bug: Fix issue with importing decrypted separate credentials #1546 --- packages/cli/commands/import/credentials.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/cli/commands/import/credentials.ts b/packages/cli/commands/import/credentials.ts index ff9421eb46..ed0da4e94b 100644 --- a/packages/cli/commands/import/credentials.ts +++ b/packages/cli/commands/import/credentials.ts @@ -56,10 +56,22 @@ export class ImportCredentialsCommand extends Command { try { await Db.init(); let i; + + const encryptionKey = await UserSettings.getEncryptionKey(); + if (encryptionKey === undefined) { + throw new Error('No encryption key got found to encrypt the credentials!'); + } + if (flags.separate) { const files = await glob((flags.input.endsWith(path.sep) ? flags.input : flags.input + path.sep) + '*.json'); for (i = 0; i < files.length; i++) { const credential = JSON.parse(fs.readFileSync(files[i], { encoding: 'utf8' })); + + if (typeof credential.data === 'object') { + // plain data / decrypted input. Should be encrypted first. + Credentials.prototype.setData.call(credential, credential.data, encryptionKey); + } + await Db.collections.Credentials!.save(credential); } } else { @@ -69,10 +81,6 @@ export class ImportCredentialsCommand extends Command { throw new Error(`File does not seem to contain credentials.`); } - const encryptionKey = await UserSettings.getEncryptionKey(); - if (encryptionKey === undefined) { - throw new Error('No encryption key got found to encrypt the credentials!'); - } for (i = 0; i < fileContents.length; i++) { if (typeof fileContents[i].data === 'object') { // plain data / decrypted input. Should be encrypted first. From 4bff3af058917c8aee8d27599ffb866ff0e5b3a3 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 18 Mar 2021 05:53:39 -0400 Subject: [PATCH 042/137] :bug: Fix issue with firstname when creating/updating a lead (#1545) --- packages/nodes-base/nodes/Salesforce/Salesforce.node.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts index f043c0fc94..031280d0b3 100644 --- a/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts +++ b/packages/nodes-base/nodes/Salesforce/Salesforce.node.ts @@ -906,8 +906,8 @@ export class Salesforce implements INodeType { if (additionalFields.industry !== undefined) { body.Industry = additionalFields.industry as string; } - if (additionalFields.firstName !== undefined) { - body.FirstName = additionalFields.firstName as string; + if (additionalFields.firstname !== undefined) { + body.FirstName = additionalFields.firstname as string; } if (additionalFields.leadSource !== undefined) { body.LeadSource = additionalFields.leadSource as string; @@ -942,7 +942,6 @@ export class Salesforce implements INodeType { } } } - responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/lead', body); } //https://developer.salesforce.com/docs/api-explorer/sobject/Lead/patch-lead-id @@ -998,8 +997,8 @@ export class Salesforce implements INodeType { if (updateFields.industry !== undefined) { body.Industry = updateFields.industry as string; } - if (updateFields.firstName !== undefined) { - body.FirstName = updateFields.firstName as string; + if (updateFields.firstname !== undefined) { + body.FirstName = updateFields.firstname as string; } if (updateFields.leadSource !== undefined) { body.LeadSource = updateFields.leadSource as string; From 40b76fd74644c1c6c1b4290357ca2b19aac6a60d Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 18 Mar 2021 11:02:00 +0100 Subject: [PATCH 043/137] :zap: Simplify code --- packages/nodes-base/nodes/Salesforce/GenericFunctions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts index c01af004b8..54b7b319d3 100644 --- a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts @@ -163,7 +163,7 @@ export function getDefaultFields(sobject: string) { export function getQuery(options: IDataObject, sobject: string, returnAll: boolean, limit = 0) { const fields: string[] = []; if (options.fields) { - fields.push.apply(fields, options.fields.toString().split(',')); + fields.push.apply(fields, options.fields as string[]); } else { fields.push.apply(fields, (getDefaultFields(sobject) as string || 'id').split(',')); } From c39504719a8ead68b956e3650e8de38ed4edfb7a Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 18 Mar 2021 07:27:19 -0400 Subject: [PATCH 044/137] :bug: Add credentials in the body to be able to refresh the access token (#1543) --- packages/nodes-base/nodes/Strava/GenericFunctions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Strava/GenericFunctions.ts b/packages/nodes-base/nodes/Strava/GenericFunctions.ts index 832ee3e652..8f21ac7f82 100644 --- a/packages/nodes-base/nodes/Strava/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Strava/GenericFunctions.ts @@ -45,7 +45,7 @@ export async function stravaApiRequest(this: IExecuteFunctions | IExecuteSingleF } else { //@ts-ignore - return await this.helpers.requestOAuth2.call(this, 'stravaOAuth2Api', options); + return await this.helpers.requestOAuth2.call(this, 'stravaOAuth2Api', options, { includeCredentialsOnRefreshOnBody: true }); } } catch (error) { From d56c3da3dd17a5cf3a218750dc73d06edf538049 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 18 Mar 2021 08:06:51 -0400 Subject: [PATCH 045/137] :zap: TheHive: Add Mark as Read operation to alerts (#1541) * :zap: Add Mark as Read operation to TheHive 4 Alerts * Remove version check from Mark as Read operation * Add Mark as Unread operation * Show Alert ID for markAsUnread operation * :zap: Add Ignore SSL Issues parameter to credentials * :zap: Add TheHive and Cortex SVG logos Co-authored-by: Mika Luhta <12100880+mluhta@users.noreply.github.com> --- .../credentials/TheHiveApi.credentials.ts | 6 +++++ .../nodes-base/nodes/Cortex/Cortex.node.ts | 2 +- packages/nodes-base/nodes/Cortex/cortex.png | Bin 837 -> 0 bytes packages/nodes-base/nodes/Cortex/cortex.svg | 1 + .../nodes/TheHive/GenericFunctions.ts | 1 + .../nodes-base/nodes/TheHive/TheHive.node.ts | 24 +++++++++++++++++- .../nodes/TheHive/TheHiveTrigger.node.ts | 2 +- .../TheHive/descriptions/AlertDescription.ts | 2 ++ packages/nodes-base/nodes/TheHive/thehive.png | Bin 819 -> 0 bytes packages/nodes-base/nodes/TheHive/thehive.svg | 1 + 10 files changed, 36 insertions(+), 3 deletions(-) delete mode 100644 packages/nodes-base/nodes/Cortex/cortex.png create mode 100644 packages/nodes-base/nodes/Cortex/cortex.svg delete mode 100644 packages/nodes-base/nodes/TheHive/thehive.png create mode 100644 packages/nodes-base/nodes/TheHive/thehive.svg diff --git a/packages/nodes-base/credentials/TheHiveApi.credentials.ts b/packages/nodes-base/credentials/TheHiveApi.credentials.ts index 19251ec588..0a3b415f56 100644 --- a/packages/nodes-base/credentials/TheHiveApi.credentials.ts +++ b/packages/nodes-base/credentials/TheHiveApi.credentials.ts @@ -41,5 +41,11 @@ export class TheHiveApi implements ICredentialType { }, ], }, + { + displayName: 'Ignore SSL Issues', + name: 'allowUnauthorizedCerts', + type: 'boolean' as NodePropertyTypes, + default: false, + }, ]; } diff --git a/packages/nodes-base/nodes/Cortex/Cortex.node.ts b/packages/nodes-base/nodes/Cortex/Cortex.node.ts index b759594146..eb20b23f2a 100644 --- a/packages/nodes-base/nodes/Cortex/Cortex.node.ts +++ b/packages/nodes-base/nodes/Cortex/Cortex.node.ts @@ -53,7 +53,7 @@ export class Cortex implements INodeType { description: INodeTypeDescription = { displayName: 'Cortex', name: 'cortex', - icon: 'file:cortex.png', + icon: 'file:cortex.svg', group: ['transform'], subtitle: '={{$parameter["resource"]+ ": " + $parameter["operation"]}}', version: 1, diff --git a/packages/nodes-base/nodes/Cortex/cortex.png b/packages/nodes-base/nodes/Cortex/cortex.png deleted file mode 100644 index e517928ed6c94a0679af185a1cd2497dd89f2021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmV-L1G@Z)P)f-r=B-6R*jKR^Hk!9de3lTkYP53&vJbMRZvNJ1Xrz|e`Wk`@3I zjs>i-`Z4D^){H;ehVBvs5S0)J@l#(Xg_6bZ#pmyw*oo12v2e?i4_epOw%Y z4`=WW^0?Fe;5WPsGh`myh0o?FI)iiR>GK&rtDuU~0_yyIOI5jsnfDcIKZUvSv(G04 zpi4uhN=31&fjoWOMhJ93M9$!^>8Lt+ZG#RNA_b`*p?cAr!8Jb6oU5zywhNJp(*vW@ zDP&sP`8MF0u}E`ZgqW{NZVF%og)?*>JD*`miCwo~F*^EEy@jES+VH@UA1<$!^doe_ zD0l)Rv2^;53E|y@G42aaqTA1^&3F3wNFVXJURvKz!aBJ9riYnQOJ>lm9ckIymK|K$ ze3>fRjxBZNjFiSmal53b_0$+oz{-b}d&g>VuAUh&+sZgjlZ0bcortex-logo \ No newline at end of file diff --git a/packages/nodes-base/nodes/TheHive/GenericFunctions.ts b/packages/nodes-base/nodes/TheHive/GenericFunctions.ts index 3e3e9ae4a3..4a64dd36bb 100644 --- a/packages/nodes-base/nodes/TheHive/GenericFunctions.ts +++ b/packages/nodes-base/nodes/TheHive/GenericFunctions.ts @@ -29,6 +29,7 @@ export async function theHiveApiRequest(this: IHookFunctions | IExecuteFunctions qs: query, uri: uri || `${credentials.url}/api${resource}`, body, + rejectUnauthorized: credentials.allowUnauthorizedCerts as boolean, json: true, }; diff --git a/packages/nodes-base/nodes/TheHive/TheHive.node.ts b/packages/nodes-base/nodes/TheHive/TheHive.node.ts index 72155b8044..b41a50c40a 100644 --- a/packages/nodes-base/nodes/TheHive/TheHive.node.ts +++ b/packages/nodes-base/nodes/TheHive/TheHive.node.ts @@ -67,7 +67,7 @@ export class TheHive implements INodeType { description: INodeTypeDescription = { displayName: 'TheHive', name: 'theHive', - icon: 'file:thehive.png', + icon: 'file:thehive.svg', group: ['transform'], subtitle: '={{$parameter["operation"]}} : {{$parameter["resource"]}}', version: 1, @@ -216,6 +216,8 @@ export class TheHive implements INodeType { { name: 'Execute Responder', value: 'executeResponder', description: 'Execute a responder on the specified alert' }, { name: 'Get', value: 'get', description: 'Get an alert' }, { name: 'Get All', value: 'getAll', description: 'Get all alerts' }, + { name: 'Mark as Read', value: 'markAsRead', description: 'Mark the alert as read' }, + { name: 'Mark as Unread', value: 'markAsUnread', description: 'Mark the alert as unread' }, { name: 'Merge', value: 'merge', description: 'Merge alert into an existing case' }, { name: 'Promote', value: 'promote', description: 'Promote an alert into a case' }, { name: 'Update', value: 'update', description: 'Update alert' }, @@ -535,6 +537,26 @@ export class TheHive implements INodeType { ); } + if (operation === 'markAsRead') { + const alertId = this.getNodeParameter('id', i) as string; + + responseData = await theHiveApiRequest.call( + this, + 'POST', + `/alert/${alertId}/markAsRead`, + ); + } + + if (operation === 'markAsUnread') { + const alertId = this.getNodeParameter('id', i) as string; + + responseData = await theHiveApiRequest.call( + this, + 'POST', + `/alert/${alertId}/markAsUnread`, + ); + } + if (operation === 'merge') { const alertId = this.getNodeParameter('id', i) as string; diff --git a/packages/nodes-base/nodes/TheHive/TheHiveTrigger.node.ts b/packages/nodes-base/nodes/TheHive/TheHiveTrigger.node.ts index 7618bab4e2..fcd211d12e 100644 --- a/packages/nodes-base/nodes/TheHive/TheHiveTrigger.node.ts +++ b/packages/nodes-base/nodes/TheHive/TheHiveTrigger.node.ts @@ -14,7 +14,7 @@ export class TheHiveTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'TheHive Trigger', name: 'theHiveTrigger', - icon: 'file:thehive.png', + icon: 'file:thehive.svg', group: ['trigger'], version: 1, description: 'Starts the workflow when a TheHive event occurs.', diff --git a/packages/nodes-base/nodes/TheHive/descriptions/AlertDescription.ts b/packages/nodes-base/nodes/TheHive/descriptions/AlertDescription.ts index 77ff3336c0..551c68ec02 100644 --- a/packages/nodes-base/nodes/TheHive/descriptions/AlertDescription.ts +++ b/packages/nodes-base/nodes/TheHive/descriptions/AlertDescription.ts @@ -82,6 +82,8 @@ export const alertFields = [ ], operation: [ 'promote', + 'markAsRead', + 'markAsUnread', 'merge', 'update', 'executeResponder', diff --git a/packages/nodes-base/nodes/TheHive/thehive.png b/packages/nodes-base/nodes/TheHive/thehive.png deleted file mode 100644 index a28fa90b5604ee81999ea8d408410f9ba0c25340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmV-31I+x1P)?5YyP`GRzBA^=GV01P z?8`8%mNs2eHdRbEww*Pkk2RNrH8e0aE-N)DCp6Z%GKF+DfpIo(Vm3)ZHYX)C-oP^( z95Z%kHa<8ty`(j!kTw4L!G-_;01tFhPE!C2`0wuKvaX7Fb5c?q2Joa~oB#jC8om5%2e~?V*+&$3tdJGy z;xTJXiIMlfjEEV5`Mhep&K@nFV@vXQ%?sDpeh2ez7p!*;%#KVjChfp{+-ogfEd30? z-om%F0i1PSwAP2S0A{6I0M-tC&KiKFufSwaNgIhNZN*?Gz(h=7OH(A;nJ_F#bWLWey+q4IKV$cRRu6VVVMgErEVb&J!13c%X zg~fY8xv-_b0b?Q^mWDe8mGbCVGK}MFb|9iY#$%j_=xV})JggvPNC6YJjRggsk)lYJ zN>nEh&2mo^Z8X_ZsbDm*J2o(U_)7tO0Y;T>Pprk)#fY_NqYc1xr3Yh9p);^p+-?@$ z#OJyEE~#g$MKktenOWE6m%%K$ZYO%^h*4DgSUcw$>IXA6G46+4Ov$(A*HGRCI9Z)E zFlPU6d?an;*LdE;84W&ZX3{sXNnc(+4&aESl_002ovPDHLkV1m%*W|{y1 diff --git a/packages/nodes-base/nodes/TheHive/thehive.svg b/packages/nodes-base/nodes/TheHive/thehive.svg new file mode 100644 index 0000000000..25ee988a32 --- /dev/null +++ b/packages/nodes-base/nodes/TheHive/thehive.svg @@ -0,0 +1 @@ +th-logo \ No newline at end of file From a3003dc273f90f1c4bc9650909b8046327aa5386 Mon Sep 17 00:00:00 2001 From: Mika Luhta <12100880+mluhta@users.noreply.github.com> Date: Thu, 18 Mar 2021 13:10:19 +0100 Subject: [PATCH 046/137] :bug: Fix TheHive Case resolution status (#1373) --- .../nodes/TheHive/descriptions/CaseDescription.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/nodes/TheHive/descriptions/CaseDescription.ts b/packages/nodes-base/nodes/TheHive/descriptions/CaseDescription.ts index 4ce4c5f051..1ff1aba4a6 100644 --- a/packages/nodes-base/nodes/TheHive/descriptions/CaseDescription.ts +++ b/packages/nodes-base/nodes/TheHive/descriptions/CaseDescription.ts @@ -422,12 +422,12 @@ export const caseFields = [ name: 'Indeterminate', }, { - value: 'False Positive', - name: 'FalsePositive', + value: 'FalsePositive', + name: 'False Positive', }, { - value: 'True Positive', - name: 'TruePositive', + value: 'TruePositive', + name: 'True Positive', }, { value: 'Other', From ddce679569d87986e277effa2c82571ce84ab387 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 18 Mar 2021 18:13:24 +0100 Subject: [PATCH 047/137] :zap: Minor changes to directories in binary data --- packages/core/src/NodeExecuteFunctions.ts | 4 +++- packages/editor-ui/src/components/RunData.vue | 4 ++-- packages/workflow/src/Interfaces.ts | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index ab431fb5cc..b65b102495 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -103,7 +103,9 @@ export async function prepareBinaryData(binaryData: Buffer, filePath?: string, m const filePathParts = path.parse(filePath as string); - returnData.dir = filePathParts.dir; + if (filePathParts.dir !== '') { + returnData.directory = filePathParts.dir; + } returnData.fileName = filePathParts.base; // Remove the dot diff --git a/packages/editor-ui/src/components/RunData.vue b/packages/editor-ui/src/components/RunData.vue index 43f2a528ae..bc338fa9dc 100644 --- a/packages/editor-ui/src/components/RunData.vue +++ b/packages/editor-ui/src/components/RunData.vue @@ -157,9 +157,9 @@
File Name:
{{binaryData.fileName}}
-
+
Directory:
-
{{binaryData.dir}}
+
{{binaryData.directory}}
File Extension:
diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 321b701284..6f22b903d6 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -9,7 +9,7 @@ export interface IBinaryData { data: string; mimeType: string; fileName?: string; - dir?: string; + directory?: string; fileExtension?: string; } From b879755f0b53183e65001c727f93a390db8a44b2 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Thu, 18 Mar 2021 23:24:57 +0100 Subject: [PATCH 048/137] :bug: Fix issues with subworkflows not finishing (#1553) --- packages/cli/src/WorkflowRunnerProcess.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/WorkflowRunnerProcess.ts b/packages/cli/src/WorkflowRunnerProcess.ts index f5305e29e8..70c140a7e3 100644 --- a/packages/cli/src/WorkflowRunnerProcess.ts +++ b/packages/cli/src/WorkflowRunnerProcess.ts @@ -121,7 +121,15 @@ export class WorkflowRunnerProcess { resolve(executionId); }; }); - const result: IRun = await executeWorkflowFunction(workflowInfo, additionalData, inputData, executionId, workflowData, runData); + let result: IRun; + try { + result = await executeWorkflowFunction(workflowInfo, additionalData, inputData, executionId, workflowData, runData); + } catch (e) { + await sendToParentProcess('finishExecution', { executionId }); + // Throw same error we had + throw e; + } + await sendToParentProcess('finishExecution', { executionId, result }); const returnData = WorkflowHelpers.getDataLastExecutedNodeData(result); From 30d83d0bc212516c6d3933db97aa7354a5340850 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Thu, 18 Mar 2021 23:34:15 +0100 Subject: [PATCH 049/137] :sparkles: Add DeepL Node (#1551) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Created the node for DeepL translator tool Still missing a few additional fields but functionality is ok for most cases. * Added optional fields for Deepl and separated description to a separate file * Fixed linting issue * :art: Replace PNG with SVG icon * :lipstick: Adjust style to codebase conventions * :hammer: Refactor types * :zap: Simplify error handling * :zap: Add always open edit window for text field * :pencil2: Edit descriptions in text operations * :zap: Fix source language for English EN-GB and EN-US are not supported as source languages, but EN is. * :lipstick: Apply cosmetic changes * :zap: Small improvement * :zap: Remove not needed Authentication selection Co-authored-by: Iván Ovejero Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../credentials/DeepLApi.credentials.ts | 15 ++ packages/nodes-base/nodes/DeepL/DeepL.node.ts | 131 ++++++++++++++++++ .../nodes/DeepL/GenericFunctions.ts | 62 +++++++++ .../nodes-base/nodes/DeepL/TextDescription.ts | 125 +++++++++++++++++ packages/nodes-base/nodes/DeepL/deepl.svg | 1 + packages/nodes-base/package.json | 2 + 6 files changed, 336 insertions(+) create mode 100644 packages/nodes-base/credentials/DeepLApi.credentials.ts create mode 100644 packages/nodes-base/nodes/DeepL/DeepL.node.ts create mode 100644 packages/nodes-base/nodes/DeepL/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/DeepL/TextDescription.ts create mode 100644 packages/nodes-base/nodes/DeepL/deepl.svg diff --git a/packages/nodes-base/credentials/DeepLApi.credentials.ts b/packages/nodes-base/credentials/DeepLApi.credentials.ts new file mode 100644 index 0000000000..fece90546b --- /dev/null +++ b/packages/nodes-base/credentials/DeepLApi.credentials.ts @@ -0,0 +1,15 @@ +import { ICredentialType, NodePropertyTypes } from 'n8n-workflow'; + +export class DeepLApi implements ICredentialType { + name = 'deepLApi'; + displayName = 'DeepL API'; + documentationUrl = 'deepL'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/DeepL/DeepL.node.ts b/packages/nodes-base/nodes/DeepL/DeepL.node.ts new file mode 100644 index 0000000000..2d82434f69 --- /dev/null +++ b/packages/nodes-base/nodes/DeepL/DeepL.node.ts @@ -0,0 +1,131 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeExecutionData, + INodePropertyOptions, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + deepLApiRequest, +} from './GenericFunctions'; + +import { + textOperations +} from './TextDescription'; + +export class DeepL implements INodeType { + description: INodeTypeDescription = { + displayName: 'DeepL', + name: 'deepL', + icon: 'file:deepl.svg', + group: ['input', 'output'], + version: 1, + description: 'Translate data using DeepL', + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + defaults: { + name: 'DeepL', + color: '#0f2b46', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'deepLApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Language', + value: 'language', + }, + ], + default: 'language', + }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'language', + ], + }, + }, + options: [ + { + name: 'Translate', + value: 'translate', + description: 'Translate data', + }, + ], + default: 'translate', + description: 'The operation to perform', + }, + ...textOperations, + ], + }; + + methods = { + loadOptions: { + async getLanguages(this: ILoadOptionsFunctions) { + const returnData: INodePropertyOptions[] = []; + const languages = await deepLApiRequest.call(this, 'GET', '/languages', {}, { type: 'target' }); + for (const language of languages) { + returnData.push({ + name: language.name, + value: language.language, + }); + } + return returnData; + }, + }, + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const length = items.length; + + const responseData = []; + + for (let i = 0; i < length; i++) { + + const resource = this.getNodeParameter('resource', i) as string; + const operation = this.getNodeParameter('operation', i) as string; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (resource === 'language') { + + if (operation === 'translate') { + + const text = this.getNodeParameter('text', i) as string; + const translateTo = this.getNodeParameter('translateTo', i) as string; + const qs = { target_lang: translateTo, text } as IDataObject; + + if (additionalFields.sourceLang !== undefined) { + qs.source_lang = ['EN-GB', 'EN-US'].includes(additionalFields.sourceLang as string) + ? 'EN' + : additionalFields.sourceLang; + } + + const response = await deepLApiRequest.call(this, 'GET', '/translate', {}, qs); + responseData.push(response.translations[0]); + } + } + } + + return [this.helpers.returnJsonArray(responseData)]; + } +} diff --git a/packages/nodes-base/nodes/DeepL/GenericFunctions.ts b/packages/nodes-base/nodes/DeepL/GenericFunctions.ts new file mode 100644 index 0000000000..7b8f9a1004 --- /dev/null +++ b/packages/nodes-base/nodes/DeepL/GenericFunctions.ts @@ -0,0 +1,62 @@ +import { + OptionsWithUri, +} from 'request'; + +import { + IExecuteFunctions, + IExecuteSingleFunctions, + ILoadOptionsFunctions, +} from 'n8n-core'; + +import { + IDataObject, +} from 'n8n-workflow'; + +export async function deepLApiRequest( + this: IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, + method: string, + resource: string, + body: IDataObject = {}, + qs: IDataObject = {}, + uri?: string, + headers: IDataObject = {}, +) { + + const options: OptionsWithUri = { + headers: { + 'Content-Type': 'application/json', + }, + method, + body, + qs, + uri: uri || `https://api.deepl.com/v2${resource}`, + json: true, + }; + + try { + if (Object.keys(headers).length !== 0) { + options.headers = Object.assign({}, options.headers, headers); + } + + if (Object.keys(body).length === 0) { + delete options.body; + } + + const credentials = this.getCredentials('deepLApi'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + options.qs.auth_key = credentials.apiKey; + + return await this.helpers.request!(options); + + } catch (error) { + if (error?.response?.body?.message) { + // Try to return the error prettier + throw new Error(`DeepL error response [${error.statusCode}]: ${error.response.body.message}`); + } + throw error; + } +} diff --git a/packages/nodes-base/nodes/DeepL/TextDescription.ts b/packages/nodes-base/nodes/DeepL/TextDescription.ts new file mode 100644 index 0000000000..7b2d1d5f1f --- /dev/null +++ b/packages/nodes-base/nodes/DeepL/TextDescription.ts @@ -0,0 +1,125 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const textOperations = [ + { + displayName: 'Text', + name: 'text', + type: 'string', + default: '', + description: 'Input text to translate.', + required: true, + typeOptions: { + alwaysOpenEditWindow: true, + }, + displayOptions: { + show: { + operation: [ + 'translate', + ], + }, + }, + }, + { + displayName: 'Target Language', + name: 'translateTo', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getLanguages', + }, + default: '', + description: 'Language to translate to.', + required: true, + displayOptions: { + show: { + operation: [ + 'translate', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + options: [ + { + displayName: 'Source Language', + name: 'sourceLang', + type: 'options', + default: '', + description: 'Language to translate from.', + typeOptions: { + loadOptionsMethod: 'getLanguages', + }, + }, + { + displayName: 'Split Sentences', + name: 'splitSentences', + type: 'options', + default: '1', + description: 'How the translation engine should split sentences.', + options: [ + { + name: 'Interpunction Only', + value: 'nonewlines', + description: 'Split text on interpunction only, ignoring newlines.', + }, + { + name: 'No Splitting', + value: '0', + description: 'Treat all text as a single sentence.', + }, + { + name: 'On Punctuation and Newlines', + value: '1', + description: 'Split text on interpunction and newlines.', + }, + ], + }, + { + displayName: 'Preserve Formatting', + name: 'preserveFormatting', + type: 'options', + default: '0', + description: 'Whether the translation engine should respect the original formatting, even if it would usually correct some aspects.', + options: [ + { + name: 'Apply corrections', + value: '0', + description: 'Fix punctuation at the beginning and end of sentences and fixes lower/upper caseing at the beginning.', + }, + { + name: 'Do not correct', + value: '1', + description: 'Keep text as similar as possible to the original.', + }, + ], + }, + { + displayName: 'Formality', + name: 'formality', + type: 'options', + default: 'default', + description: 'How formal or informal the target text should be. May not be supported with all languages.', + options: [ + { + name: 'Formal', + value: 'more', + }, + { + name: 'Informal', + value: 'less', + }, + { + name: 'Neutral', + value: 'default', + }, + ], + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/DeepL/deepl.svg b/packages/nodes-base/nodes/DeepL/deepl.svg new file mode 100644 index 0000000000..706dacab12 --- /dev/null +++ b/packages/nodes-base/nodes/DeepL/deepl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 89b4bbc0cb..5e1b5e04db 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -65,6 +65,7 @@ "dist/credentials/CustomerIoApi.credentials.js", "dist/credentials/S3.credentials.js", "dist/credentials/CrateDb.credentials.js", + "dist/credentials/DeepLApi.credentials.js", "dist/credentials/DemioApi.credentials.js", "dist/credentials/DiscourseApi.credentials.js", "dist/credentials/DisqusApi.credentials.js", @@ -319,6 +320,7 @@ "dist/nodes/CustomerIo/CustomerIo.node.js", "dist/nodes/CustomerIo/CustomerIoTrigger.node.js", "dist/nodes/DateTime.node.js", + "dist/nodes/DeepL/DeepL.node.js", "dist/nodes/Demio/Demio.node.js", "dist/nodes/Discord/Discord.node.js", "dist/nodes/Discourse/Discourse.node.js", From 53a20dddce29413d2505a5e11d05d55a04fbe52c Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Fri, 19 Mar 2021 15:18:35 +0100 Subject: [PATCH 050/137] :bug: Fix issue with subworkflows running on main process (#1557) --- packages/cli/src/WorkflowExecuteAdditionalData.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/WorkflowExecuteAdditionalData.ts index 562169980b..92f6a93afc 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/WorkflowExecuteAdditionalData.ts @@ -625,6 +625,7 @@ export async function executeWorkflow(workflowInfo: IExecuteWorkflowInfo, additi return returnData!.data!.main; } } else { + await ActiveExecutions.getInstance().remove(executionId, data); // Workflow did fail const error = new Error(data.data.resultData.error!.message); error.stack = data.data.resultData.error!.stack; From dfeb531cc0063ced2229597fb783db18d59df4d3 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Fri, 19 Mar 2021 17:32:43 +0100 Subject: [PATCH 051/137] :bug: Fix concurrency issues with subworkflows (#1558) --- packages/core/src/WorkflowExecute.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/WorkflowExecute.ts b/packages/core/src/WorkflowExecute.ts index 6e21781133..a71bc3bfa3 100644 --- a/packages/core/src/WorkflowExecute.ts +++ b/packages/core/src/WorkflowExecute.ts @@ -557,7 +557,7 @@ export class WorkflowExecute { executionData = this.runExecutionData.executionData!.nodeExecutionStack.shift() as IExecuteData; executionNode = executionData.node; - this.executeHook('nodeExecuteBefore', [executionNode.name]); + await this.executeHook('nodeExecuteBefore', [executionNode.name]); // Get the index of the current run runIndex = 0; @@ -722,7 +722,7 @@ export class WorkflowExecute { // Add the execution data again so that it can get restarted this.runExecutionData.executionData!.nodeExecutionStack.unshift(executionData); - this.executeHook('nodeExecuteAfter', [executionNode.name, taskData, this.runExecutionData]); + await this.executeHook('nodeExecuteAfter', [executionNode.name, taskData, this.runExecutionData]); break; } From ba4d848acc9ac2f9c4c38a677b53c8777beb3ef0 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 19 Mar 2021 12:35:38 -0400 Subject: [PATCH 052/137] :bug: Map CC addresses correctly (AWS SES) (#1559) --- .../nodes-base/nodes/Aws/SES/AwsSes.node.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts index a60b488ef8..58d77eb18c 100644 --- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts +++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts @@ -1125,15 +1125,9 @@ export class AwsSes implements INodeType { setParameter(params, 'Destination.BccAddresses.member', additionalFields.bccAddresses as string[]); } - if (additionalFields.ccAddressesUi) { - let ccAddresses = (additionalFields.ccAddressesUi as IDataObject).ccAddressesValues as string[]; - //@ts-ignore - ccAddresses = ccAddresses.map(o => o.address); - if (ccAddresses) { - setParameter(params, 'Destination.CcAddresses.member', ccAddresses); - } + if (additionalFields.ccAddresses) { + setParameter(params, 'Destination.CcAddresses.member', additionalFields.ccAddresses as string[]); } - responseData = await awsApiRequestSOAP.call(this, 'email', 'POST', '/?Action=SendEmail&' + params.join('&')); } @@ -1184,13 +1178,8 @@ export class AwsSes implements INodeType { setParameter(params, 'Destination.BccAddresses.member', additionalFields.bccAddresses as string[]); } - if (additionalFields.ccAddressesUi) { - let ccAddresses = (additionalFields.ccAddressesUi as IDataObject).ccAddressesValues as string[]; - //@ts-ignore - ccAddresses = ccAddresses.map(o => o.address); - if (ccAddresses) { - setParameter(params, 'Destination.CcAddresses.member', ccAddresses); - } + if (additionalFields.ccAddresses) { + setParameter(params, 'Destination.CcAddresses.member', additionalFields.ccAddresses as string[]); } if (templateDataUi) { From f91b58c5326b51423483562e0aa05d23e66d8e22 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:39:55 +0100 Subject: [PATCH 053/137] :bookmark: Release n8n-workflow@0.54.0 --- packages/workflow/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/workflow/package.json b/packages/workflow/package.json index 9f8ba67c86..b867b3f6b1 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -1,6 +1,6 @@ { "name": "n8n-workflow", - "version": "0.53.0", + "version": "0.54.0", "description": "Workflow base code of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 9510184d79f009dab95731cec4365ef6bdd18bab Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:40:37 +0100 Subject: [PATCH 054/137] :arrow_up: Set n8n-workflow@0.54.0 on n8n-core --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 7df6226f25..5a7a88cbce 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -47,7 +47,7 @@ "file-type": "^14.6.2", "lodash.get": "^4.4.2", "mime-types": "^2.1.27", - "n8n-workflow": "~0.53.0", + "n8n-workflow": "~0.54.0", "oauth-1.0a": "^2.2.6", "p-cancelable": "^2.0.0", "request": "^2.88.2", From 66caf31e2fc5709f9a34ff54aa9a321502b7fe0a Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:41:10 +0100 Subject: [PATCH 055/137] :bookmark: Release n8n-core@0.65.0 --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 5a7a88cbce..c7c2cfa639 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "n8n-core", - "version": "0.64.0", + "version": "0.65.0", "description": "Core functionality of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From f1b068166e187a013bc457fdb4c7a1775828cf7a Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:42:13 +0100 Subject: [PATCH 056/137] :arrow_up: Set n8n-core@0.65.0 and n8n-workflow@0.54.0 on n8n-nodes-base --- packages/nodes-base/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 5e1b5e04db..420536cd93 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -565,7 +565,7 @@ "@types/xml2js": "^0.4.3", "gulp": "^4.0.0", "jest": "^26.4.2", - "n8n-workflow": "~0.53.0", + "n8n-workflow": "~0.54.0", "ts-jest": "^26.3.0", "tslint": "^6.1.2", "typescript": "~3.9.7" @@ -601,7 +601,7 @@ "mqtt": "4.2.1", "mssql": "^6.2.0", "mysql2": "~2.1.0", - "n8n-core": "~0.64.0", + "n8n-core": "~0.65.0", "nodemailer": "^6.4.6", "pdf-parse": "^1.1.1", "pg": "^8.3.0", From 4352eb907c1bd1fa0079d2d190045421ef718fb4 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:42:46 +0100 Subject: [PATCH 057/137] :bookmark: Release n8n-nodes-base@0.109.0 --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 420536cd93..7660234d24 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "0.108.0", + "version": "0.109.0", "description": "Base nodes of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From c5eed228d89232bf4a146478430e4bdfc0c4991d Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:43:40 +0100 Subject: [PATCH 058/137] :arrow_up: Set n8n-workflow@0.54.0 on n8n-editor-ui --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index fe2a26628a..5b5a8fd5e3 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -65,7 +65,7 @@ "lodash.debounce": "^4.0.8", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", - "n8n-workflow": "~0.53.0", + "n8n-workflow": "~0.54.0", "node-sass": "^4.12.0", "normalize-wheel": "^1.0.1", "prismjs": "^1.17.1", From 9215d45436915333479411bfc71e4c1d880bb6f3 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:44:20 +0100 Subject: [PATCH 059/137] :bookmark: Release n8n-editor-ui@0.82.0 --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 5b5a8fd5e3..6bb68b5b68 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "0.81.0", + "version": "0.82.0", "description": "Workflow Editor UI for n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 5dbb8fb71c7e03339c96f9efc6847068451b0e4a Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:45:34 +0100 Subject: [PATCH 060/137] :arrow_up: Set n8n-core@0.65.0, n8n-editor-ui@0.82.0, n8n-nodes-base@0.109.0 and n8n-workflow@0.54.0 on n8n --- packages/cli/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 405dd78c49..e1199a8c83 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -104,10 +104,10 @@ "localtunnel": "^2.0.0", "lodash.get": "^4.4.2", "mysql2": "~2.1.0", - "n8n-core": "~0.64.0", - "n8n-editor-ui": "~0.81.0", - "n8n-nodes-base": "~0.108.0", - "n8n-workflow": "~0.53.0", + "n8n-core": "~0.65.0", + "n8n-editor-ui": "~0.82.0", + "n8n-nodes-base": "~0.109.0", + "n8n-workflow": "~0.54.0", "oauth-1.0a": "^2.2.6", "open": "^7.0.0", "pg": "^8.3.0", From 896ef33f4097eef188503ffdf4e355fedeac3065 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 19 Mar 2021 17:46:01 +0100 Subject: [PATCH 061/137] :bookmark: Release n8n@0.112.0 --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index e1199a8c83..5a4b37cf72 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "0.111.0", + "version": "0.112.0", "description": "n8n Workflow Automation Tool", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From e37b89df4ff6c6a3e7a3b57861ac0fb4851d01c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Sat, 20 Mar 2021 21:18:47 +0100 Subject: [PATCH 062/137] :zap: Fix pagination for retrieving user repos in GitHub node (#1554) * :zap: Fix pagination on user:getRepositories * :zap: Fix pagination on repository:getIssues * :pencil2: Fix typos and periods in descriptions * :zap: Minor improvement Co-authored-by: Jan Oberhauser --- .../nodes-base/nodes/Github/Github.node.ts | 175 ++++++++++++++---- 1 file changed, 136 insertions(+), 39 deletions(-) diff --git a/packages/nodes-base/nodes/Github/Github.node.ts b/packages/nodes-base/nodes/Github/Github.node.ts index e3f38a40f3..39aae86ee6 100644 --- a/packages/nodes-base/nodes/Github/Github.node.ts +++ b/packages/nodes-base/nodes/Github/Github.node.ts @@ -130,27 +130,27 @@ export class Github implements INodeType { { name: 'Create', value: 'create', - description: 'Create a new issue', + description: 'Create a new issue.', }, { name: 'Create Comment', value: 'createComment', - description: 'Create a new comment on an issue', + description: 'Create a new comment on an issue.', }, { name: 'Edit', value: 'edit', - description: 'Edit an issue', + description: 'Edit an issue.', }, { name: 'Get', value: 'get', - description: 'Get the data of a single issues', + description: 'Get the data of a single issue.', }, { name: 'Lock', value: 'lock', - description: 'Lock an issue', + description: 'Lock an issue.', }, ], default: 'create', @@ -172,22 +172,22 @@ export class Github implements INodeType { { name: 'Create', value: 'create', - description: 'Create a new file in repository', + description: 'Create a new file in repository.', }, { name: 'Delete', value: 'delete', - description: 'Delete a file in repository', + description: 'Delete a file in repository.', }, { name: 'Edit', value: 'edit', - description: 'Edit a file in repository', + description: 'Edit a file in repository.', }, { name: 'Get', value: 'get', - description: 'Get the data of a single issue', + description: 'Get the data of a single issue.', }, ], default: 'create', @@ -209,22 +209,22 @@ export class Github implements INodeType { { name: 'Get', value: 'get', - description: 'Get the data of a single repository', + description: 'Get the data of a single repository.', }, { name: 'Get License', value: 'getLicense', - description: 'Returns the contents of the repository\'s license file, if one is detected', + description: 'Returns the contents of the repository\'s license file, if one is detected.', }, { name: 'Get Issues', value: 'getIssues', - description: 'Returns issues of a repository', + description: 'Returns issues of a repository.', }, { name: 'Get Profile', value: 'getProfile', - description: 'Get the community profile of a repository with metrics, health score, description, license, ...', + description: 'Get the community profile of a repository with metrics, health score, description, license, etc.', }, { name: 'List Popular Paths', @@ -234,7 +234,7 @@ export class Github implements INodeType { { name: 'List Referrers', value: 'listReferrers', - description: 'Get the top 10 referrering domains over the last 14 days', + description: 'Get the top 10 referrering domains over the last 14 days.', }, ], default: 'getIssues', @@ -256,7 +256,7 @@ export class Github implements INodeType { { name: 'Get Repositories', value: 'getRepositories', - description: 'Returns the repositories of a user', + description: 'Returns the repositories of a user.', }, { name: 'Invite', @@ -283,7 +283,7 @@ export class Github implements INodeType { { name: 'Create', value: 'create', - description: 'Creates a new release', + description: 'Creates a new release.', }, ], default: 'create', @@ -305,22 +305,22 @@ export class Github implements INodeType { { name: 'Create', value: 'create', - description: 'Creates a new review', + description: 'Creates a new review.', }, { name: 'Get', value: 'get', - description: 'Get a review for a pull request', + description: 'Get a review for a pull request.', }, { name: 'Get All', value: 'getAll', - description: 'Get all reviews for a pull request', + description: 'Get all reviews for a pull request.', }, { name: 'Update', value: 'update', - description: 'Update a review', + description: 'Update a review.', }, ], default: 'create', @@ -815,12 +815,12 @@ export class Github implements INodeType { { name: 'Closed', value: 'closed', - description: 'Set the state to "closed"', + description: 'Set the state to "closed".', }, { name: 'Open', value: 'open', - description: 'Set the state to "open"', + description: 'Set the state to "open".', }, ], default: 'open', @@ -860,7 +860,7 @@ export class Github implements INodeType { name: 'assignee', type: 'string', default: '', - description: 'User to assign issue too.', + description: 'User to assign issue to.', }, ], }, @@ -1046,6 +1046,47 @@ export class Github implements INodeType { // ---------------------------------- // repository:getIssues // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'repository', + ], + operation: [ + 'getIssues', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'repository', + ], + operation: [ + 'getIssues', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 50, + description: 'How many results to return.', + }, { displayName: 'Filters', name: 'getRepositoryIssuesFilters', @@ -1108,17 +1149,17 @@ export class Github implements INodeType { { name: 'All', value: 'all', - description: 'Returns issues with any state', + description: 'Returns issues with any state.', }, { name: 'Closed', value: 'closed', - description: 'Return issues with "closed" state', + description: 'Return issues with "closed" state.', }, { name: 'Open', value: 'open', - description: 'Return issues with "open" state', + description: 'Return issues with "open" state.', }, ], default: 'open', @@ -1132,17 +1173,17 @@ export class Github implements INodeType { { name: 'Created', value: 'created', - description: 'Sort by created date', + description: 'Sort by created date.', }, { name: 'Updated', value: 'updated', - description: 'Sort by updated date', + description: 'Sort by updated date.', }, { name: 'Comments', value: 'comments', - description: 'Sort by comments', + description: 'Sort by comments.', }, ], default: 'created', @@ -1156,12 +1197,12 @@ export class Github implements INodeType { { name: 'Ascending', value: 'asc', - description: 'Sort in ascending order', + description: 'Sort in ascending order.', }, { name: 'Descending', value: 'desc', - description: 'Sort in descending order', + description: 'Sort in descending order.', }, ], default: 'desc', @@ -1214,7 +1255,7 @@ export class Github implements INodeType { ], }, }, - description: 'ID of the review', + description: 'ID of the review.', }, // ---------------------------------- @@ -1318,17 +1359,17 @@ export class Github implements INodeType { { name: 'Approve', value: 'approve', - description: 'Approve the pull request', + description: 'Approve the pull request.', }, { name: 'Request Change', value: 'requestChanges', - description: 'Request code changes', + description: 'Request code changes.', }, { name: 'Comment', value: 'comment', - description: 'Add a comment without approval or change requests', + description: 'Add a comment without approval or change requests.', }, { name: 'Pending', @@ -1386,7 +1427,7 @@ export class Github implements INodeType { name: 'commitId', type: 'string', default: '', - description: 'The SHA of the commit that needs a review, if different from the latest', + description: 'The SHA of the commit that needs a review, if different from the latest.', }, ], }, @@ -1414,6 +1455,50 @@ export class Github implements INodeType { description: 'The body of the review', }, // ---------------------------------- + // user:getRepositories + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'user', + ], + operation: [ + 'getRepositories', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'user', + ], + operation: [ + 'getRepositories', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 50, + description: 'How many results to return.', + }, + // ---------------------------------- // user:invite // ---------------------------------- { @@ -1736,6 +1821,12 @@ export class Github implements INodeType { qs = this.getNodeParameter('getRepositoryIssuesFilters', i) as IDataObject; endpoint = `/repos/${owner}/${repository}/issues`; + + returnAll = this.getNodeParameter('returnAll', 0) as boolean; + + if (returnAll === false) { + qs.per_page = this.getNodeParameter('limit', 0) as number; + } } } else if (resource === 'review') { if (operation === 'get') { @@ -1791,7 +1882,7 @@ export class Github implements INodeType { const reviewId = this.getNodeParameter('reviewId', i) as string; body.body = this.getNodeParameter('body', i) as string; - + endpoint = `/repos/${owner}/${repository}/pulls/${pullRequestNumber}/reviews/${reviewId}`; } } else if (resource === 'user') { @@ -1804,13 +1895,19 @@ export class Github implements INodeType { endpoint = `/users/${owner}/repos`; - } else if (operation === 'invite') { + returnAll = this.getNodeParameter('returnAll', 0) as boolean; + + if (returnAll === false) { + qs.per_page = this.getNodeParameter('limit', 0) as number; + } + + } else if (operation === 'invite') { // ---------------------------------- // invite // ---------------------------------- requestMethod = 'POST'; - const org = this.getNodeParameter('organization', i) as string; + const org = this.getNodeParameter('organization', i) as string; endpoint = `/orgs/${org}/invitations`; body.email = this.getNodeParameter('email', i) as string; From 9cec2a73c77a67ad4e4c404b9180c463dfbb0ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Sun, 21 Mar 2021 11:48:22 +0100 Subject: [PATCH 063/137] :sparkles: Fetch saved tracks in Spotify node (#1550) * :sparkles: Fetch saved tracks in Spotify node * Add library resource type to Spotify node * Add getUserTracks operation to Spotify node * Add user-library-read to Spotify credential scope * :bug: Fix bug in Spotify playlist remove item * No longer pass position 0 into request * :zap: Minor improvements Co-authored-by: Gerard Louw --- .../SpotifyOAuth2Api.credentials.ts | 2 +- .../nodes-base/nodes/Spotify/Spotify.node.ts | 90 +++++++++++++++++-- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/credentials/SpotifyOAuth2Api.credentials.ts b/packages/nodes-base/credentials/SpotifyOAuth2Api.credentials.ts index 4b37b08819..d2fc2c9054 100644 --- a/packages/nodes-base/credentials/SpotifyOAuth2Api.credentials.ts +++ b/packages/nodes-base/credentials/SpotifyOAuth2Api.credentials.ts @@ -36,7 +36,7 @@ export class SpotifyOAuth2Api implements ICredentialType { displayName: 'Scope', name: 'scope', type: 'hidden' as NodePropertyTypes, - default: 'user-read-playback-state playlist-read-collaborative user-modify-playback-state playlist-modify-public user-read-currently-playing playlist-read-private user-read-recently-played playlist-modify-private', + default: 'user-read-playback-state playlist-read-collaborative user-modify-playback-state playlist-modify-public user-read-currently-playing playlist-read-private user-read-recently-played playlist-modify-private user-library-read', }, { displayName: 'Auth URI Query Parameters', diff --git a/packages/nodes-base/nodes/Spotify/Spotify.node.ts b/packages/nodes-base/nodes/Spotify/Spotify.node.ts index 7bbcfedc96..762713bd2a 100644 --- a/packages/nodes-base/nodes/Spotify/Spotify.node.ts +++ b/packages/nodes-base/nodes/Spotify/Spotify.node.ts @@ -57,6 +57,10 @@ export class Spotify implements INodeType { name: 'Artist', value: 'artist', }, + { + name: 'Library', + value: 'library', + }, { name: 'Player', value: 'player', @@ -487,6 +491,30 @@ export class Spotify implements INodeType { placeholder: 'spotify:track:0xE4LEFzSNGsz1F6kvXsHU', description: `The track's Spotify URI or ID.`, }, + // -------------------------------------------------------------------------------------------------------- + // Library Operations + // Get liked tracks + // -------------------------------------------------------------------------------------------------------- + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'library', + ], + }, + }, + options: [ + { + name: 'Get Liked Tracks', + value: 'getLikedTracks', + description: `Get the user's liked tracks.`, + }, + ], + default: 'getLikedTracks', + }, { displayName: 'Return All', name: 'returnAll', @@ -498,6 +526,7 @@ export class Spotify implements INodeType { resource: [ 'album', 'artist', + 'library', 'playlist', ], operation: [ @@ -505,6 +534,7 @@ export class Spotify implements INodeType { 'getAlbums', 'getUserPlaylists', 'getNewReleases', + 'getLikedTracks', ], }, }, @@ -521,6 +551,7 @@ export class Spotify implements INodeType { resource: [ 'album', 'artist', + 'library', 'playlist', ], operation: [ @@ -528,6 +559,7 @@ export class Spotify implements INodeType { 'getAlbums', 'getUserPlaylists', 'getNewReleases', + 'getLikedTracks', ], returnAll: [ false, @@ -620,10 +652,12 @@ export class Spotify implements INodeType { returnAll = false; for (let i = 0; i < items.length; i++) { - // ----------------------------- - // Player Operations - // ----------------------------- if (resource === 'player') { + + // ----------------------------- + // Player Operations + // ----------------------------- + if (operation === 'pause') { requestMethod = 'PUT'; @@ -701,10 +735,12 @@ export class Spotify implements INodeType { responseData = { success: true }; } + + } else if (resource === 'album') { + // ----------------------------- // Album Operations // ----------------------------- - } else if (resource === 'album') { if (operation === 'get') { const uri = this.getNodeParameter('id', i) as string; @@ -763,10 +799,13 @@ export class Spotify implements INodeType { responseData = responseData.items; } } + + } else if (resource === 'artist') { + // ----------------------------- // Artist Operations // ----------------------------- - } else if (resource === 'artist') { + const uri = this.getNodeParameter('id', i) as string; const id = uri.replace('spotify:artist:', ''); @@ -790,6 +829,7 @@ export class Spotify implements INodeType { responseData = responseData.items; } + } else if (operation === 'getRelatedArtists') { endpoint = `/artists/${id}/related-artists`; @@ -819,10 +859,13 @@ export class Spotify implements INodeType { responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); } + + } else if (resource === 'playlist') { + // ----------------------------- // Playlist Operations // ----------------------------- - } else if (resource === 'playlist') { + if (['delete', 'get', 'getTracks', 'add'].includes(operation)) { const uri = this.getNodeParameter('id', i) as string; @@ -834,8 +877,7 @@ export class Spotify implements INodeType { body.tracks = [ { - uri: `${trackId}`, - positions: [0], + uri: trackId, }, ]; @@ -922,10 +964,12 @@ export class Spotify implements INodeType { responseData = await spotifyApiRequest.call(this, 'POST', '/me/playlists', body, qs); } + } else if (resource === 'track') { + // ----------------------------- // Track Operations // ----------------------------- - } else if (resource === 'track') { + const uri = this.getNodeParameter('id', i) as string; const id = uri.replace('spotify:track:', ''); @@ -939,6 +983,34 @@ export class Spotify implements INodeType { } responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); + + } else if (resource === 'library') { + + // ----------------------------- + // Library Operations + // ----------------------------- + + if (operation === 'getLikedTracks') { + requestMethod = 'GET'; + + endpoint = '/me/tracks'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + + propertyName = 'items'; + + if (!returnAll) { + const limit = this.getNodeParameter('limit', i) as number; + + qs = { + limit, + }; + + responseData = await spotifyApiRequest.call(this, requestMethod, endpoint, body, qs); + + responseData = responseData.items; + } + } } if (returnAll) { From 538d34510d74a60e96fce88bfb65e8e41e4d8325 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Sun, 21 Mar 2021 07:19:15 -0400 Subject: [PATCH 064/137] :zap: Add query parameter to operation issue:getAll (Sentry.io) (#1560) --- .../nodes/SentryIo/GenericFunctions.ts | 12 ++++++------ .../nodes/SentryIo/IssueDescription.ts | 7 +++++++ .../nodes-base/nodes/SentryIo/SentryIo.node.ts | 4 ++-- packages/nodes-base/nodes/SentryIo/sentryio.png | Bin 1305 -> 0 bytes packages/nodes-base/nodes/SentryIo/sentryio.svg | 1 + 5 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 packages/nodes-base/nodes/SentryIo/sentryio.png create mode 100644 packages/nodes-base/nodes/SentryIo/sentryio.svg diff --git a/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts b/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts index f318c44ba2..326c49d471 100644 --- a/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts +++ b/packages/nodes-base/nodes/SentryIo/GenericFunctions.ts @@ -1,6 +1,6 @@ import { OptionsWithUri - } from 'request'; +} from 'request'; import { IExecuteFunctions, @@ -24,7 +24,7 @@ export async function sentryIoApiRequest(this: IHookFunctions | IExecuteFunction method, qs, body, - uri: uri ||`https://sentry.io${resource}`, + uri: uri || `https://sentry.io${resource}`, json: true, }; if (!Object.keys(body).length) { @@ -73,7 +73,7 @@ export async function sentryIoApiRequest(this: IHookFunctions | IExecuteFunction } } -export async function sentryApiRequestAllItems(this: IHookFunctions | IExecuteFunctions| ILoadOptionsFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any +export async function sentryApiRequestAllItems(this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any const returnData: IDataObject[] = []; @@ -99,17 +99,17 @@ export async function sentryApiRequestAllItems(this: IHookFunctions | IExecuteFu } function getNext(link: string) { - if (link === undefined) { + if (link === undefined) { return; } const next = link.split(',')[1]; if (next.includes('rel="next"')) { - return next.split(';')[0].replace('<', '').replace('>','').trim(); + return next.split(';')[0].replace('<', '').replace('>', '').trim(); } } function hasMore(link: string) { - if (link === undefined) { + if (link === undefined) { return; } const next = link.split(',')[1]; diff --git a/packages/nodes-base/nodes/SentryIo/IssueDescription.ts b/packages/nodes-base/nodes/SentryIo/IssueDescription.ts index 37d9abbe7e..8ac624f7d3 100644 --- a/packages/nodes-base/nodes/SentryIo/IssueDescription.ts +++ b/packages/nodes-base/nodes/SentryIo/IssueDescription.ts @@ -171,6 +171,13 @@ export const issueFields = [ }, }, options: [ + { + displayName: 'Query', + name: 'query', + type: 'string', + default: '', + description: 'An optional Sentry structured search query. If not provided an implied "is:unresolved" is assumed. Info here.', + }, { displayName: 'Stats Period', name: 'statsPeriod', diff --git a/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts b/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts index 0e02a28522..f545683416 100644 --- a/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts +++ b/packages/nodes-base/nodes/SentryIo/SentryIo.node.ts @@ -56,14 +56,14 @@ export class SentryIo implements INodeType { description: INodeTypeDescription = { displayName: 'Sentry.io', name: 'sentryIo', - icon: 'file:sentryio.png', + icon: 'file:sentryio.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume Sentry.io API', defaults: { name: 'Sentry.io', - color: '#000000', + color: '#362d59', }, inputs: ['main'], outputs: ['main'], diff --git a/packages/nodes-base/nodes/SentryIo/sentryio.png b/packages/nodes-base/nodes/SentryIo/sentryio.png deleted file mode 100644 index a44ffc3ccd7bb8cfda8b82cc69576bf99541224a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1305 zcmb`H{Xf$Q0LQ<1C}h$k53?yM_A)nRNXpsbYTAjVO?k+rhCJMau<~$1ILp&K46$ov zp?MAq5z$6jE;`nbosNx>?6ihl{)hX#UZ2cbuoocijA+v>$4`v9WPrzX{yT90oB`C=>WipwA{V@x3_z|SltHHsVs%oE$-bsmx&S=c+?Ckj1cy3Pab#jE0 zqvPu8YEMs(`_FDIPg-i(wK37rr(J#$3WX1t%<$0ArNt%Dv}j~xq^ql|qrJVcp@H?V zvb3ZmEj9IOz!ki^JI?itL?W4)nVFoN?CUXSV)PD_4m7Uf#^l_Ja1!-;`8}D zE;lPPGydkS;WuyiLqpW8tRPaLSS-#+Pq+0yhxk5|eiYvA9PmXntgf<9R|C83Ox(w5 ztGpJ7K}+X7l?N_)0Dv+T>x}k1{ql8DaHPOWI}IzyVSZs3ApYJ739VQE5})F9R0p#! z_)lBu=BBPMXLd)Pzx6%wS|3<$z$PqFns<*3H4*u(tz3aXkg!ZiG!xA)=TF4YRKV25 z6LAYoXN_~UDY8A{duH6U`%??f<uVnE!HnKPP2Afgr6P%oDXVEFvK@`GYqbn~I^+GYypeX!YGU0ljqpK>f zCEA8)?_H*@;C>V^I$?;!YJGhvilpS7{)Ao0)O#9b8Czl(QgKzYm9Fv+OVX?wOP=p0 z2&OOEQ)^xKS&nMoFHnl9erHI&F-^Q2nk>su9HZSm@4_ zu5v0TDlb;85{`;Sj5cygtkuHW7*DLo7Oc<9y77SRwJgwCER(b{n1CtHFAZ)m(DU-) z7#H3w@}csIKXkm9j~xiheqMijw+(XJL;|v``^Y+_%7m`qUNPh6PKc zn)LZ_tuH)DP=s~RdQ3{!KqloEF7aFNmdc19@w-*ppqMk*_%bj$4vc`v+`PhfTEnvI z*CR?R`WXZ`eNrO9SrG&3Bl{etn@VLw*T;V77}DO{9pDi7+#b++8#@vrscQE(t)p9C z7-6v6=frrh22r%1^k_&mDDtCLTVV3rl@M~(?>+`6D=Xo=yD}Wl&V5&QO`~DC7M)x3 zt49XkEJX|TI)6Ffk;CYe*3%O{>MUg3_9onV!0@S4DTMR3p6Q>dAzn~(#o^x95?A>} zC4Nro9P43t;U{060ahb8z^a=qGVTYBT_W_@Lk9eOf~@#t2q+@u8TVzUs&XB56qSN>$kIrWB4?~h_nYV4>Qj{zt?H7n%%axjcNfEkPQPl=( zOd5{%tq#jG>4Q10RcyA5ZBhy-P7q&XyY{wcV>1Km#|-x-Bx;ZEnmE)UoMNEk+I61U xC_XV8C{21GA+7V4g;y8!_!#J&)*?(U{SXs4khKaB+_pXrz`D3O*JAvW{{!0Gp#T5? diff --git a/packages/nodes-base/nodes/SentryIo/sentryio.svg b/packages/nodes-base/nodes/SentryIo/sentryio.svg new file mode 100644 index 0000000000..11d971474b --- /dev/null +++ b/packages/nodes-base/nodes/SentryIo/sentryio.svg @@ -0,0 +1 @@ + \ No newline at end of file From dab82965a4d8f93b75a53c293ce18290df132fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Sun, 21 Mar 2021 12:39:06 +0100 Subject: [PATCH 065/137] :zap: Render empty array in variable selector (#1537) --- packages/editor-ui/src/components/VariableSelector.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/editor-ui/src/components/VariableSelector.vue b/packages/editor-ui/src/components/VariableSelector.vue index 2f782e0a7d..c4d031859a 100644 --- a/packages/editor-ui/src/components/VariableSelector.vue +++ b/packages/editor-ui/src/components/VariableSelector.vue @@ -114,6 +114,9 @@ export default mixins( // Has still options left so return inputData.options = this.sortOptions(newOptions); return inputData; + } else if (Array.isArray(newOptions) && newOptions.length === 0) { + delete inputData.options; + return inputData; } // Has no options left so remove return null; From 11fb97223c18d28f5919b564822cdf860128df1a Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Tue, 23 Mar 2021 17:42:38 +0100 Subject: [PATCH 066/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/JotForm/JotFormTrigger.node.ts | 2 +- packages/nodes-base/nodes/Webhook.node.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nodes-base/nodes/JotForm/JotFormTrigger.node.ts b/packages/nodes-base/nodes/JotForm/JotFormTrigger.node.ts index 755b2bd613..c379ce3254 100644 --- a/packages/nodes-base/nodes/JotForm/JotFormTrigger.node.ts +++ b/packages/nodes-base/nodes/JotForm/JotFormTrigger.node.ts @@ -167,7 +167,7 @@ export class JotFormTrigger implements INodeType { const resolveData = this.getNodeParameter('resolveData', false) as boolean; const onlyAnswers = this.getNodeParameter('onlyAnswers', false) as boolean; - const form = new formidable.IncomingForm(); + const form = new formidable.IncomingForm({}); return new Promise((resolve, reject) => { diff --git a/packages/nodes-base/nodes/Webhook.node.ts b/packages/nodes-base/nodes/Webhook.node.ts index 268a466246..351610fe70 100644 --- a/packages/nodes-base/nodes/Webhook.node.ts +++ b/packages/nodes-base/nodes/Webhook.node.ts @@ -404,7 +404,7 @@ export class Webhook implements INodeType { // @ts-ignore const mimeType = headers['content-type'] || 'application/json'; if (mimeType.includes('multipart/form-data')) { - const form = new formidable.IncomingForm(); + const form = new formidable.IncomingForm({}); return new Promise((resolve, reject) => { @@ -427,7 +427,7 @@ export class Webhook implements INodeType { binaryPropertyName = `${options.binaryPropertyName}${count}`; } - const fileJson = (files[file] as formidable.File).toJSON() as IDataObject; + const fileJson = (files[file] as formidable.File).toJSON() as unknown as IDataObject; const fileContent = await fs.promises.readFile((files[file] as formidable.File).path); returnItem.binary![binaryPropertyName] = await this.helpers.prepareBinaryData(Buffer.from(fileContent), fileJson.name as string, fileJson.type as string); From 726a99bf698a61d23d93d1636c4bca85d0dda789 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Tue, 23 Mar 2021 19:08:47 +0100 Subject: [PATCH 067/137] :sparkles: Add Activation Trigger (#1570) * :sparkles: n8n start trigger node * first declaration of WorkflowActivationMode * implement first WorkflowActivationMode: 'init', 'create', 'update', 'activate' * fix Server missing id * add activation infos to triggers * remove WorkflowActivationMode from webhook execution function * add some missing activation and add manual activation * clean up and fix some code * fix UnhandledPromiseRejectionWarning: Error: Overwrite NodeExecuteFunctions.getExecuteTriggerFunctions.emit function! * fix spaces * use a better name for the node * fix ident in package.json * Contributions to lublak's PR #1287 * Fixed linting issues and change the way parameters are displayed * :zap: Fix name and minor improvements Co-authored-by: lublak Co-authored-by: lublak <44057030+lublak@users.noreply.github.com> Co-authored-by: Jan Oberhauser --- packages/cli/src/ActiveWorkflowRunner.ts | 29 ++++---- packages/cli/src/Server.ts | 5 +- packages/cli/src/TestWebhooks.ts | 5 +- packages/core/src/ActiveWebhooks.ts | 9 ++- packages/core/src/ActiveWorkflows.ts | 14 ++-- packages/core/src/NodeExecuteFunctions.ts | 16 +++- .../nodes/ActivationTrigger.node.ts | 73 +++++++++++++++++++ packages/nodes-base/package.json | 1 + packages/workflow/src/Interfaces.ts | 10 ++- packages/workflow/src/Workflow.ts | 13 ++-- 10 files changed, 134 insertions(+), 41 deletions(-) create mode 100644 packages/nodes-base/nodes/ActivationTrigger.node.ts diff --git a/packages/cli/src/ActiveWorkflowRunner.ts b/packages/cli/src/ActiveWorkflowRunner.ts index 3b5ce249ef..3ab8c932ed 100644 --- a/packages/cli/src/ActiveWorkflowRunner.ts +++ b/packages/cli/src/ActiveWorkflowRunner.ts @@ -31,6 +31,7 @@ import { NodeHelpers, WebhookHttpMethod, Workflow, + WorkflowActivateMode, WorkflowExecuteMode, } from 'n8n-workflow'; @@ -66,7 +67,7 @@ export class ActiveWorkflowRunner { for (const workflowData of workflowsData) { console.log(` - ${workflowData.name}`); try { - await this.add(workflowData.id.toString(), workflowData); + await this.add(workflowData.id.toString(), 'init', workflowData); console.log(` => Started`); } catch (error) { console.log(` => ERROR: Workflow could not be activated:`); @@ -273,7 +274,7 @@ export class ActiveWorkflowRunner { * @returns {Promise} * @memberof ActiveWorkflowRunner */ - async addWorkflowWebhooks(workflow: Workflow, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode): Promise { + async addWorkflowWebhooks(workflow: Workflow, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise { const webhooks = WebhookHelpers.getWorkflowWebhooks(workflow, additionalData); let path = '' as string | undefined; @@ -319,10 +320,10 @@ export class ActiveWorkflowRunner { await Db.collections.Webhook?.insert(webhook); - const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, false); + const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, activation, false); if (webhookExists !== true) { // If webhook does not exist yet create it - await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, false); + await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, activation, false); } } catch (error) { @@ -378,7 +379,7 @@ export class ActiveWorkflowRunner { const webhooks = WebhookHelpers.getWorkflowWebhooks(workflow, additionalData); for (const webhookData of webhooks) { - await workflow.runWebhookMethod('delete', webhookData, NodeExecuteFunctions, mode, false); + await workflow.runWebhookMethod('delete', webhookData, NodeExecuteFunctions, mode, 'update', false); } await WorkflowHelpers.saveStaticData(workflow); @@ -446,9 +447,9 @@ export class ActiveWorkflowRunner { * @returns {IGetExecutePollFunctions} * @memberof ActiveWorkflowRunner */ - getExecutePollFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode): IGetExecutePollFunctions { + getExecutePollFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IGetExecutePollFunctions { return ((workflow: Workflow, node: INode) => { - const returnFunctions = NodeExecuteFunctions.getExecutePollFunctions(workflow, node, additionalData, mode); + const returnFunctions = NodeExecuteFunctions.getExecutePollFunctions(workflow, node, additionalData, mode, activation); returnFunctions.__emit = (data: INodeExecutionData[][]): void => { this.runWorkflow(workflowData, node, data, additionalData, mode); }; @@ -467,9 +468,9 @@ export class ActiveWorkflowRunner { * @returns {IGetExecuteTriggerFunctions} * @memberof ActiveWorkflowRunner */ - getExecuteTriggerFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode): IGetExecuteTriggerFunctions{ + getExecuteTriggerFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IGetExecuteTriggerFunctions{ return ((workflow: Workflow, node: INode) => { - const returnFunctions = NodeExecuteFunctions.getExecuteTriggerFunctions(workflow, node, additionalData, mode); + const returnFunctions = NodeExecuteFunctions.getExecuteTriggerFunctions(workflow, node, additionalData, mode, activation); returnFunctions.emit = (data: INodeExecutionData[][]): void => { WorkflowHelpers.saveStaticData(workflow); this.runWorkflow(workflowData, node, data, additionalData, mode).catch((err) => console.error(err)); @@ -486,7 +487,7 @@ export class ActiveWorkflowRunner { * @returns {Promise} * @memberof ActiveWorkflowRunner */ - async add(workflowId: string, workflowData?: IWorkflowDb): Promise { + async add(workflowId: string, activation: WorkflowActivateMode, workflowData?: IWorkflowDb): Promise { if (this.activeWorkflows === null) { throw new Error(`The "activeWorkflows" instance did not get initialized yet.`); } @@ -511,15 +512,15 @@ export class ActiveWorkflowRunner { const mode = 'trigger'; const credentials = await WorkflowCredentials(workflowData.nodes); const additionalData = await WorkflowExecuteAdditionalData.getBase(credentials); - const getTriggerFunctions = this.getExecuteTriggerFunctions(workflowData, additionalData, mode); - const getPollFunctions = this.getExecutePollFunctions(workflowData, additionalData, mode); + const getTriggerFunctions = this.getExecuteTriggerFunctions(workflowData, additionalData, mode, activation); + const getPollFunctions = this.getExecutePollFunctions(workflowData, additionalData, mode, activation); // Add the workflows which have webhooks defined - await this.addWorkflowWebhooks(workflowInstance, additionalData, mode); + await this.addWorkflowWebhooks(workflowInstance, additionalData, mode, activation); if (workflowInstance.getTriggerNodes().length !== 0 || workflowInstance.getPollNodes().length !== 0) { - await this.activeWorkflows.add(workflowId, workflowInstance, additionalData, getTriggerFunctions, getPollFunctions); + await this.activeWorkflows.add(workflowId, workflowInstance, additionalData, mode, activation, getTriggerFunctions, getPollFunctions); } if (this.activationErrors[workflowId] !== undefined) { diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index 187fccb340..2e68824f62 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -624,7 +624,7 @@ class App { try { await this.externalHooks.run('workflow.activate', [responseData]); - await this.activeWorkflowRunner.add(id); + await this.activeWorkflowRunner.add(id, isActive ? 'update' : 'activate'); } catch (error) { // If workflow could not be activated set it again to inactive newWorkflowData.active = false; @@ -670,6 +670,7 @@ class App { const startNodes: string[] | undefined = req.body.startNodes; const destinationNode: string | undefined = req.body.destinationNode; const executionMode = 'manual'; + const activationMode = 'manual'; const sessionId = GenericHelpers.getSessionId(req); @@ -679,7 +680,7 @@ class App { const additionalData = await WorkflowExecuteAdditionalData.getBase(credentials); const nodeTypes = NodeTypes(); const workflowInstance = new Workflow({ id: workflowData.id, name: workflowData.name, nodes: workflowData.nodes, connections: workflowData.connections, active: false, nodeTypes, staticData: undefined, settings: workflowData.settings }); - const needsWebhook = await this.testWebhooks.needsWebhookData(workflowData, workflowInstance, additionalData, executionMode, sessionId, destinationNode); + const needsWebhook = await this.testWebhooks.needsWebhookData(workflowData, workflowInstance, additionalData, executionMode, activationMode, sessionId, destinationNode); if (needsWebhook === true) { return { waitingForWebhook: true, diff --git a/packages/cli/src/TestWebhooks.ts b/packages/cli/src/TestWebhooks.ts index e5caef9d93..b9dcf09fcb 100644 --- a/packages/cli/src/TestWebhooks.ts +++ b/packages/cli/src/TestWebhooks.ts @@ -17,6 +17,7 @@ import { IWorkflowExecuteAdditionalData, WebhookHttpMethod, Workflow, + WorkflowActivateMode, WorkflowExecuteMode, } from 'n8n-workflow'; @@ -161,7 +162,7 @@ export class TestWebhooks { * @returns {(Promise)} * @memberof TestWebhooks */ - async needsWebhookData(workflowData: IWorkflowDb, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, sessionId?: string, destinationNode?: string): Promise { + async needsWebhookData(workflowData: IWorkflowDb, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode, sessionId?: string, destinationNode?: string): Promise { const webhooks = WebhookHelpers.getWorkflowWebhooks(workflow, additionalData, destinationNode); if (webhooks.length === 0) { @@ -193,7 +194,7 @@ export class TestWebhooks { }; try { - await this.activeWebhooks!.add(workflow, webhookData, mode); + await this.activeWebhooks!.add(workflow, webhookData, mode, activation); } catch (error) { activatedKey.forEach(deleteKey => delete this.testWebhookData[deleteKey] ); await this.activeWebhooks!.removeWorkflow(workflow); diff --git a/packages/core/src/ActiveWebhooks.ts b/packages/core/src/ActiveWebhooks.ts index 86a1c0f690..95b7f9dc3c 100644 --- a/packages/core/src/ActiveWebhooks.ts +++ b/packages/core/src/ActiveWebhooks.ts @@ -2,6 +2,7 @@ import { IWebhookData, WebhookHttpMethod, Workflow, + WorkflowActivateMode, WorkflowExecuteMode, } from 'n8n-workflow'; @@ -30,7 +31,7 @@ export class ActiveWebhooks { * @returns {Promise} * @memberof ActiveWebhooks */ - async add(workflow: Workflow, webhookData: IWebhookData, mode: WorkflowExecuteMode): Promise { + async add(workflow: Workflow, webhookData: IWebhookData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise { if (workflow.id === undefined) { throw new Error('Webhooks can only be added for saved workflows as an id is needed!'); } @@ -57,10 +58,10 @@ export class ActiveWebhooks { this.webhookUrls[webhookKey].push(webhookData); try { - const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, this.testWebhooks); + const webhookExists = await workflow.runWebhookMethod('checkExists', webhookData, NodeExecuteFunctions, mode, activation, this.testWebhooks); if (webhookExists !== true) { // If webhook does not exist yet create it - await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, this.testWebhooks); + await workflow.runWebhookMethod('create', webhookData, NodeExecuteFunctions, mode, activation, this.testWebhooks); } } catch (error) { @@ -183,7 +184,7 @@ export class ActiveWebhooks { // Go through all the registered webhooks of the workflow and remove them for (const webhookData of webhooks) { - await workflow.runWebhookMethod('delete', webhookData, NodeExecuteFunctions, mode, this.testWebhooks); + await workflow.runWebhookMethod('delete', webhookData, NodeExecuteFunctions, mode, 'update', this.testWebhooks); delete this.webhookUrls[this.getWebhookKey(webhookData.httpMethod, webhookData.path, webhookData.webhookId)]; } diff --git a/packages/core/src/ActiveWorkflows.ts b/packages/core/src/ActiveWorkflows.ts index 86a88c617b..320e9fa73f 100644 --- a/packages/core/src/ActiveWorkflows.ts +++ b/packages/core/src/ActiveWorkflows.ts @@ -8,6 +8,8 @@ import { ITriggerResponse, IWorkflowExecuteAdditionalData, Workflow, + WorkflowActivateMode, + WorkflowExecuteMode, } from 'n8n-workflow'; import { @@ -66,14 +68,14 @@ export class ActiveWorkflows { * @returns {Promise} * @memberof ActiveWorkflows */ - async add(id: string, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, getTriggerFunctions: IGetExecuteTriggerFunctions, getPollFunctions: IGetExecutePollFunctions): Promise { + async add(id: string, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode, getTriggerFunctions: IGetExecuteTriggerFunctions, getPollFunctions: IGetExecutePollFunctions): Promise { this.workflowData[id] = {}; const triggerNodes = workflow.getTriggerNodes(); let triggerResponse: ITriggerResponse | undefined; this.workflowData[id].triggerResponses = []; for (const triggerNode of triggerNodes) { - triggerResponse = await workflow.runTrigger(triggerNode, getTriggerFunctions, additionalData, 'trigger'); + triggerResponse = await workflow.runTrigger(triggerNode, getTriggerFunctions, additionalData, mode, activation); if (triggerResponse !== undefined) { // If a response was given save it this.workflowData[id].triggerResponses!.push(triggerResponse); @@ -84,7 +86,7 @@ export class ActiveWorkflows { if (pollNodes.length) { this.workflowData[id].pollResponses = []; for (const pollNode of pollNodes) { - this.workflowData[id].pollResponses!.push(await this.activatePolling(pollNode, workflow, additionalData, getPollFunctions)); + this.workflowData[id].pollResponses!.push(await this.activatePolling(pollNode, workflow, additionalData, getPollFunctions, mode, activation)); } } } @@ -100,10 +102,8 @@ export class ActiveWorkflows { * @returns {Promise} * @memberof ActiveWorkflows */ - async activatePolling(node: INode, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, getPollFunctions: IGetExecutePollFunctions): Promise { - const mode = 'trigger'; - - const pollFunctions = getPollFunctions(workflow, node, additionalData, mode); + async activatePolling(node: INode, workflow: Workflow, additionalData: IWorkflowExecuteAdditionalData, getPollFunctions: IGetExecutePollFunctions, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise { + const pollFunctions = getPollFunctions(workflow, node, additionalData, mode, activation); const pollTimes = pollFunctions.getNodeParameter('pollTimes') as unknown as { item: ITriggerTime[]; diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index b65b102495..2646fbb7b7 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -34,6 +34,7 @@ import { NodeHelpers, NodeParameterValue, Workflow, + WorkflowActivateMode, WorkflowDataProxy, WorkflowExecuteMode, } from 'n8n-workflow'; @@ -535,7 +536,7 @@ export function getWorkflowMetadata(workflow: Workflow): IWorkflowMetadata { * @returns {ITriggerFunctions} */ // TODO: Check if I can get rid of: additionalData, and so then maybe also at ActiveWorkflowRunner.add -export function getExecutePollFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode): IPollFunctions { +export function getExecutePollFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IPollFunctions { return ((workflow: Workflow, node: INode) => { return { __emit: (data: INodeExecutionData[][]): void => { @@ -547,6 +548,9 @@ export function getExecutePollFunctions(workflow: Workflow, node: INode, additio getMode: (): WorkflowExecuteMode => { return mode; }, + getActivationMode: (): WorkflowActivateMode => { + return activation; + }, getNode: () => { return getNode(node); }, @@ -598,7 +602,7 @@ export function getExecutePollFunctions(workflow: Workflow, node: INode, additio * @returns {ITriggerFunctions} */ // TODO: Check if I can get rid of: additionalData, and so then maybe also at ActiveWorkflowRunner.add -export function getExecuteTriggerFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode): ITriggerFunctions { +export function getExecuteTriggerFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): ITriggerFunctions { return ((workflow: Workflow, node: INode) => { return { emit: (data: INodeExecutionData[][]): void => { @@ -613,6 +617,9 @@ export function getExecuteTriggerFunctions(workflow: Workflow, node: INode, addi getMode: (): WorkflowExecuteMode => { return mode; }, + getActivationMode: (): WorkflowActivateMode => { + return activation; + }, getNodeParameter: (parameterName: string, fallbackValue?: any): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | object => { //tslint:disable-line:no-any const runExecutionData: IRunExecutionData | null = null; const itemIndex = 0; @@ -910,7 +917,7 @@ export function getLoadOptionsFunctions(workflow: Workflow, node: INode, additio * @param {WorkflowExecuteMode} mode * @returns {IHookFunctions} */ -export function getExecuteHookFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, isTest?: boolean, webhookData?: IWebhookData): IHookFunctions { +export function getExecuteHookFunctions(workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode, isTest?: boolean, webhookData?: IWebhookData): IHookFunctions { return ((workflow: Workflow, node: INode) => { const that = { getCredentials(type: string): ICredentialDataDecryptedObject | undefined { @@ -919,6 +926,9 @@ export function getExecuteHookFunctions(workflow: Workflow, node: INode, additio getMode: (): WorkflowExecuteMode => { return mode; }, + getActivationMode: (): WorkflowActivateMode => { + return activation; + }, getNode: () => { return getNode(node); }, diff --git a/packages/nodes-base/nodes/ActivationTrigger.node.ts b/packages/nodes-base/nodes/ActivationTrigger.node.ts new file mode 100644 index 0000000000..83c656ade1 --- /dev/null +++ b/packages/nodes-base/nodes/ActivationTrigger.node.ts @@ -0,0 +1,73 @@ +import { ITriggerFunctions } from 'n8n-core'; +import { + INodeType, + INodeTypeDescription, + ITriggerResponse, +} from 'n8n-workflow'; + +export class ActivationTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'Activation Trigger', + name: 'activationTrigger', + icon: 'fa:play-circle', + group: ['trigger'], + version: 1, + description: 'Executes whenever the workflow becomes active.', + defaults: { + name: 'Activation Trigger', + color: '#00e000', + }, + inputs: [], + outputs: ['main'], + properties: [ + { + displayName: 'Events', + name: 'events', + type: 'multiOptions', + required: true, + default: [], + description: 'Specifies under which conditions an execution should happen:
' + + '- Activation: Workflow gets activated
' + + '- Update: Workflow gets saved while active
' + + '- Start: n8n starts or restarts', + options: [ + { + name: 'Activation', + value: 'activate', + description: 'Run when workflow gets activated', + }, + { + name: 'Start', + value: 'init', + description: 'Run when n8n starts or restarts', + }, + { + name: 'Update', + value: 'update', + description: 'Run when workflow gets saved while it is active', + }, + ], + }, + ], + }; + + + async trigger(this: ITriggerFunctions): Promise { + const events = this.getNodeParameter('events', []) as string[]; + + const activationMode = this.getActivationMode(); + + if (events.includes(activationMode)) { + this.emit([this.helpers.returnJsonArray([{ activation: activationMode }])]); + } + + const self = this; + async function manualTriggerFunction() { + self.emit([self.helpers.returnJsonArray([{ activation: 'manual' }])]); + } + + return { + manualTriggerFunction, + }; + } +} diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 7660234d24..cafa140270 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -264,6 +264,7 @@ "dist/credentials/ZulipApi.credentials.js" ], "nodes": [ + "dist/nodes/ActivationTrigger.node.js", "dist/nodes/ActiveCampaign/ActiveCampaign.node.js", "dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js", "dist/nodes/AgileCrm/AgileCrm.node.js", diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 6f22b903d6..b57837379e 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -165,11 +165,11 @@ export interface IDataObject { export interface IGetExecutePollFunctions { - (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode): IPollFunctions; + (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IPollFunctions; } export interface IGetExecuteTriggerFunctions { - (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode): ITriggerFunctions; + (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): ITriggerFunctions; } @@ -184,7 +184,7 @@ export interface IGetExecuteSingleFunctions { export interface IGetExecuteHookFunctions { - (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, isTest?: boolean, webhookData?: IWebhookData): IHookFunctions; + (workflow: Workflow, node: INode, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode, isTest?: boolean, webhookData?: IWebhookData): IHookFunctions; } @@ -271,6 +271,7 @@ export interface ILoadOptionsFunctions { export interface IHookFunctions { getCredentials(type: string): ICredentialDataDecryptedObject | undefined; getMode(): WorkflowExecuteMode; + getActivationMode(): WorkflowActivateMode; getNode(): INode; getNodeWebhookUrl: (name: string) => string | undefined; getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | object; //tslint:disable-line:no-any @@ -288,6 +289,7 @@ export interface IPollFunctions { __emit(data: INodeExecutionData[][]): void; getCredentials(type: string): ICredentialDataDecryptedObject | undefined; getMode(): WorkflowExecuteMode; + getActivationMode(): WorkflowActivateMode; getNode(): INode; getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | object; //tslint:disable-line:no-any getRestApiUrl(): string; @@ -303,6 +305,7 @@ export interface ITriggerFunctions { emit(data: INodeExecutionData[][]): void; getCredentials(type: string): ICredentialDataDecryptedObject | undefined; getMode(): WorkflowExecuteMode; + getActivationMode(): WorkflowActivateMode; getNode(): INode; getNodeParameter(parameterName: string, fallbackValue?: any): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | object; //tslint:disable-line:no-any getRestApiUrl(): string; @@ -750,6 +753,7 @@ export interface IWorkflowExecuteAdditionalData { } export type WorkflowExecuteMode = 'cli' | 'error' | 'integrated' | 'internal' | 'manual' | 'retry' | 'trigger' | 'webhook'; +export type WorkflowActivateMode = 'init' | 'create' | 'update' | 'activate' | 'manual'; export interface IWorkflowHooksOptionalParameters { parentProcessMode?: string; diff --git a/packages/workflow/src/Workflow.ts b/packages/workflow/src/Workflow.ts index d221ba28de..026fa80086 100644 --- a/packages/workflow/src/Workflow.ts +++ b/packages/workflow/src/Workflow.ts @@ -24,6 +24,7 @@ import { NodeParameterValue, ObservableObject, WebhookSetupMethodNames, + WorkflowActivateMode, WorkflowExecuteMode, } from './'; @@ -769,7 +770,7 @@ export class Workflow { * @returns {(Promise)} * @memberof Workflow */ - async runWebhookMethod(method: WebhookSetupMethodNames, webhookData: IWebhookData, nodeExecuteFunctions: INodeExecuteFunctions, mode: WorkflowExecuteMode, isTest?: boolean): Promise { + async runWebhookMethod(method: WebhookSetupMethodNames, webhookData: IWebhookData, nodeExecuteFunctions: INodeExecuteFunctions, mode: WorkflowExecuteMode, activation: WorkflowActivateMode, isTest?: boolean): Promise { const node = this.getNode(webhookData.node) as INode; const nodeType = this.nodeTypes.getByName(node.type) as INodeType; @@ -786,7 +787,7 @@ export class Workflow { return; } - const thisArgs = nodeExecuteFunctions.getExecuteHookFunctions(this, node, webhookData.workflowExecuteAdditionalData, mode, isTest, webhookData); + const thisArgs = nodeExecuteFunctions.getExecuteHookFunctions(this, node, webhookData.workflowExecuteAdditionalData, mode, activation, isTest, webhookData); return nodeType.webhookMethods[webhookData.webhookDescription.name][method]!.call(thisArgs); } @@ -802,8 +803,8 @@ export class Workflow { * @returns {(Promise)} * @memberof Workflow */ - async runTrigger(node: INode, getTriggerFunctions: IGetExecuteTriggerFunctions, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode): Promise { - const triggerFunctions = getTriggerFunctions(this, node, additionalData, mode); + async runTrigger(node: INode, getTriggerFunctions: IGetExecuteTriggerFunctions, additionalData: IWorkflowExecuteAdditionalData, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise { + const triggerFunctions = getTriggerFunctions(this, node, additionalData, mode, activation); const nodeType = this.nodeTypes.getByName(node.type); @@ -982,7 +983,7 @@ export class Workflow { } else if (nodeType.poll) { if (mode === 'manual') { // In manual mode run the poll function - const thisArgs = nodeExecuteFunctions.getExecutePollFunctions(this, node, additionalData, mode); + const thisArgs = nodeExecuteFunctions.getExecutePollFunctions(this, node, additionalData, mode, 'manual'); return nodeType.poll.call(thisArgs); } else { // In any other mode pass data through as it already contains the result of the poll @@ -991,7 +992,7 @@ export class Workflow { } else if (nodeType.trigger) { if (mode === 'manual') { // In manual mode start the trigger - const triggerResponse = await this.runTrigger(node, nodeExecuteFunctions.getExecuteTriggerFunctions, additionalData, mode); + const triggerResponse = await this.runTrigger(node, nodeExecuteFunctions.getExecuteTriggerFunctions, additionalData, mode, 'manual'); if (triggerResponse === undefined) { return null; From cdcbc3d256c2774fbb76c7a4ffc5b1a31cc4def0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 23 Mar 2021 23:49:08 +0100 Subject: [PATCH 068/137] :sparkles: Add Plivo Node (#1563) * add Plivo Node * fixed package.json * added Git user in CLI to validate CLA * :art: Replace PNG with SVG icon * :zap: Ajust per codebase conventions * :hammer: Fix operation ID * :pencil2: Specify geo-restriction for MMS * :zap: Improvements * :zap: Fix node name and operation order Co-authored-by: Nixon Co-authored-by: Nixon Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../credentials/PlivoApi.credentials.ts | 24 +++ .../nodes-base/nodes/Plivo/CallDescription.ts | 117 ++++++++++++ .../nodes/Plivo/GenericFunctions.ts | 62 ++++++ .../nodes-base/nodes/Plivo/MmsDescription.ts | 107 +++++++++++ .../nodes-base/nodes/Plivo/Plivo.node.json | 21 +++ packages/nodes-base/nodes/Plivo/Plivo.node.ts | 178 ++++++++++++++++++ .../nodes-base/nodes/Plivo/SmsDescription.ts | 89 +++++++++ packages/nodes-base/nodes/Plivo/plivo.svg | 15 ++ packages/nodes-base/package.json | 2 + 9 files changed, 615 insertions(+) create mode 100644 packages/nodes-base/credentials/PlivoApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Plivo/CallDescription.ts create mode 100644 packages/nodes-base/nodes/Plivo/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Plivo/MmsDescription.ts create mode 100644 packages/nodes-base/nodes/Plivo/Plivo.node.json create mode 100644 packages/nodes-base/nodes/Plivo/Plivo.node.ts create mode 100644 packages/nodes-base/nodes/Plivo/SmsDescription.ts create mode 100644 packages/nodes-base/nodes/Plivo/plivo.svg diff --git a/packages/nodes-base/credentials/PlivoApi.credentials.ts b/packages/nodes-base/credentials/PlivoApi.credentials.ts new file mode 100644 index 0000000000..c07162b283 --- /dev/null +++ b/packages/nodes-base/credentials/PlivoApi.credentials.ts @@ -0,0 +1,24 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class PlivoApi implements ICredentialType { + name = 'plivoApi'; + displayName = 'Plivo API'; + documentationUrl = 'plivo'; + properties = [ + { + displayName: 'Auth ID', + name: 'authId', + type: 'string' as NodePropertyTypes, + default: '', + }, + { + displayName: 'Auth Token', + name: 'authToken', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Plivo/CallDescription.ts b/packages/nodes-base/nodes/Plivo/CallDescription.ts new file mode 100644 index 0000000000..7db6e2e19f --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/CallDescription.ts @@ -0,0 +1,117 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const callOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'call', + ], + }, + }, + options: [ + { + name: 'Make', + value: 'make', + description: 'Make a voice call', + }, + ], + default: 'make', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const callFields = [ + // ---------------------------------- + // call: make + // ---------------------------------- + { + displayName: 'From', + name: 'from', + type: 'string', + default: '', + placeholder: '+14156667777', + description: 'Caller ID for the call to make.', + required: true, + displayOptions: { + show: { + resource: [ + 'call', + ], + operation: [ + 'make', + ], + }, + }, + }, + { + displayName: 'To', + name: 'to', + type: 'string', + default: '', + placeholder: '+14156667778', + required: true, + description: 'Phone number to make the call to.', + displayOptions: { + show: { + resource: [ + 'call', + ], + operation: [ + 'make', + ], + }, + }, + }, + { + displayName: 'Answer Method', + name: 'answer_method', + type: 'options', + required: true, + description: 'HTTP verb to be used when invoking the Answer URL.', + default: 'POST', + options: [ + { + name: 'GET', + value: 'GET', + }, + { + name: 'POST', + value: 'POST', + }, + ], + displayOptions: { + show: { + resource: [ + 'call', + ], + operation: [ + 'make', + ], + }, + }, + }, + { + displayName: 'Answer URL', + name: 'answer_url', + type: 'string', + default: '', + description: 'URL to be invoked by Plivo once the call is answered.
It should return the XML to handle the call once answered.', + required: true, + displayOptions: { + show: { + resource: [ + 'call', + ], + operation: [ + 'make', + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Plivo/GenericFunctions.ts b/packages/nodes-base/nodes/Plivo/GenericFunctions.ts new file mode 100644 index 0000000000..6af3a48acd --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/GenericFunctions.ts @@ -0,0 +1,62 @@ +import { + IExecuteFunctions, + IHookFunctions, +} from 'n8n-core'; + +import { + IDataObject, +} from 'n8n-workflow'; + +/** + * Make an API request to Plivo. + * + * @param {IHookFunctions} this + * @param {string} method + * @param {string} url + * @param {object} body + * @returns {Promise} + */ +export async function plivoApiRequest( + this: IHookFunctions | IExecuteFunctions, + method: string, + endpoint: string, + body: IDataObject = {}, + qs: IDataObject = {}, +) { + + const credentials = this.getCredentials('plivoApi') as { authId: string, authToken: string }; + + if (!credentials) { + throw new Error('No credentials returned!'); + } + + const options = { + method, + form: body, + qs, + uri: `https://api.plivo.com/v1/Account/${credentials.authId}${endpoint}/`, + auth: { + user: credentials.authId, + pass: credentials.authToken, + }, + json: true, + }; + + try { + return await this.helpers.request(options); + } catch (error) { + if (error.statusCode === 401) { + throw new Error('Invalid Plivo credentials'); + } + if (error?.response?.body?.error) { + let errorMessage = `Plivo error response [${error.statusCode}]: ${error.response.body.error}`; + if (error.response.body.more_info) { + errorMessage = `errorMessage (${error.response.body.more_info})`; + } + + throw new Error(errorMessage); + } + + throw error; + } +} diff --git a/packages/nodes-base/nodes/Plivo/MmsDescription.ts b/packages/nodes-base/nodes/Plivo/MmsDescription.ts new file mode 100644 index 0000000000..398ae5f182 --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/MmsDescription.ts @@ -0,0 +1,107 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const mmsOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'mms', + ], + }, + }, + options: [ + { + name: 'Send', + value: 'send', + description: 'Send an MMS message (US/Canada only)', + }, + ], + default: 'send', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const mmsFields = [ + // ---------------------------------- + // mms: send + // ---------------------------------- + { + displayName: 'From', + name: 'from', + type: 'string', + default: '', + description: 'Plivo Number to send the MMS from.', + placeholder: '+14156667777', + required: true, + displayOptions: { + show: { + resource: [ + 'mms', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'To', + name: 'to', + type: 'string', + default: '', + description: 'Phone number to send the MMS to.', + placeholder: '+14156667778', + required: true, + displayOptions: { + show: { + operation: [ + 'send', + ], + resource: [ + 'mms', + ], + }, + }, + }, + { + displayName: 'Message', + name: 'message', + type: 'string', + default: '', + description: 'Message to send.', + required: false, + displayOptions: { + show: { + resource: [ + 'mms', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'Media URLs', + name: 'media_urls', + type: 'string', + default: '', + required: false, + displayOptions: { + show: { + resource: [ + 'mms', + ], + operation: [ + 'send', + ], + }, + }, + description: 'Comma-separated list of media URLs of the files from your file server.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Plivo/Plivo.node.json b/packages/nodes-base/nodes/Plivo/Plivo.node.json new file mode 100644 index 0000000000..64e49874aa --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/Plivo.node.json @@ -0,0 +1,21 @@ +{ + "node": "n8n-nodes-base.plivo", + "nodeVersion": "1.0", + "codexVersion": "1.0", + "categories": [ + "Communication", + "Development" + ], + "resources": { + "credentialDocumentation": [ + { + "url": "https://docs.n8n.io/credentials/plivo" + } + ], + "primaryDocumentation": [ + { + "url": "https://docs.n8n.io/nodes/n8n-nodes-base.plivo/" + } + ] + } +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/Plivo/Plivo.node.ts b/packages/nodes-base/nodes/Plivo/Plivo.node.ts new file mode 100644 index 0000000000..3436c601f3 --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/Plivo.node.ts @@ -0,0 +1,178 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + INodeExecutionData, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + smsFields, + smsOperations, +} from './SmsDescription'; + +import { + mmsFields, + mmsOperations, +} from './MmsDescription'; + +import { + callFields, + callOperations, +} from './CallDescription'; + +import { + plivoApiRequest, +} from './GenericFunctions'; + +export class Plivo implements INodeType { + description: INodeTypeDescription = { + displayName: 'Plivo', + name: 'plivo', + icon: 'file:plivo.svg', + group: ['transform'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Send SMS/MMS messages or make phone calls', + defaults: { + name: 'plivo', + color: '#43A046', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'plivoApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Call', + value: 'call', + }, + { + name: 'MMS', + value: 'mms', + }, + { + name: 'SMS', + value: 'sms', + }, + ], + default: 'sms', + required: true, + description: 'The resource to operate on.', + }, + ...smsOperations, + ...smsFields, + ...mmsOperations, + ...mmsFields, + ...callOperations, + ...callFields, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + + for (let i = 0; i < items.length; i++) { + + let responseData; + + if (resource === 'sms') { + + // ********************************************************************* + // sms + // ********************************************************************* + + if (operation === 'send') { + + // ---------------------------------- + // sms: send + // ---------------------------------- + + const body = { + src: this.getNodeParameter('from', i) as string, + dst: this.getNodeParameter('to', i) as string, + text: this.getNodeParameter('message', i) as string, + } as IDataObject; + + responseData = await plivoApiRequest.call(this, 'POST', '/Message', body); + + } + + } else if (resource === 'call') { + + // ********************************************************************* + // call + // ********************************************************************* + + if (operation === 'make') { + + // ---------------------------------- + // call: make + // ---------------------------------- + + // https://www.plivo.com/docs/voice/api/call#make-a-call + + const body = { + from: this.getNodeParameter('from', i) as string, + to: this.getNodeParameter('to', i) as string, + answer_url: this.getNodeParameter('answer_url', i) as string, + answer_method: this.getNodeParameter('answer_method', i) as string, + } as IDataObject; + + responseData = await plivoApiRequest.call(this, 'POST', '/Call', body); + + } + + } else if (resource === 'mms') { + + // ********************************************************************* + // mms + // ********************************************************************* + + if (operation === 'send') { + + // ---------------------------------- + // mss: send + // ---------------------------------- + + // https://www.plivo.com/docs/sms/api/message#send-a-message + + const body = { + src: this.getNodeParameter('from', i) as string, + dst: this.getNodeParameter('to', i) as string, + text: this.getNodeParameter('message', i) as string, + type: 'mms', + media_urls: this.getNodeParameter('media_urls', i) as string, + } as IDataObject; + + responseData = await plivoApiRequest.call(this, 'POST', '/Message', body); + + } + + } + + Array.isArray(responseData) + ? returnData.push(...responseData) + : returnData.push(responseData); + + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Plivo/SmsDescription.ts b/packages/nodes-base/nodes/Plivo/SmsDescription.ts new file mode 100644 index 0000000000..ef1774fb93 --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/SmsDescription.ts @@ -0,0 +1,89 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const smsOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'sms', + ], + }, + }, + options: [ + { + name: 'Send', + value: 'send', + description: 'Send an SMS message.', + }, + ], + default: 'send', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const smsFields = [ + // ---------------------------------- + // sms: send + // ---------------------------------- + { + displayName: 'From', + name: 'from', + type: 'string', + default: '', + description: 'Plivo Number to send the SMS from.', + placeholder: '+14156667777', + required: true, + displayOptions: { + show: { + resource: [ + 'sms', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'To', + name: 'to', + type: 'string', + default: '', + description: 'Phone number to send the message to.', + placeholder: '+14156667778', + required: true, + displayOptions: { + show: { + resource: [ + 'sms', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'Message', + name: 'message', + type: 'string', + default: '', + description: 'Message to send.', + required: true, + displayOptions: { + show: { + operation: [ + 'send', + ], + resource: [ + 'sms', + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Plivo/plivo.svg b/packages/nodes-base/nodes/Plivo/plivo.svg new file mode 100644 index 0000000000..445ddb2563 --- /dev/null +++ b/packages/nodes-base/nodes/Plivo/plivo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index cafa140270..b4317f1f93 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -178,6 +178,7 @@ "dist/credentials/PipedriveApi.credentials.js", "dist/credentials/PipedriveOAuth2Api.credentials.js", "dist/credentials/PhilipsHueOAuth2Api.credentials.js", + "dist/credentials/PlivoApi.credentials.js", "dist/credentials/Postgres.credentials.js", "dist/credentials/PostHogApi.credentials.js", "dist/credentials/PostmarkApi.credentials.js", @@ -444,6 +445,7 @@ "dist/nodes/Pipedrive/Pipedrive.node.js", "dist/nodes/Pipedrive/PipedriveTrigger.node.js", "dist/nodes/PhilipsHue/PhilipsHue.node.js", + "dist/nodes/Plivo/Plivo.node.js", "dist/nodes/Postgres/Postgres.node.js", "dist/nodes/PostHog/PostHog.node.js", "dist/nodes/Postmark/PostmarkTrigger.node.js", From 9957c81f1378504cc3e8189afe6e4cc1bdad955f Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Tue, 23 Mar 2021 23:50:55 +0100 Subject: [PATCH 069/137] :zap: Revert wrong "fix" of node name --- packages/nodes-base/nodes/Plivo/Plivo.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Plivo/Plivo.node.ts b/packages/nodes-base/nodes/Plivo/Plivo.node.ts index 3436c601f3..3a7623ea14 100644 --- a/packages/nodes-base/nodes/Plivo/Plivo.node.ts +++ b/packages/nodes-base/nodes/Plivo/Plivo.node.ts @@ -38,7 +38,7 @@ export class Plivo implements INodeType { subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Send SMS/MMS messages or make phone calls', defaults: { - name: 'plivo', + name: 'Plivo', color: '#43A046', }, inputs: ['main'], From 00e7edea85f42ad3246725f86039d09d351df53e Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Tue, 23 Mar 2021 19:20:48 -0400 Subject: [PATCH 070/137] * :bug: Fix autocomplete API uri on Clearbit (#1565) * :bug: Fix autocomplete API uri * :zap: Improvements * :zap: Minor improvements Co-authored-by: dali Co-authored-by: Jan Oberhauser --- .../nodes/Clearbit/Clearbit.node.ts | 10 +++- .../nodes/Clearbit/CompanyDescription.ts | 55 +++++++++--------- .../nodes/Clearbit/GenericFunctions.ts | 14 +++-- .../nodes/Clearbit/PersonDescription.ts | 6 +- .../nodes-base/nodes/Clearbit/clearbit.png | Bin 634 -> 0 bytes .../nodes-base/nodes/Clearbit/clearbit.svg | 21 +++++++ 6 files changed, 69 insertions(+), 37 deletions(-) delete mode 100644 packages/nodes-base/nodes/Clearbit/clearbit.png create mode 100644 packages/nodes-base/nodes/Clearbit/clearbit.svg diff --git a/packages/nodes-base/nodes/Clearbit/Clearbit.node.ts b/packages/nodes-base/nodes/Clearbit/Clearbit.node.ts index ba28e8d71e..2d5820c18b 100644 --- a/packages/nodes-base/nodes/Clearbit/Clearbit.node.ts +++ b/packages/nodes-base/nodes/Clearbit/Clearbit.node.ts @@ -1,19 +1,23 @@ import { IExecuteFunctions, } from 'n8n-core'; + import { IDataObject, INodeExecutionData, INodeType, INodeTypeDescription, } from 'n8n-workflow'; + import { clearbitApiRequest, } from './GenericFunctions'; + import { companyFields, companyOperations, } from './CompanyDescription'; + import { personFields, personOperations, @@ -23,7 +27,7 @@ export class Clearbit implements INodeType { description: INodeTypeDescription = { displayName: 'Clearbit', name: 'clearbit', - icon: 'file:clearbit.png', + icon: 'file:clearbit.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ":" + $parameter["resource"]}}', @@ -109,7 +113,7 @@ export class Clearbit implements INodeType { if (additionalFields.facebook) { qs.facebook = additionalFields.facebook as string; } - responseData = await clearbitApiRequest.call(this, 'GET', resource, '/v2/people/find', {}, qs); + responseData = await clearbitApiRequest.call(this, 'GET', `${resource}-stream`, '/v2/people/find', {}, qs); } } if (resource === 'company') { @@ -129,7 +133,7 @@ export class Clearbit implements INodeType { if (additionalFields.facebook) { qs.facebook = additionalFields.facebook as string; } - responseData = await clearbitApiRequest.call(this, 'GET', resource, '/v2/companies/find', {}, qs); + responseData = await clearbitApiRequest.call(this, 'GET', `${resource}-stream`, '/v2/companies/find', {}, qs); } if (operation === 'autocomplete') { const name = this.getNodeParameter('name', i) as string; diff --git a/packages/nodes-base/nodes/Clearbit/CompanyDescription.ts b/packages/nodes-base/nodes/Clearbit/CompanyDescription.ts index 2ccc3c287b..0737208b0f 100644 --- a/packages/nodes-base/nodes/Clearbit/CompanyDescription.ts +++ b/packages/nodes-base/nodes/Clearbit/CompanyDescription.ts @@ -13,16 +13,16 @@ export const companyOperations = [ }, }, options: [ - { - name: 'Enrich', - value: 'enrich', - description: 'Look up person and company data based on an email or domain', - }, { name: 'Autocomplete', value: 'autocomplete', description: 'Auto-complete company names and retrieve logo and domain', }, + { + name: 'Enrich', + value: 'enrich', + description: 'Look up person and company data based on an email or domain', + }, ], default: 'enrich', description: 'The operation to perform.', @@ -31,9 +31,9 @@ export const companyOperations = [ export const companyFields = [ -/* -------------------------------------------------------------------------- */ -/* company:enrich */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* company:enrich */ + /* -------------------------------------------------------------------------- */ { displayName: 'Domain', name: 'domain', @@ -99,25 +99,26 @@ export const companyFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* company:autocomplete */ -/* -------------------------------------------------------------------------- */ -{ - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - resource: [ - 'company', - ], - operation: [ - 'autocomplete', - ], + + /* -------------------------------------------------------------------------- */ + /* company:autocomplete */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'autocomplete', + ], + }, }, + description: 'Name is the partial name of the company.', }, - description: 'Name is the partial name of the company.', -}, ] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Clearbit/GenericFunctions.ts b/packages/nodes-base/nodes/Clearbit/GenericFunctions.ts index 4251bd4a2f..e22d0e607e 100644 --- a/packages/nodes-base/nodes/Clearbit/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Clearbit/GenericFunctions.ts @@ -1,11 +1,17 @@ -import { OptionsWithUri } from 'request'; +import { + OptionsWithUri, +} from 'request'; + import { IExecuteFunctions, IExecuteSingleFunctions, IHookFunctions, ILoadOptionsFunctions, } from 'n8n-core'; -import { IDataObject } from 'n8n-workflow'; + +import { + IDataObject, +} from 'n8n-workflow'; export async function clearbitApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, method: string, api: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any const credentials = this.getCredentials('clearbitApi'); @@ -13,11 +19,11 @@ export async function clearbitApiRequest(this: IHookFunctions | IExecuteFunction throw new Error('No credentials got returned!'); } let options: OptionsWithUri = { - headers: { Authorization: `Bearer ${credentials.apiKey}`}, + headers: { Authorization: `Bearer ${credentials.apiKey}` }, method, qs, body, - uri: uri ||`https://${api}-stream.clearbit.com${resource}`, + uri: uri || `https://${api}.clearbit.com${resource}`, json: true, }; options = Object.assign({}, options, option); diff --git a/packages/nodes-base/nodes/Clearbit/PersonDescription.ts b/packages/nodes-base/nodes/Clearbit/PersonDescription.ts index 71f6803c02..122e0d76d5 100644 --- a/packages/nodes-base/nodes/Clearbit/PersonDescription.ts +++ b/packages/nodes-base/nodes/Clearbit/PersonDescription.ts @@ -26,9 +26,9 @@ export const personOperations = [ export const personFields = [ -/* -------------------------------------------------------------------------- */ -/* person:enrich */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* person:enrich */ + /* -------------------------------------------------------------------------- */ { displayName: 'Email', name: 'email', diff --git a/packages/nodes-base/nodes/Clearbit/clearbit.png b/packages/nodes-base/nodes/Clearbit/clearbit.png deleted file mode 100644 index acb406f45d91080b66a3bd850dca7e6fa2774147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2Jf1AIbUfppB0|3L8X-+#{~|9$5D zk6ZfRbLRi||Nl2^{tuLLpY=a_@&Cm6Ahsu%{ruDaSfHBO|3fGK_gnPeeft0CCI7<~ z|9|`mq$YInfA0nVz2^OY_2qxy9FWNd`Tsxt{O_~i|I4rcAH4e?x9GpkwEvBp|Hm%* zU$+Uwc>Wb+n(yNOJ_|u602P1u`9F5q|M$QCd(8XqH3MV_(CX)(|9j2-?=$=V%P;?5 zfB*mD^Z$6D?Xy6p`7Qnb@ZJCK|Ng)E`Tybj|AA}%$1MFn;WpPvp!Y0Fg8YIRo^dhp zJ$?3@_vIsXWu9-Jo_~DxkL}-&dx_sa>{^uPB*Mw@0|TR&r;B5V$MLt8-m9~gNC z{u6um#Ol+FXP))%ZZA<=xqHWFj=pDk2a>OpRI`e=b#o-YKgB;Of_eMlyz|aG5{u=g zCq->;Ej*MQduN%2*^Pu|(~nV+vu?!cu3gw1zifH>>n+KF--P+3LhU47(e2p9b7aLvYvJSg?gI!O~{g5YX Sb`~&{89ZJ6T-G@yGywp8iDP2` diff --git a/packages/nodes-base/nodes/Clearbit/clearbit.svg b/packages/nodes-base/nodes/Clearbit/clearbit.svg new file mode 100644 index 0000000000..ca57f95378 --- /dev/null +++ b/packages/nodes-base/nodes/Clearbit/clearbit.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + From 68c14979d3ce73d9aea26165a349bf4884a785be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 24 Mar 2021 17:59:45 +0100 Subject: [PATCH 071/137] :sparkles: Add Mattermost reactions and ephemeral message (#1552) * Replace PNG icon with SVG icon * Add reaction resource and operations * :zap: Finalize reactions and add postEphemeral * :zap: Improvements Co-authored-by: ricardo --- .../nodes/Mattermost/Mattermost.node.ts | 366 +++++++++++++++++- .../nodes/Mattermost/mattermost.png | Bin 814 -> 0 bytes .../nodes/Mattermost/mattermost.svg | 1 + 3 files changed, 366 insertions(+), 1 deletion(-) delete mode 100644 packages/nodes-base/nodes/Mattermost/mattermost.png create mode 100644 packages/nodes-base/nodes/Mattermost/mattermost.svg diff --git a/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts b/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts index e4618f5919..5d6476a83b 100644 --- a/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts +++ b/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts @@ -25,7 +25,7 @@ export class Mattermost implements INodeType { description: INodeTypeDescription = { displayName: 'Mattermost', name: 'mattermost', - icon: 'file:mattermost.png', + icon: 'file:mattermost.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', @@ -56,6 +56,10 @@ export class Mattermost implements INodeType { name: 'Message', value: 'message', }, + { + name: 'Reaction', + value: 'reaction', + }, { name: 'User', value: 'user', @@ -138,10 +142,46 @@ export class Mattermost implements INodeType { value: 'post', description: 'Post a message into a channel', }, + { + name: 'Post Ephemeral', + value: 'postEphemeral', + description: 'Post an ephemeral message into a channel', + }, ], default: 'post', description: 'The operation to perform', }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'reaction', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Add a reaction to a post.', + }, + { + name: 'Delete', + value: 'delete', + description: 'Remove a reaction from a post', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get all the reactions to one or more posts', + }, + ], + default: 'create', + description: 'The operation to perform', + }, @@ -910,6 +950,73 @@ export class Mattermost implements INodeType { }, ], }, + + // ---------------------------------- + // message:post (ephemeral) + // ---------------------------------- + { + displayName: 'User ID', + name: 'userId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getUsers', + }, + options: [], + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'postEphemeral', + ], + resource: [ + 'message', + ], + }, + }, + description: 'ID of the user to send the ephemeral message to.', + }, + { + displayName: 'Channel ID', + name: 'channelId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getChannels', + }, + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'postEphemeral', + ], + resource: [ + 'message', + ], + }, + }, + description: 'ID of the channel to send the ephemeral message in.', + }, + { + displayName: 'Message', + name: 'message', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + displayOptions: { + show: { + operation: [ + 'postEphemeral', + ], + resource: [ + 'message', + ], + }, + }, + description: 'Text to send in the ephemeral message.', + }, { displayName: 'Other Options', name: 'otherOptions', @@ -937,6 +1044,188 @@ export class Mattermost implements INodeType { }, ], }, + + // ---------------------------------- + // reaction + // ---------------------------------- + { + displayName: 'User ID', + name: 'userId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getUsers', + }, + options: [], + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'create', + ], + }, + }, + description: 'ID of the user sending the reaction.', + }, + { + displayName: 'Post ID', + name: 'postId', + type: 'string', + default: '', + placeholder: '3moacfqxmbdw38r38fjprh6zsr', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'create', + ], + }, + }, + description: 'ID of the post to react to.
Obtainable from the post link:
https://mattermost.internal.n8n.io/[server]/pl/[postId]', + }, + { + displayName: 'Emoji Name', + name: 'emojiName', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'create', + ], + }, + }, + description: 'Emoji to use for this reaction.', + }, + { + displayName: 'User ID', + name: 'userId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getUsers', + }, + options: [], + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'delete', + ], + }, + }, + description: 'ID of the user whose reaction to delete.', + }, + { + displayName: 'Post ID', + name: 'postId', + type: 'string', + default: '', + placeholder: '3moacfqxmbdw38r38fjprh6zsr', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'delete', + ], + }, + }, + description: 'ID of the post whose reaction to delete.
Obtainable from the post link:
https://mattermost.internal.n8n.io/[server]/pl/[postId]', + }, + { + displayName: 'Emoji Name', + name: 'emojiName', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'delete', + ], + }, + }, + description: 'Name of the emoji to delete.', + }, + { + displayName: 'Post ID', + name: 'postId', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'reaction', + ], + operation: [ + 'getAll', + ], + }, + }, + description: 'One or more (comma-separated) posts to retrieve reactions from.', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'reaction', + ], + }, + }, + default: true, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'reaction', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 100, + description: 'How many results to return.', + }, + // ---------------------------------- // user // ---------------------------------- @@ -1830,7 +2119,79 @@ export class Mattermost implements INodeType { // Add all the other options to the request const otherOptions = this.getNodeParameter('otherOptions', i) as IDataObject; Object.assign(body, otherOptions); + + } else if (operation === 'postEphemeral') { + + // ---------------------------------- + // message:post (ephemeral) + // ---------------------------------- + + // https://api.mattermost.com/#tag/posts/paths/~1posts~1ephemeral/post + + body = { + user_id: this.getNodeParameter('userId', i), + post: { + channel_id: this.getNodeParameter('channelId', i), + message: this.getNodeParameter('message', i), + }, + } as IDataObject; + + requestMethod = 'POST'; + endpoint = 'posts/ephemeral'; + } + + } else if (resource === 'reaction') { + + // ---------------------------------- + // reaction:create + // ---------------------------------- + + // https://api.mattermost.com/#tag/reactions/paths/~1reactions/post + + if (operation === 'create') { + + body = { + user_id: this.getNodeParameter('userId', i), + post_id: this.getNodeParameter('postId', i), + emoji_name: (this.getNodeParameter('emojiName', i) as string).replace(/:/g, ''), + create_at: Date.now(), + } as { user_id: string; post_id: string; emoji_name: string; create_at: number }; + + requestMethod = 'POST'; + endpoint = 'reactions'; + + } else if (operation === 'delete') { + + // ---------------------------------- + // reaction:delete + // ---------------------------------- + + // https://api.mattermost.com/#tag/reactions/paths/~1users~1{user_id}~1posts~1{post_id}~1reactions~1{emoji_name}/delete + + const userId = this.getNodeParameter('userId', i) as string; + const postId = this.getNodeParameter('postId', i) as string; + const emojiName = (this.getNodeParameter('emojiName', i) as string).replace(/:/g, ''); + + requestMethod = 'DELETE'; + endpoint = `users/${userId}/posts/${postId}/reactions/${emojiName}`; + + } else if (operation === 'getAll') { + + // ---------------------------------- + // reaction:getAll + // ---------------------------------- + + // https://api.mattermost.com/#tag/reactions/paths/~1posts~1ids~1reactions/post + + const postId = this.getNodeParameter('postId', i) as string; + + requestMethod = 'GET'; + endpoint = `posts/${postId}/reactions`; + + qs.limit = this.getNodeParameter('limit', 0, 0) as number; + } + } else if (resource === 'user') { if (operation === 'create') { @@ -2006,6 +2367,9 @@ export class Mattermost implements INodeType { responseData = await apiRequestAllItems.call(this, requestMethod, endpoint, body, qs); } else { responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs); + if (qs.limit) { + responseData = responseData.slice(0, qs.limit); + } if (resource === 'channel' && operation === 'members') { const resolveData = this.getNodeParameter('resolveData', i) as boolean; if (resolveData) { diff --git a/packages/nodes-base/nodes/Mattermost/mattermost.png b/packages/nodes-base/nodes/Mattermost/mattermost.png deleted file mode 100644 index 9a2fe2a49c44fb12294ec752b7774481c68265e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2H_1AIbUfwa<~1o=N|(twULDhcun zW_ZW*_4;ow*8Q(%-JW2muw!bxt*SKp!*kuGg%Lp(;%isVYjb{fbYoprMw+(JVy;s) zCm5L)t1vJy33<9WhIkx*JN0JLA_I}O!&)5*?^ZN$N4*ZR{=EPHVP3gqmT5jw$FleD zcG;(s-udWg_j1emyBekcRUMK!Z*O~rC0y#(+;3Ssc^zxwW-Yywm~B44sh~R9@yo;Q zA=b7=bGQ7k%5HP(6Sv=4Hvi69k8?b)68(%W$=_ixy*4SGi~WGZ6&1N%_vg+0Husp# z(t}HvA~>IQw5?UR$5d^;m{x3gSISlTG_Yg;lJd;gueG_&wM-*gd@iam?b+-Xw^(h<(;o~c z-3qooj18B!ex+==uSI8ls>l!F)~4?Y)7})Z39)Ywns#MN%C6wYzLxXWuhl!Jp*qzw z^{-n51`mFjq#(ZAfvb+$l1zF#= z`8oMAeqVaaA&c|IY2OR>JuI6Yd!O0P`~0`3NB7DH>(2sr8x1xuoqcpxsI0*5OE0D= z9=#&=tDtyW&)ViIKg0^AN-hq{T&(zcmSoI27UxYJp)3EYEA}~^J~46IZ0@N_4$djk z`bSxQwwBA*Roqc#v#P$cF+(kG z&B}{^&#vqI7`47?rf$@RIhl77G;SG6zPYMloxkq~|D($KEK`@&k3IHOe3YqY$h_RQ V@sJMPC2_ diff --git a/packages/nodes-base/nodes/Mattermost/mattermost.svg b/packages/nodes-base/nodes/Mattermost/mattermost.svg new file mode 100644 index 0000000000..76d5d58a41 --- /dev/null +++ b/packages/nodes-base/nodes/Mattermost/mattermost.svg @@ -0,0 +1 @@ + \ No newline at end of file From 0d8602de5e70a5b0e72407c2a87a1bcdcbb7c899 Mon Sep 17 00:00:00 2001 From: Pavel Yudin Date: Wed, 24 Mar 2021 20:51:00 +0300 Subject: [PATCH 072/137] :sparkles: Add answerinlinequery option to Telegram (#1556) * telegram node: add answerinlinequery option * remove comments --- .../nodes/Telegram/Telegram.node.ts | 113 +++++++++++++++++- 1 file changed, 111 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Telegram/Telegram.node.ts b/packages/nodes-base/nodes/Telegram/Telegram.node.ts index 4a1330e242..4ab18bdf76 100644 --- a/packages/nodes-base/nodes/Telegram/Telegram.node.ts +++ b/packages/nodes-base/nodes/Telegram/Telegram.node.ts @@ -156,11 +156,15 @@ export class Telegram implements INodeType { value: 'answerQuery', description: 'Send answer to callback query sent from inline keyboard.', }, + { + name: 'Answer Inline Query', + value: 'answerInlineQuery', + description: 'Send answer to callback query sent from inline bot.', + }, ], default: 'answerQuery', description: 'The operation to perform.', }, - { displayName: 'Operation', name: 'operation', @@ -508,13 +512,104 @@ export class Telegram implements INodeType { ], }, + // ----------------------------------------------- + // callback:answerInlineQuery + // ----------------------------------------------- + { + displayName: 'Query ID', + name: 'queryId', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'answerInlineQuery', + ], + resource: [ + 'callback', + ], + }, + }, + required: true, + description: 'Unique identifier for the answered query.', + }, + { + displayName: 'Results', + name: 'results', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'answerInlineQuery', + ], + resource: [ + 'callback', + ], + }, + }, + required: true, + description: 'A JSON-serialized array of results for the inline query.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'answerInlineQuery', + ], + resource: [ + 'callback', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Cache Time', + name: 'cache_time', + type: 'number', + typeOptions: { + minValue: 0, + }, + default: 0, + description: 'The maximum amount of time in seconds that the result of the callback query may be cached client-side.', + }, + { + displayName: 'Show Alert', + name: 'show_alert', + type: 'boolean', + default: false, + description: 'If true, an alert will be shown by the client instead of a notification at the top of the chat screen.', + }, + { + displayName: 'Text', + name: 'text', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters.', + }, + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + description: 'URL that will be opened by the user\'s client.', + }, + ], + }, // ---------------------------------- // file // ---------------------------------- - // ---------------------------------- // file:get/download // ---------------------------------- @@ -1649,7 +1744,21 @@ export class Telegram implements INodeType { const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; Object.assign(body, additionalFields); + } else if (operation === 'answerInlineQuery') { + // ----------------------------------------------- + // callback:answerInlineQuery + // ----------------------------------------------- + + endpoint = 'answerInlineQuery'; + + body.inline_query_id = this.getNodeParameter('queryId', i) as string; + body.results = this.getNodeParameter('results', i) as string; + + // Add additional fields + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + Object.assign(body, additionalFields); } + } else if (resource === 'chat') { if (operation === 'get') { // ---------------------------------- From 80db50282e1d8edcea335d51902ab4026384f9e0 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Wed, 24 Mar 2021 18:51:43 +0100 Subject: [PATCH 073/137] :zap: Minor imporovement --- packages/nodes-base/nodes/Telegram/Telegram.node.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/nodes/Telegram/Telegram.node.ts b/packages/nodes-base/nodes/Telegram/Telegram.node.ts index 4ab18bdf76..e22d791c70 100644 --- a/packages/nodes-base/nodes/Telegram/Telegram.node.ts +++ b/packages/nodes-base/nodes/Telegram/Telegram.node.ts @@ -550,7 +550,7 @@ export class Telegram implements INodeType { }, required: true, description: 'A JSON-serialized array of results for the inline query.', - }, + }, { displayName: 'Additional Fields', name: 'additionalFields', @@ -1750,13 +1750,13 @@ export class Telegram implements INodeType { // ----------------------------------------------- endpoint = 'answerInlineQuery'; - + body.inline_query_id = this.getNodeParameter('queryId', i) as string; body.results = this.getNodeParameter('results', i) as string; - + // Add additional fields const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; - Object.assign(body, additionalFields); + Object.assign(body, additionalFields); } } else if (resource === 'chat') { From 0c3a191859d3aaec7914902a40b2e4486ce78ec3 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Wed, 24 Mar 2021 18:01:12 -0400 Subject: [PATCH 074/137] :zap: Add resources Task Tag, Space Tag & Task List to ClickUp Node (#1539) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :zap: Add resources Task Tag and Space Tag to ClickUp Node * :zap: Add Task List resource * :zap: Fix spaceTag:update * :zap: Fix icon and formatting Co-authored-by: Iván Ovejero Co-authored-by: Jan Oberhauser --- .../nodes/ClickUp/ChecklistDescription.ts | 20 +- .../nodes/ClickUp/ChecklistItemDescription.ts | 22 +- .../nodes-base/nodes/ClickUp/ClickUp.node.ts | 121 ++++++++++- .../nodes/ClickUp/ClickUpTrigger.node.ts | 16 +- .../nodes/ClickUp/CommentDescription.ts | 29 +-- .../nodes/ClickUp/FolderDescription.ts | 36 ++-- .../nodes/ClickUp/GenericFunctions.ts | 10 +- .../nodes/ClickUp/GoalDescription.ts | 36 ++-- .../nodes/ClickUp/GoalKeyResultDescription.ts | 22 +- .../nodes/ClickUp/GuestDescription.ts | 29 +-- .../nodes/ClickUp/ListDescription.ts | 49 +++-- .../nodes/ClickUp/SpaceTagDescription.ts | 204 ++++++++++++++++++ .../ClickUp/TaskDependencyDescription.ts | 15 +- .../nodes/ClickUp/TaskDescription.ts | 50 +++-- .../nodes/ClickUp/TaskListDescription.ts | 74 +++++++ .../nodes/ClickUp/TaskTagDescription.ts | 111 ++++++++++ .../nodes/ClickUp/TimeEntryTagDescription.ts | 24 ++- packages/nodes-base/nodes/ClickUp/clickup.png | Bin 1788 -> 0 bytes packages/nodes-base/nodes/ClickUp/clickup.svg | 1 + 19 files changed, 706 insertions(+), 163 deletions(-) create mode 100644 packages/nodes-base/nodes/ClickUp/SpaceTagDescription.ts create mode 100644 packages/nodes-base/nodes/ClickUp/TaskListDescription.ts create mode 100644 packages/nodes-base/nodes/ClickUp/TaskTagDescription.ts delete mode 100644 packages/nodes-base/nodes/ClickUp/clickup.png create mode 100644 packages/nodes-base/nodes/ClickUp/clickup.svg diff --git a/packages/nodes-base/nodes/ClickUp/ChecklistDescription.ts b/packages/nodes-base/nodes/ClickUp/ChecklistDescription.ts index 517d2946b5..c4c40a4885 100644 --- a/packages/nodes-base/nodes/ClickUp/ChecklistDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/ChecklistDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const checklistOperations = [ { @@ -38,9 +38,9 @@ export const checklistOperations = [ export const checklistFields = [ -/* -------------------------------------------------------------------------- */ -/* checklist:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* checklist:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'task', @@ -75,9 +75,9 @@ export const checklistFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* checklist:delete */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* checklist:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Checklist ID', name: 'checklist', @@ -95,9 +95,9 @@ export const checklistFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* checklist:update */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* checklist:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Checklist ID', name: 'checklist', diff --git a/packages/nodes-base/nodes/ClickUp/ChecklistItemDescription.ts b/packages/nodes-base/nodes/ClickUp/ChecklistItemDescription.ts index e15fb52919..83704a947a 100644 --- a/packages/nodes-base/nodes/ClickUp/ChecklistItemDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/ChecklistItemDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const checklistItemOperations = [ { @@ -38,9 +38,9 @@ export const checklistItemOperations = [ export const checklistItemFields = [ -/* -------------------------------------------------------------------------- */ -/* checklistItem:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* checklistItem:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Checklist ID', name: 'checklist', @@ -100,9 +100,10 @@ export const checklistItemFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* checklistItem:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* checklistItem:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Checklist ID', name: 'checklist', @@ -137,9 +138,10 @@ export const checklistItemFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* checklistItem:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* checklistItem:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Checklist ID', name: 'checklist', diff --git a/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts b/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts index 6be02f5230..14628f6c5d 100644 --- a/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts +++ b/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts @@ -57,6 +57,21 @@ import { taskOperations, } from './TaskDescription'; +import { + taskListFields, + taskListOperations, +} from './TaskListDescription'; + +import { + taskTagFields, + taskTagOperations, +} from './TaskTagDescription'; + +import { + spaceTagFields, + spaceTagOperations, +} from './SpaceTagDescription'; + import { taskDependencyFields, taskDependencyOperations, @@ -91,7 +106,7 @@ export class ClickUp implements INodeType { description: INodeTypeDescription = { displayName: 'ClickUp', name: 'clickUp', - icon: 'file:clickup.png', + icon: 'file:clickup.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ":" + $parameter["resource"]}}', @@ -180,10 +195,22 @@ export class ClickUp implements INodeType { name: 'List', value: 'list', }, + { + name: 'Space Tag', + value: 'spaceTag', + }, { name: 'Task', value: 'task', }, + { + name: 'Task List', + value: 'taskList', + }, + { + name: 'Task Tag', + value: 'taskTag', + }, { name: 'Task Dependency', value: 'taskDependency', @@ -221,6 +248,15 @@ export class ClickUp implements INodeType { // GUEST // ...guestOperations, // ...guestFields, + // TASK TAG + ...taskTagOperations, + ...taskTagFields, + // TASK LIST + ...taskListOperations, + ...taskListFields, + // SPACE TAG + ...spaceTagOperations, + ...spaceTagFields, // TASK ...taskOperations, ...taskFields, @@ -1022,6 +1058,40 @@ export class ClickUp implements INodeType { responseData = { success: true }; } } + if (resource === 'taskTag') { + if (operation === 'add') { + const taskId = this.getNodeParameter('taskId', i) as string; + const name = this.getNodeParameter('tagName', i) as string; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + const qs: IDataObject = {}; + Object.assign(qs, additionalFields); + responseData = await clickupApiRequest.call(this, 'POST', `/task/${taskId}/tag/${name}`, {}, qs); + responseData = { success: true }; + } + if (operation === 'remove') { + const taskId = this.getNodeParameter('taskId', i) as string; + const name = this.getNodeParameter('tagName', i) as string; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + const qs: IDataObject = {}; + Object.assign(qs, additionalFields); + responseData = await clickupApiRequest.call(this, 'DELETE', `/task/${taskId}/tag/${name}`, {}, qs); + responseData = { success: true }; + } + } + if (resource === 'taskList') { + if (operation === 'add') { + const taskId = this.getNodeParameter('taskId', i) as string; + const listId = this.getNodeParameter('listId', i) as string; + responseData = await clickupApiRequest.call(this, 'POST', `/list/${listId}/task/${taskId}`); + responseData = { success: true }; + } + if (operation === 'remove') { + const taskId = this.getNodeParameter('taskId', i) as string; + const listId = this.getNodeParameter('listId', i) as string; + responseData = await clickupApiRequest.call(this, 'DELETE', `/list/${listId}/task/${taskId}`); + responseData = { success: true }; + } + } if (resource === 'taskDependency') { if (operation === 'create') { const taskId = this.getNodeParameter('task', i) as string; @@ -1195,6 +1265,55 @@ export class ClickUp implements INodeType { } } + if (resource === 'spaceTag') { + if (operation === 'create') { + const spaceId = this.getNodeParameter('space', i) as string; + const name = this.getNodeParameter('name', i) as string; + const foregroundColor = this.getNodeParameter('foregroundColor', i) as string; + const backgroundColor = this.getNodeParameter('backgroundColor', i) as string; + const body: IDataObject = { + tag: { + name, + tag_bg: backgroundColor, + tag_fg: foregroundColor, + }, + }; + responseData = await clickupApiRequest.call(this, 'POST', `/space/${spaceId}/tag`, body); + responseData = { success: true }; + } + if (operation === 'delete') { + const spaceId = this.getNodeParameter('space', i) as string; + const name = this.getNodeParameter('name', i) as string; + responseData = await clickupApiRequest.call(this, 'DELETE', `/space/${spaceId}/tag/${name}`); + responseData = { success: true }; + } + if (operation === 'getAll') { + const spaceId = this.getNodeParameter('space', i) as string; + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + responseData = await clickupApiRequest.call(this, 'GET', `/space/${spaceId}/tag`); + responseData = responseData.tags; + if (returnAll === false) { + const limit = this.getNodeParameter('limit', i) as number; + responseData = responseData.splice(0, limit); + } + } + if (operation === 'update') { + const spaceId = this.getNodeParameter('space', i) as string; + const tagName = this.getNodeParameter('name', i) as string; + const newTagName = this.getNodeParameter('newName', i) as string; + const foregroundColor = this.getNodeParameter('foregroundColor', i) as string; + const backgroundColor = this.getNodeParameter('backgroundColor', i) as string; + const body: IDataObject = { + tag: { + name: newTagName, + tag_bg: backgroundColor, + tag_fg: foregroundColor, + }, + }; + await clickupApiRequest.call(this, 'PUT', `/space/${spaceId}/tag/${tagName}`, body); + responseData = { success: true }; + } + } if (resource === 'list') { if (operation === 'create') { const spaceId = this.getNodeParameter('space', i) as string; diff --git a/packages/nodes-base/nodes/ClickUp/ClickUpTrigger.node.ts b/packages/nodes-base/nodes/ClickUp/ClickUpTrigger.node.ts index 2e9bb24ebf..bf00cbe81a 100644 --- a/packages/nodes-base/nodes/ClickUp/ClickUpTrigger.node.ts +++ b/packages/nodes-base/nodes/ClickUp/ClickUpTrigger.node.ts @@ -16,13 +16,15 @@ import { clickupApiRequest, } from './GenericFunctions'; -import { createHmac } from 'crypto'; +import { + createHmac, +} from 'crypto'; export class ClickUpTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'ClickUp Trigger', name: 'clickUpTrigger', - icon: 'file:clickup.png', + icon: 'file:clickup.svg', group: ['trigger'], version: 1, description: 'Handle ClickUp events via webhooks (Beta)', @@ -302,16 +304,16 @@ export class ClickUpTrigger implements INodeType { body.events = '*'; } if (filters.listId) { - body.list_id = (filters.listId as string).replace('#',''); + body.list_id = (filters.listId as string).replace('#', ''); } if (filters.taskId) { - body.task_id = (filters.taskId as string).replace('#',''); + body.task_id = (filters.taskId as string).replace('#', ''); } if (filters.spaceId) { - body.space_id = (filters.spaceId as string).replace('#',''); + body.space_id = (filters.spaceId as string).replace('#', ''); } if (filters.folderId) { - body.folder_id = (filters.folderId as string).replace('#',''); + body.folder_id = (filters.folderId as string).replace('#', ''); } const { webhook } = await clickupApiRequest.call(this, 'POST', endpoint, body); webhookData.webhookId = webhook.id; @@ -323,7 +325,7 @@ export class ClickUpTrigger implements INodeType { const endpoint = `/webhook/${webhookData.webhookId}`; try { await clickupApiRequest.call(this, 'DELETE', endpoint); - } catch(error) { + } catch (error) { return false; } delete webhookData.webhookId; diff --git a/packages/nodes-base/nodes/ClickUp/CommentDescription.ts b/packages/nodes-base/nodes/ClickUp/CommentDescription.ts index a8ef00d2f4..715c7da148 100644 --- a/packages/nodes-base/nodes/ClickUp/CommentDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/CommentDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const commentOperations = [ { @@ -43,9 +43,9 @@ export const commentOperations = [ export const commentFields = [ -/* -------------------------------------------------------------------------- */ -/* comment:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* comment:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Comment On', name: 'commentOn', @@ -141,9 +141,10 @@ export const commentFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* comment:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* comment:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Comment ID', name: 'comment', @@ -161,9 +162,10 @@ export const commentFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* comment:getAll */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* comment:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Comments On', name: 'commentsOn', @@ -232,9 +234,10 @@ export const commentFields = [ default: 50, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* comment:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* comment:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Comment ID', name: 'comment', diff --git a/packages/nodes-base/nodes/ClickUp/FolderDescription.ts b/packages/nodes-base/nodes/ClickUp/FolderDescription.ts index 327ae830e0..cd97ac3af6 100644 --- a/packages/nodes-base/nodes/ClickUp/FolderDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/FolderDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const folderOperations = [ { @@ -48,9 +48,9 @@ export const folderOperations = [ export const folderFields = [ -/* -------------------------------------------------------------------------- */ -/* folder:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* folder:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -111,9 +111,10 @@ export const folderFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* folder:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* folder:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -180,9 +181,10 @@ export const folderFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* folder:get */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* folder:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -249,9 +251,10 @@ export const folderFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* folder:getAll */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* folder:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -341,9 +344,10 @@ export const folderFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* folder:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* folder:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', diff --git a/packages/nodes-base/nodes/ClickUp/GenericFunctions.ts b/packages/nodes-base/nodes/ClickUp/GenericFunctions.ts index 79409e69c3..0de73a430b 100644 --- a/packages/nodes-base/nodes/ClickUp/GenericFunctions.ts +++ b/packages/nodes-base/nodes/ClickUp/GenericFunctions.ts @@ -1,6 +1,6 @@ import { OptionsWithUri, - } from 'request'; +} from 'request'; import { IExecuteFunctions, @@ -13,7 +13,7 @@ import { import { IDataObject, IOAuth2Options, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export async function clickupApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions | IWebhookFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any const options: OptionsWithUri = { @@ -23,7 +23,7 @@ export async function clickupApiRequest(this: IHookFunctions | IExecuteFunctions method, qs, body, - uri: uri ||`https://api.clickup.com/api/v2${resource}`, + uri: uri || `https://api.clickup.com/api/v2${resource}`, json: true, }; @@ -51,7 +51,7 @@ export async function clickupApiRequest(this: IHookFunctions | IExecuteFunctions return await this.helpers.requestOAuth2!.call(this, 'clickUpOAuth2Api', options, oAuth2Options); } - } catch(error) { + } catch (error) { let errorMessage = error; if (error.err) { errorMessage = error.err; @@ -61,7 +61,7 @@ export async function clickupApiRequest(this: IHookFunctions | IExecuteFunctions } -export async function clickupApiRequestAllItems(this: IHookFunctions | IExecuteFunctions| ILoadOptionsFunctions, propertyName: string ,method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any +export async function clickupApiRequestAllItems(this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, propertyName: string, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise { // tslint:disable-line:no-any const returnData: IDataObject[] = []; diff --git a/packages/nodes-base/nodes/ClickUp/GoalDescription.ts b/packages/nodes-base/nodes/ClickUp/GoalDescription.ts index 06e0463f6c..aba11b4654 100644 --- a/packages/nodes-base/nodes/ClickUp/GoalDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/GoalDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const goalOperations = [ { @@ -48,9 +48,9 @@ export const goalOperations = [ export const goalFields = [ -/* -------------------------------------------------------------------------- */ -/* goal:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* goal:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -140,9 +140,10 @@ export const goalFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* goal:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goal:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Goal ID', name: 'goal', @@ -160,9 +161,10 @@ export const goalFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* goal:get */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goal:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Goal ID', name: 'goal', @@ -180,9 +182,10 @@ export const goalFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* goal:getAll */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goal:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -224,9 +227,10 @@ export const goalFields = [ default: 50, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* goal:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goal:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Goal ID', name: 'goal', diff --git a/packages/nodes-base/nodes/ClickUp/GoalKeyResultDescription.ts b/packages/nodes-base/nodes/ClickUp/GoalKeyResultDescription.ts index 657731ac4f..fd4ff685e3 100644 --- a/packages/nodes-base/nodes/ClickUp/GoalKeyResultDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/GoalKeyResultDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const goalKeyResultOperations = [ { @@ -38,9 +38,9 @@ export const goalKeyResultOperations = [ export const goalKeyResultFields = [ -/* -------------------------------------------------------------------------- */ -/* goalKeyResult:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* goalKeyResult:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Goal ID', name: 'goal', @@ -178,9 +178,10 @@ export const goalKeyResultFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* goalKeyResult:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goalKeyResult:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Key Result ID', name: 'keyResult', @@ -198,9 +199,10 @@ export const goalKeyResultFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* goalKeyResult:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* goalKeyResult:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Key Result ID', name: 'keyResult', diff --git a/packages/nodes-base/nodes/ClickUp/GuestDescription.ts b/packages/nodes-base/nodes/ClickUp/GuestDescription.ts index 2f6ebd6da1..f25a1b6c30 100644 --- a/packages/nodes-base/nodes/ClickUp/GuestDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/GuestDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const guestOperations = [ { @@ -43,9 +43,9 @@ export const guestOperations = [ export const guestFields = [ -/* -------------------------------------------------------------------------- */ -/* guest:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* guest:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -119,9 +119,10 @@ export const guestFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* guest:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* guest:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -159,9 +160,10 @@ export const guestFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* guest:get */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* guest:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -199,9 +201,10 @@ export const guestFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* guest:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* guest:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', diff --git a/packages/nodes-base/nodes/ClickUp/ListDescription.ts b/packages/nodes-base/nodes/ClickUp/ListDescription.ts index 0c28a1d90d..f5183478e5 100644 --- a/packages/nodes-base/nodes/ClickUp/ListDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/ListDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const listOperations = [ { @@ -58,9 +58,9 @@ export const listOperations = [ export const listFields = [ -/* -------------------------------------------------------------------------- */ -/* list:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* list:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -233,9 +233,10 @@ export const listFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* list:member */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* list:member */ + /* -------------------------------------------------------------------------- */ { displayName: 'List ID', name: 'id', @@ -295,9 +296,9 @@ export const listFields = [ default: 50, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* list:customFields */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* list:customFields */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team', name: 'team', @@ -436,9 +437,10 @@ export const listFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* list:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* list:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -542,9 +544,10 @@ export const listFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* list:get */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* list:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -648,9 +651,10 @@ export const listFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* list:getAll */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* list:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -783,9 +787,10 @@ export const listFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* list:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* list:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', diff --git a/packages/nodes-base/nodes/ClickUp/SpaceTagDescription.ts b/packages/nodes-base/nodes/ClickUp/SpaceTagDescription.ts new file mode 100644 index 0000000000..9d8384775a --- /dev/null +++ b/packages/nodes-base/nodes/ClickUp/SpaceTagDescription.ts @@ -0,0 +1,204 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const spaceTagOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a space tag', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a space tag', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get all space tags', + }, + { + name: 'Update', + value: 'update', + description: 'Update a space tag', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const spaceTagFields = [ + /* -------------------------------------------------------------------------- */ + /* spaceTag:create */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Space ID', + name: 'space', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'create', + 'delete', + 'getAll', + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'create', + ], + }, + }, + required: true, + }, + { + displayName: 'Name', + name: 'name', + type: 'options', + typeOptions: { + loadOptionsDependsOn: [ + 'space', + ], + loadOptionsMethod: 'getTags', + }, + default: '', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'delete', + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'New Name', + name: 'newName', + type: 'string', + description: 'New name to set for the tag.', + default: '', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Foreground Color', + name: 'foregroundColor', + type: 'color', + default: '#000000', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'create', + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Background Color', + name: 'backgroundColor', + type: 'color', + default: '#000000', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'create', + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'getAll', + ], + }, + }, + default: true, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'spaceTag', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 50, + description: 'How many results to return.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ClickUp/TaskDependencyDescription.ts b/packages/nodes-base/nodes/ClickUp/TaskDependencyDescription.ts index 2f5d19ba0a..c778a437e7 100644 --- a/packages/nodes-base/nodes/ClickUp/TaskDependencyDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/TaskDependencyDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const taskDependencyOperations = [ { @@ -33,9 +33,9 @@ export const taskDependencyOperations = [ export const taskDependencyFields = [ -/* -------------------------------------------------------------------------- */ -/* taskDependency:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* taskDependency:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'task', @@ -69,9 +69,10 @@ export const taskDependencyFields = [ }, required: true, }, -/* -------------------------------------------------------------------------- */ -/* taskDependency:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* taskDependency:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'task', diff --git a/packages/nodes-base/nodes/ClickUp/TaskDescription.ts b/packages/nodes-base/nodes/ClickUp/TaskDescription.ts index ef80c95656..687084cc72 100644 --- a/packages/nodes-base/nodes/ClickUp/TaskDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/TaskDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const taskOperations = [ { @@ -58,9 +58,9 @@ export const taskOperations = [ export const taskFields = [ -/* -------------------------------------------------------------------------- */ -/* task:create */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* task:create */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -352,9 +352,10 @@ export const taskFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* task:update */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:update */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'id', @@ -489,9 +490,10 @@ export const taskFields = [ ], }, -/* -------------------------------------------------------------------------- */ -/* task:get */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:get */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'id', @@ -510,9 +512,10 @@ export const taskFields = [ }, description: 'Task ID', }, -/* -------------------------------------------------------------------------- */ -/* task:getAll */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -920,9 +923,10 @@ export const taskFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* task:delete */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:delete */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'id', @@ -941,9 +945,10 @@ export const taskFields = [ }, description: 'task ID', }, -/* -------------------------------------------------------------------------- */ -/* task:member */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:member */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'id', @@ -1003,9 +1008,10 @@ export const taskFields = [ default: 50, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* task:setCustomField */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* task:setCustomField */ + /* -------------------------------------------------------------------------- */ { displayName: 'Task ID', name: 'task', diff --git a/packages/nodes-base/nodes/ClickUp/TaskListDescription.ts b/packages/nodes-base/nodes/ClickUp/TaskListDescription.ts new file mode 100644 index 0000000000..c1e25a0170 --- /dev/null +++ b/packages/nodes-base/nodes/ClickUp/TaskListDescription.ts @@ -0,0 +1,74 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const taskListOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'taskList', + ], + }, + }, + options: [ + { + name: 'Add', + value: 'add', + description: 'Add a task to a list', + }, + { + name: 'Remove', + value: 'remove', + description: 'Remove a task from a list', + }, + ], + default: 'add', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const taskListFields = [ + /* -------------------------------------------------------------------------- */ + /* taskList:add */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Task ID', + name: 'taskId', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'taskList', + ], + operation: [ + 'remove', + 'add', + ], + }, + }, + required: true, + }, + { + displayName: 'List ID', + name: 'listId', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'taskList', + ], + operation: [ + 'remove', + 'add', + ], + }, + }, + required: true, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ClickUp/TaskTagDescription.ts b/packages/nodes-base/nodes/ClickUp/TaskTagDescription.ts new file mode 100644 index 0000000000..70ba1796aa --- /dev/null +++ b/packages/nodes-base/nodes/ClickUp/TaskTagDescription.ts @@ -0,0 +1,111 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const taskTagOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'taskTag', + ], + }, + }, + options: [ + { + name: 'Add', + value: 'add', + description: 'Add a tag to a task', + }, + { + name: 'Remove', + value: 'remove', + description: 'Remove a tag from a task', + }, + ], + default: 'add', + description: 'The operation to perform.', + }, +] as INodeProperties[]; + +export const taskTagFields = [ + /* -------------------------------------------------------------------------- */ + /* taskTag:add */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Task ID', + name: 'taskId', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'taskTag', + ], + operation: [ + 'remove', + 'add', + ], + }, + }, + required: true, + }, + { + displayName: 'Tag Name', + name: 'tagName', + type: 'string', + default: '', + displayOptions: { + show: { + resource: [ + 'taskTag', + ], + operation: [ + 'remove', + 'add', + ], + }, + }, + required: true, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'taskTag', + ], + operation: [ + 'remove', + 'add', + ], + }, + }, + options: [ + { + displayName: 'Custom Task IDs', + name: 'custom_task_ids', + type: 'boolean', + default: false, + description: `If you want to reference a task by it's custom task id, this value must be true`, + }, + { + displayName: 'Team ID', + name: 'team_id', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getTeams', + }, + default: '', + description: `Only used when the parameter is set to custom_task_ids=true`, + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ClickUp/TimeEntryTagDescription.ts b/packages/nodes-base/nodes/ClickUp/TimeEntryTagDescription.ts index 1375a53a34..ff6508cc31 100644 --- a/packages/nodes-base/nodes/ClickUp/TimeEntryTagDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/TimeEntryTagDescription.ts @@ -1,6 +1,6 @@ import { INodeProperties, - } from 'n8n-workflow'; +} from 'n8n-workflow'; export const timeEntryTagOperations = [ { @@ -28,7 +28,7 @@ export const timeEntryTagOperations = [ { name: 'Remove', value: 'remove', - description:'Remove tag from time entry', + description: 'Remove tag from time entry', }, ], default: 'add', @@ -38,9 +38,9 @@ export const timeEntryTagOperations = [ export const timeEntryTagFields = [ -/* -------------------------------------------------------------------------- */ -/* timeEntryTag:getAll */ -/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ + /* timeEntryTag:getAll */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -102,9 +102,10 @@ export const timeEntryTagFields = [ default: 5, description: 'How many results to return.', }, -/* -------------------------------------------------------------------------- */ -/* timeEntryTag:add */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* timeEntryTag:add */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', @@ -188,9 +189,10 @@ export const timeEntryTagFields = [ }, ], }, -/* -------------------------------------------------------------------------- */ -/* timeEntryTag:remove */ -/* -------------------------------------------------------------------------- */ + + /* -------------------------------------------------------------------------- */ + /* timeEntryTag:remove */ + /* -------------------------------------------------------------------------- */ { displayName: 'Team ID', name: 'team', diff --git a/packages/nodes-base/nodes/ClickUp/clickup.png b/packages/nodes-base/nodes/ClickUp/clickup.png deleted file mode 100644 index c46fe7b58662587a132c154e409034b89189a1f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1788 zcmYL|XIRtc8pfl5A`}ISiVzPKs|*oom2r#=849u@B#bZ;5|jvp5o4eUBL-w8$_PV2 zpe%uw8f2b=A_#(1)GAe>14OLU9`T619Q;R~{?jk#zOMIrujl^s+`s#M3#k4_^mL4M zNFp1*k$x&7MAOX$7NwT&MIJMfL&L>5RwsqWqaUY z-^nUNq0)sgfg=Y0N*K}$uS3A(QEDU(Sxo5sJiHemS`2J4?Cl52w@~B>RrbIYB=Rvv zBLY%7oIak$z=TXp>V`+uqTpQ(S4<&50pthiR2;;S#2N{yXh=K4yodmKDmE7dr75(T z!;U-Y$5hZ}K}6tlQE{*;T7kl*8Htw)dW@iPuR4)?6IkAaq(mqT@Eb*fdXd;%EFl$v z0e#S)hf5BjEl9o{e!LKY;={=TJd#*oSO;_#AtoKlorNsica#X|qy{xY_%DGi;S?kE zE-cdzgF$^Tn9p+t$fE*35iCaF@)!PtC}=G+njyyxBy<4%IS9{zd_N*GkrXc3r!jCM z7o!1Hqca}?$~Wpg2`mjZ!R?5;Cbvdlr>n`7J42gg=n#Z=0)b0JR~HJ~e^B>G@JZqk zaE{#vP7QF&;iMdrB_N6gNjT*Cs@o^3B)Ea`udwqcHGG?XaP0tECG_q9r5W7V$Z7*# z9-QVw9u4H~knN_5A_(g)!}{l7@(^rCz~LJB)Wh*JAYnm;H`E@2iBIU`5LFLC5hRHq zl?Q1oI8T9d6rc{{>c_Tu5u)XgBnIIr5XV6Q14@G6^1rQmypIwepj8m)A4FQcN>f8a zQ$vNT{x3`m$8i)zI@zXV<4<+9i3!L45n&QqS^2o|Gt;f z_gL>XTd%@ULdb{re=WaRdilp6i!TpRNn?$-$03^6 z_|nvAs^Ky6+Bb8r`D^pE*O0v`kLI^}$po^`gsJ~XW>FiOPcHOqly*y``-O`iXZMI~ zZ3j{v7P3B6&wLoKUU`KM&Z#y(-??{V`DAeS?S#I5jpXB3bx5x_%~iZ9sTi)Z#(w@5 zQe!zU?My$})^-24gGv=AA-}AOCK)oA>D6}8R+0spj!m@3%$94vZ8CVRzwO1^&yN%a zuf%wU&5nmUVfFOTNA{%iqmLV{0~cqR117Fx9g_*=-BC_%XX{PS>~NL|^W{ zeWJOqQ?&Z`jrAe7e3w>52!F{Cd|0i*wx73pZ&Y;haI4d*YsH~wni;=Vd-n+F*MDRtII z+@CJY-JD(tVaiY0y^S+cC_0*r7JOyxp1ZVHKmN6ue!?uGYpd4_ic-ZspL}ucy)(LX zJ@v-p_rkU0M%mxDMmIZ?JZcrHY}3$6 zxK*V)9^0{DUCqW8C6kPlxN?4>PK8a|jl9U(<5rRoqbQwx)>7gpW%U)3W{0`og&1ls zx$TaRadc89_gj8<%U&Q&{>p-?=~K61gHMpvC7zC9*m#w&V97$@xXRU*k#u+Q;LatQ zxyDasrLLY03-aP~L1WGb~f)^$MtVM+n)85v12*y>iNE5q51Dphl$qc zf&ytlwg3DViVm;Q2^M~CcVuKp``nhC2%Iz1CG)X5dP>@$EsZ)9^|rJ}MRNahJM%u{ RiJ17sByUfDk1K90>EAVm*PH+V diff --git a/packages/nodes-base/nodes/ClickUp/clickup.svg b/packages/nodes-base/nodes/ClickUp/clickup.svg new file mode 100644 index 0000000000..18f875d5cc --- /dev/null +++ b/packages/nodes-base/nodes/ClickUp/clickup.svg @@ -0,0 +1 @@ + \ No newline at end of file From bed5195eb8b7d65f9f627eeca56e37bda5b81078 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Thu, 25 Mar 2021 12:16:56 +0200 Subject: [PATCH 075/137] :arrow_up: Set convict@6.0.1 on n8n The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-CONVICT-1062508 --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a4b37cf72..838fb44a3b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -91,7 +91,7 @@ "client-oauth2": "^4.2.5", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "convict": "^5.0.0", + "convict": "^6.0.1", "csrf": "^3.1.0", "dotenv": "^8.0.0", "express": "^4.16.4", From 5f96f01f242c2172b7d02ea8083cf99d77c2bd1f Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 11:17:30 +0100 Subject: [PATCH 076/137] :zap: Make n8n work with new version of convict --- packages/cli/src/GenericHelpers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/GenericHelpers.ts b/packages/cli/src/GenericHelpers.ts index cab67f7bce..c1f942dde8 100644 --- a/packages/cli/src/GenericHelpers.ts +++ b/packages/cli/src/GenericHelpers.ts @@ -95,14 +95,14 @@ export async function getConfigValue(configKey: string): Promise Date: Thu, 25 Mar 2021 11:23:54 +0100 Subject: [PATCH 077/137] :zap: Some cleanup --- packages/cli/commands/execute.ts | 4 ++-- packages/cli/commands/export/credentials.ts | 2 +- packages/cli/commands/export/workflow.ts | 2 +- packages/cli/commands/start.ts | 19 ++++++++++--------- packages/cli/commands/update/workflow.ts | 2 +- packages/cli/commands/webhook.ts | 12 ++++++------ packages/cli/commands/worker.ts | 4 ++-- packages/cli/src/Server.ts | 2 -- 8 files changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/cli/commands/execute.ts b/packages/cli/commands/execute.ts index b3450e9ef2..3091778def 100644 --- a/packages/cli/commands/execute.ts +++ b/packages/cli/commands/execute.ts @@ -21,7 +21,7 @@ import { WorkflowCredentials, WorkflowHelpers, WorkflowRunner, -} from "../src"; +} from '../src'; export class Execute extends Command { @@ -127,7 +127,7 @@ export class Execute extends Command { // Check if the workflow contains the required "Start" node // "requiredNodeTypes" are also defined in editor-ui/views/NodeView.vue const requiredNodeTypes = ['n8n-nodes-base.start']; - let startNode: INode | undefined= undefined; + let startNode: INode | undefined = undefined; for (const node of workflowData!.nodes) { if (requiredNodeTypes.includes(node.type)) { startNode = node; diff --git a/packages/cli/commands/export/credentials.ts b/packages/cli/commands/export/credentials.ts index 5175e3be2d..ec12033446 100644 --- a/packages/cli/commands/export/credentials.ts +++ b/packages/cli/commands/export/credentials.ts @@ -140,7 +140,7 @@ export class ExportCredentialsCommand extends Command { let fileContents: string, i: number; for (i = 0; i < credentials.length; i++) { fileContents = JSON.stringify(credentials[i], null, flags.pretty ? 2 : undefined); - const filename = (flags.output!.endsWith(path.sep) ? flags.output! : flags.output + path.sep) + credentials[i].id + ".json"; + const filename = (flags.output!.endsWith(path.sep) ? flags.output! : flags.output + path.sep) + credentials[i].id + '.json'; fs.writeFileSync(filename, fileContents); } console.log('Successfully exported', i, 'credentials.'); diff --git a/packages/cli/commands/export/workflow.ts b/packages/cli/commands/export/workflow.ts index 33066fd380..0cf1d712ad 100644 --- a/packages/cli/commands/export/workflow.ts +++ b/packages/cli/commands/export/workflow.ts @@ -116,7 +116,7 @@ export class ExportWorkflowsCommand extends Command { let fileContents: string, i: number; for (i = 0; i < workflows.length; i++) { fileContents = JSON.stringify(workflows[i], null, flags.pretty ? 2 : undefined); - const filename = (flags.output!.endsWith(path.sep) ? flags.output! : flags.output + path.sep) + workflows[i].id + ".json"; + const filename = (flags.output!.endsWith(path.sep) ? flags.output! : flags.output + path.sep) + workflows[i].id + '.json'; fs.writeFileSync(filename, fileContents); } console.log('Successfully exported', i, 'workflows.'); diff --git a/packages/cli/commands/start.ts b/packages/cli/commands/start.ts index 36cd9c4547..c01ad0ed4a 100644 --- a/packages/cli/commands/start.ts +++ b/packages/cli/commands/start.ts @@ -17,11 +17,12 @@ import { Db, ExternalHooks, GenericHelpers, + IExecutionsCurrentSummary, LoadNodesAndCredentials, NodeTypes, Server, TestWebhooks, -} from "../src"; +} from '../src'; import { IDataObject } from 'n8n-workflow'; @@ -97,7 +98,7 @@ export class Start extends Command { // Wait for active workflow executions to finish const activeExecutionsInstance = ActiveExecutions.getInstance(); - let executingWorkflows = activeExecutionsInstance.getActiveExecutions(); + let executingWorkflows = activeExecutionsInstance.getActiveExecutions() as IExecutionsCurrentSummary[]; let count = 0; while (executingWorkflows.length !== 0) { @@ -132,7 +133,7 @@ export class Start extends Command { await (async () => { try { // Start directly with the init of the database to improve startup time - const startDbInitPromise = Db.init().catch(error => { + const startDbInitPromise = Db.init().catch((error: Error) => { console.error(`There was an error initializing DB: ${error.message}`); processExistCode = 1; @@ -171,7 +172,7 @@ export class Start extends Command { const redisDB = config.get('queue.bull.redis.db'); const redisConnectionTimeoutLimit = config.get('queue.bull.redis.timeoutThreshold'); let lastTimer = 0, cumulativeTimeout = 0; - + const settings = { retryStrategy: (times: number): number | null => { const now = Date.now(); @@ -183,7 +184,7 @@ export class Start extends Command { cumulativeTimeout += now - lastTimer; lastTimer = now; if (cumulativeTimeout > redisConnectionTimeoutLimit) { - console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + ". Exiting process."); + console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + '. Exiting process.'); process.exit(1); } } @@ -203,7 +204,7 @@ export class Start extends Command { if (redisDB) { settings.db = redisDB; } - + // This connection is going to be our heartbeat // IORedis automatically pings redis and tries to reconnect // We will be using the retryStrategy above @@ -218,13 +219,13 @@ export class Start extends Command { } }); } - + const dbType = await GenericHelpers.getConfigValue('database.type') as DatabaseType; if (dbType === 'sqlite') { const shouldRunVacuum = config.get('database.sqlite.executeVacuumOnStartup') as number; if (shouldRunVacuum) { - Db.collections.Execution!.query("VACUUM;"); + Db.collections.Execution!.query('VACUUM;'); } } @@ -283,7 +284,7 @@ export class Start extends Command { Start.openBrowser(); } this.log(`\nPress "o" to open in Browser.`); - process.stdin.on("data", (key : string) => { + process.stdin.on('data', (key: string) => { if (key === 'o') { Start.openBrowser(); inputText = ''; diff --git a/packages/cli/commands/update/workflow.ts b/packages/cli/commands/update/workflow.ts index 6f9e8de2ff..06be05759d 100644 --- a/packages/cli/commands/update/workflow.ts +++ b/packages/cli/commands/update/workflow.ts @@ -9,7 +9,7 @@ import { import { Db, GenericHelpers, -} from "../../src"; +} from '../../src'; export class UpdateWorkflowCommand extends Command { diff --git a/packages/cli/commands/webhook.ts b/packages/cli/commands/webhook.ts index b17db917bd..68c5876543 100644 --- a/packages/cli/commands/webhook.ts +++ b/packages/cli/commands/webhook.ts @@ -17,7 +17,7 @@ import { NodeTypes, TestWebhooks, WebhookServer, -} from "../src"; +} from '../src'; import { IDataObject } from 'n8n-workflow'; @@ -98,7 +98,7 @@ export class Webhook extends Command { // Wrap that the process does not close but we can still use async await (async () => { if (config.get('executions.mode') !== 'queue') { - /** + /** * It is technically possible to run without queues but * there are 2 known bugs when running in this mode: * - Executions list will be problematic as the main process @@ -154,7 +154,7 @@ export class Webhook extends Command { const redisDB = config.get('queue.bull.redis.db'); const redisConnectionTimeoutLimit = config.get('queue.bull.redis.timeoutThreshold'); let lastTimer = 0, cumulativeTimeout = 0; - + const settings = { retryStrategy: (times: number): number | null => { const now = Date.now(); @@ -166,7 +166,7 @@ export class Webhook extends Command { cumulativeTimeout += now - lastTimer; lastTimer = now; if (cumulativeTimeout > redisConnectionTimeoutLimit) { - console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + ". Exiting process."); + console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + '. Exiting process.'); process.exit(1); } } @@ -186,7 +186,7 @@ export class Webhook extends Command { if (redisDB) { settings.db = redisDB; } - + // This connection is going to be our heartbeat // IORedis automatically pings redis and tries to reconnect // We will be using the retryStrategy above @@ -201,7 +201,7 @@ export class Webhook extends Command { } }); } - + await WebhookServer.start(); // Start to get active workflows and run their triggers diff --git a/packages/cli/commands/worker.ts b/packages/cli/commands/worker.ts index b2b78c4c7a..573014cf62 100644 --- a/packages/cli/commands/worker.ts +++ b/packages/cli/commands/worker.ts @@ -35,7 +35,7 @@ import { ResponseHelper, WorkflowCredentials, WorkflowExecuteAdditionalData, -} from "../src"; +} from '../src'; import * as config from '../config'; import * as Bull from 'bull'; @@ -241,7 +241,7 @@ export class Worker extends Command { cumulativeTimeout += now - lastTimer; lastTimer = now; if (cumulativeTimeout > redisConnectionTimeoutLimit) { - console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + ". Exiting process."); + console.error('Unable to connect to Redis after ' + redisConnectionTimeoutLimit + '. Exiting process.'); process.exit(1); } } diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index 2e68824f62..39fb76cc18 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -92,9 +92,7 @@ import { import { FindManyOptions, FindOneOptions, - LessThan, LessThanOrEqual, - MoreThanOrEqual, Not, } from 'typeorm'; From b7c64c6031d8de9a1788ba407656881bd19bb3f2 Mon Sep 17 00:00:00 2001 From: Brian Thomas Smith Date: Thu, 25 Mar 2021 11:24:56 +0100 Subject: [PATCH 078/137] :zap: Update QuestDB logo, use 60x60 png (#1579) --- packages/nodes-base/nodes/QuestDb/questdb.png | Bin 2835 -> 6279 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/nodes-base/nodes/QuestDb/questdb.png b/packages/nodes-base/nodes/QuestDb/questdb.png index 5be1906e5d9d408257f4d2831489dc310126ecaf..3ff95d14a7b76b338b745629af97d587b5bfa5e1 100644 GIT binary patch literal 6279 zcmZ{IbzD^4_wEcOAt4Az@DToro5CZ~3cXxwyBPF6RgoMC=v`BY%OLr<< zeBbZ=zVE%id-wUAv!A`z^Q^V@+UIlrI1w7^iukzHxBvhEUs*{`>wXsdb7N!OKSh2` zJKj$imeOj{06=9N-Y+QT{hA)8q@@M`c(MQh{=opi^}We|3jlE80RXm5?p0|30EK;4 zgXW(=8s_@S7HVn$_Ir#CKm!s3(C-oO{sM$q0Wki;0Kk2u`+@!*_>cEJ+JC)b@6rFk ze~9U5-(>&*G#)D*eP?|&RS_7%mK$n@Fg53Px3&L60EoGZ+(TP)XDGe9t&N?Nh`TuB zUks6Z{KpJtr2mWJ{8pS%UrmEv7U5`4|BRc5n}<;Xm!6(p%+bt3L`zQLKl1yPI3wKI z*_E(nw;rOS{e+l*f5eohv!hbpbZ=o#0 z2H~h}4~3aaK>m~KU#5St|5PpV!qLk7zM+5G_J{sIZ2#elf&cXMUp@Z&0ROVypP&S; z82G<$g9L769&RT9K<23|C#?g=+%xb<(v|lt|I~<@QwHL&RmSN(^@}>FE(8$NQr|jN@$CX(uF0kdjj7T zeg5}Cql&KYw}y)*yTaGhPlSI6zr66Ovzz~PaN~RCbLL|_?jz%^+nfBndMtM*t9HQ%-C@MBIJ8|MtIh6n6MxvS?iJOLI#eTsY*8x4^HXLj5f zN!T9E6Q=ARpw-|e(Dm0!h@B}hD@1`BI#d|VRD=~F_mrx@@6CwAF#IG>XB*#kZDpke zzE?#NT8qUv^pjFGj>yEz{yED{bHuBd{MR8@kxmFY$)Qv~_UhXY#i&YTyg;@{pJK#I z3=FlId?0_>bLbFue{tLpe6~m zv#~#9);c8}6FE{Uaey2aW^KmKX!xYiK%!zW8Oo>?kzzozSC~KvJkuFBW$xeinwX|o z8o{eZ@JJk7KDu@eHn^Jzhx?+H<<5H>dp*DC^*bQ3H+QW^cI|^a`soGT)J!`%s$w5l z!7BKl7HjUNnkJBQ%76BUJ$8-GvC6b9mk>ldExjgXAsysrdD$S-sgEWKBPnN3zg#|J z%{m=9(_eKTVAf@j9=Xvq@%5n~!HE2DIuI=yC+0iZEnE|Ocd`CNxF9Vltb_WkHtPr+ zzaq(>chpAP^E?o2#HBx5{95bn!n6}Tk4dmcdo`4pq|E#ktI@|*2Bh;~`J>x7MZe2i zC9Ryt7&kh^H)p!n7&fg~0lu3wf^>Wukzv+FezwYrVG3vfE^534sn4VRt`b#oUSnPh z+C*LmW;7|U&O$RXBaO{#sqwGoBs8i!K}Y*Ya)VcZ^uxTl2N`%xk&PPQBfGh+7&XZ;9~hCLDbD| z@wk){92pZ5*o9q{2GnAK2_9!ce_+`n>e5j`7tdsFk_sd`OeP>lQ4+-t??bEi0Hisf!}k4a(PbTx-S zOB-HsDnMgXBT$FdWQJR7FGZmiP0owa8PbL8f)S5x37DH5QrdY$nO4lu;t9y<)x(a{ zD4HdYxI`pVihZl`MZMC~w?u>VicQRs{~$Cxc17#}01-wTu-wZ{voXeK>0x zixlK-MT_n~11n$oAhcEQfFmxUon4}HE@K$XYtvdni{0oft?j##IIG8Jxiz*PMGku= zhH%bqDbmxn(3AjQq0?N@&tKEXk878)ezG1z-L+k9K0veO!V8sAU3?NA@#F0iyC&HC zo!>+ObW{m3pS^-GU3mS^x;zx8RdHtw^`D;xCJZ#q&RmD}XI;63pz$XT;Il@CtXf1# z<%|!NM&_zJ>okdedUlZWXvdx9;Tn%n$+xMi?F~IS*i0@zL9TN)-(0y58|(V`Bb0km z2M^igWzYQZyWquo$Mr1v-)f3nOFg?NpVo^(+O^A*C}nvRPH9D4D6@=O^`{5! z*clra>vDI7l&+lWS%j}?GBWcV&Ueojer}0>lTIt-{H@4hxJj$0Ey{krBHfr`<5Lbv zGm&cv3%D9jOZVMmIL^yDMn*0PF;MUcbF=QTtJfMa6rHfD^&b3=K2>siq3*R{4*d}x zR^B*pQdqByCyoV4fehoymgu|xkm$p69&iA@L=oZLIo36;)|Z84Paa##%5KP8L0x0w zmCETxO2ueAZ89a?rkm)>^?5JmNp1Wg0Y*Grlsctuw9HdH%A{E!USah@vYv<G`45j&;y zCRtMlM8n$rhm}?K#8bCXdD=9N-r6iyd?<`=5$K+GeUG@nFIVORgtt=mbis^6(0T_KSRX&rZ) zxQ-ITpdIAle$_;-NtujL=8nI)8wR~aOb4c?4BMdEH@~iEP+0-E-sGWSSUW9?3&Rgt zdnUNQyx&cwO93cim8y({neJ=pRmpi5&d#pqPSjQ_obYRciI3Vr-{Ql!Mu0CN3d^b` zX{t5pfq9yR)my;?miRNiBN{m=r_4c-=KZ9FPVFS6eo>AuDpVuY$|M1CSw-)wh=bQs z&$@kZzUbYwg^u9tWS^<`JPUEK#x0Y6Z2|yPWfUL_Z6@$OLR5oR4f3uZR zLD8o4^=d3@lp{;W^Pp#O&2`thefP|Y+sv57{OMv)M>c~vle}U$$61; zGa>^Dh146k9;L|)Tl1x4Hc(JM(2B92%E}fiZK=|Rv=8-Um5to9f31!-qN3tfuQzz& zrN>msYZ%;&3J@UphB_uyYl&l=AH?qZgx_m0yx`r3k`Fa+y>uTE{TSwd&_~0GC7K=C z-m^`x!tDyCX-K+E5+g7p>~VNtV8P(E`i_h7Xtqd*kqX3dRC7_j|zEz%-J4WzNDR~TJWE3U3R2zxknfK$HJL9j0CiW*XBW=RIQG0ZuJ$$A-Uy;-7e^Y`d`~V)L_qwZdF2i+<`0f*3vkKbBdlw zFVY7mawjKpo(rQ^h7C3Yag7Nh$x}afTO8x<*)(d@5{ZC&-&{&QPD>g{=>^+HLB2oK zSil=p&-TC+=R5Xx*DM_`wf8x=f#H|%nw4`<{JfDf>BrAw!+~ioj0ad$Gtx7F(om@< z$LjmlH8BCkTTIO^+5`^;pQNHB4lqHpznC%hgD=)-a0d*jv3S!RImf0DD3VaH7 ze75Azdk#W(Va#H~cxS7^MKw`*5yazk zHR5HAzq&<0IZ`Y^X>PSl%McZ=jY{+4grFc{&@BZ*Vr_xfN0T>ZGV{bu}>|pkiotT8;EE&`0DyEv(oM zdLenOWPMc#j?X{tZhnaqjDYJos4kTFICrH$Ni3)B=Ai|GST-=W zyf3R6&8D5G&F3suGCN_y9ae`XuBO@?y%fJWPKKEVB9?sxJ}&kcF@Zi;W(#4v%eVCK2zDYKU2vfzM7*s41>koM%OjEn0wHsWa; zrfi%zp=gQkQCXzPy!f%MF5ea5>$&-wM8{Y`f-eyXA%tlC4Niu#OjW4H(eQ!eVPy!d z+vUfV2FQ+^9RglPffvLg+*n^f($rIESyX`pfDvPpIra9dodw0Ejxkx0XP)|j@o=@g znflC!Zx0hjEWk313{C^>pX*cVB=zgh+eQ__H_moAoOB+~>vdXFVx;e;%j4JGX_o24 zrKmYFE=uUnb}8|iW$TfjTec;+y#d8X#cbWhO-0;R4S1D@gn4~A@_y;&CfdcjJ>2D; zKI5@+dXW80V=Y%2MH}S}s2*k38b+>1fQU%RS>Yn8Orwk4QvFbZmV>4S$tz5^>LU;R}2T<7vV1%GFv zR;C$C9B;OhJ(1R5`jhoS+>2(1E`Y$2-60JHvyfqsEQ4e(iSf9|3>+FywiyBFry@E| z;o57Y&8@lp!MnZnjsR9vrY~=;|_8HEe5ziNyEuZZ6QkkX#Nz_q}^G7U4DTVDQ zUSkewyT6`r`Q2XJ+Zz8*HAvRtMKMU~<%xr2S@c>e`X*2K8yySzRN-jtKiOrdAY2G_e*C zxHG+E4tlnFS@}-gF%L&EOqu_YgnQ&pIMew`j(`+A6KNEc3N>d%0cXE33m;-CcSW%q z_tF`oMvxu>T>h|KuaTzaX4`JUK%B+LxKYc6=LYA`dotzuh$E%uPk)H#3Ox4Mw$8G8 z9782WK${@PnMZ4)o!O4=s91@Y>7o=R7lQ2ESLLsbRPn8~TK~M;9-9k3-Cy&XEtZ^j z9e$)ev1GQQe=3&pHbo^gsC$z9O+;!P{JYaf>gK-Geg2J|fsFG-e2LAe;|7-MZf)jru+*fEtIVFEqUVxnyJ6afm9~+eNozFRb&U>qE7L zSt>Ze=M-_(hM7oQF`Pb84NJkh(@}MB!z0$axV7YOkHEEu12Mw!HPxR0r8+Gy`K1|b zXqxp8UgUWs9=IHc9WL*G#k2aTkLA>fQz)KM7RXYDD>+d{{2tE9u)*q9FCgHSRpnXX zgBS4K6?Aj<2`XW-9G!TDPj^?iYAlGzGONjfae> zEJeyP>EOwD^tBZoYOKLgZ-V(OunAID4dijxSPp1dJF6eukOUdrmun>#d{F>pY_x6t3t z_-SiLuT}M9T&7G~$fCIj2{0S;FX@o4eC}*`dXt7FYk^X$1#~(5CqhL{bf%|*Dk7)C z?^;@dzxO0srwINOXAL^gb9j>^CnKgmv7zYqdm+o#7(UVzfw6r#pA^rEFsLtpb|}BK zr$44)bzBHfnvM;ED=|E#178uvrK9DuJ_{0}46Nc5qXK`%^wtp56BIU9O9Adjk$8qporU zZb+NO9KvXd5=HD=#YFhsRgP_i1S(Yk=?!c9g%zf-d{HuxVe`htJ4D?N2{f5I-H^RI zJ1l&C5DEJgY4lNZh`oxWls-!xIzOE4Z|Et4D=vGb^m30FI}cZUs^n;3m$1D2+FJnK gxWDCYp6U|epFAr%dr>_3=Rdu&yt*7x#w7560UX7cKmY&$ literal 2835 zcmV+u3+(iXP)WmlwQHt2?&Hm}E*bBRV0G7q!a1QW~002>n0CA_HQ;Pte%+=%0+hY^xeFa~dI{<2- z0E4^TWe@6l1$?Vx)>jbz=+>&yllszj{n%Mqt=0g7wg8R7_`Y%gl*a&et>SSDUz
e!5NWn-uMq6!fwT0E)wXyHWw6(*U5(0CTkfZ?KolQIN+`0G!PLkH@dt zSn7@z0GZ2z!c>UCPw=7>@um@l$5^1zREfk>@~jR3wcG%;*8+mP0eZTU%2Rr`OXYqT z_rMSUl*gylR*uS6o6lA4eirku3--JO|Ns7z(OZ_ySNOvL0I%BsrqlqG%Z$TK;cyxN z%jf{A*Z_vW0Arzxz-oTHR`QS(0KVS%cjBr2tlr|GiCWv@ZI$DEFQaAbzlsG9Ib`005J8QchC<0s{mC0{#g8{{H^` z{tW*9{3QPVfJFV+7#05geE$8ftY=zMJt`m){{8&%*v-bVdQvq0{{8xVSvUUu{qx?k ztcZVQME?H%{{H^{{rvRt@$Ki+&8D4|hihL&C;t8Y{OID)&BDODv7MZnmxF3TJ1+kI z{{8gr?9$A}z`mWFeraJTB>nT<*wxj?#>B6mYDSJr*%<%;2RKPYK~z}7)z@b{RdE;x z@c+5zlGP=nP&Oe-T0+{|d+)vX-h1z*G$mOjg`%h^4Xc65$V!sX-t$Gz^S@5_TsIuO z>-VBhiSPYA&;OirFY-TyVOX)472_Wa^Un$(<^Ihw|EjRoBb*(F4s~>N9${UBK*VCE zdJHPo&NBuqt$CZ~SxWB#GuF*x@fDbAF*eSoOK%rvgoK3D!#q(_1FiP}$9dROpu+;= z*bo#A4ULmD8XDk%bqy@j5ilSlXgP!(*04v0My*;tK1a&p;{#dZLb$gy;o%nm1FD|dHKeB55SFRZajXf<5kMj%<9wxwi;MII3#lhiDkWtA z%*Ryj*qHV>S<43*U*G+__@YHAkZPv9aIADZmRL6|hM~f}9IXhW-v0j2bFA4q9w=~ENeZa+%mP~xT|iW2>j zX))(qZw~VSW3p@Q`Z*&ZbN24pYGUI0s{4MBxIMjCN7%nXLyJ%T{P^L+J4kceF|S^_ zZd<#7$Wmj@>dmgNy1k)NJvD@!0aA3VCl7=)qFJ$g`Gg7U;eJ<=1-@y+>d`2LAE9e{ zW?I3HYRE?nUsB?~6k7WxbnA{1uBrDt*sG8rBOjn_c7N+$6p6##9tsYlc&qZm&{S{> zt@%bPWi+%Q@I40QHzYJD{lH2+VACR^J;^}cF|@R_tj)!ptwd5H;uRl!y?;)Izl+F_ zvlc|ehxD{)jvrT6j>#KTSwp-5G<+k~=3=3y_Ja9R?^m>2Sx&9r#~yBQ+Z$77>fUW1g{1h=@Pgapjm3htbJh zCPAo*O2csLlJSp^c^+-gho(TG6Nk@VicabktylHC1RYC6THZZy%=6GBB8wrc2n(G_ zx~03MzOah{j@~}!AV9n&!HRG)ER?Iek`W4-WqKg=&`LI&r4ya(OwcXei?fK5FvsGk z>H&me&1FzWErgPzgD&0(>If?mBu&hgLczRk>(R;1MBlo2F4wa zlbve~yB4(ReyJSPSOJ2`1Vb&e>!<>B+4CqsgyA5%qUu5(2pvL*`3scnLX?C+LjZ!w z01D(m9c56ErLab3+=>DNd81is0VLhgjakA@ZDMNKiUNaqkc-xzWuI$H7-5G7E25Ky z!tu-QHUF3sc>K6+d>U1KSx0e`1;@%DCDQh_@`>}w(YJ&x30IWOO&02B^ao(bc-O?CjEAxDElubA^7_q23eQZ${-1*IykqQ{zCq1fk5c#z>1S}7WDk{eK|$|sQ~ z-mqAR51}-@D?nHYhD)}r^Z~%YhH_N@6gn#pxpz&=gGVGBT&}L}5;(X@kL(^gv{39> zKY57VIjZcT4N~q(wqgn2%v4pmYbe&w?>U~DOd4(nm2fzef(8Ly(OgZ(d+-MHdw6xG z932LtDn3NDE!)weTF z%L6G4B%l(*^bkSl=W?AMTU!Ybu3B)U8`LG0}kN?Nt)ar>pFrZ#{elleI6?t^;)G6x_P6&3m6aN!C0UBCMyg;K;6f>QfT zR5VpRa)6;uaH!P5LKISWFeu+CA;B(7IX#`0s;f*tDjAH+rV7VM9m;Ty`XhZS0Qgde z`~>4PC?y@QjUiSt56*@%QU)Dh{Lc35+_~qXMQ~{7fYjH#oHV?DLcU#07E)dj1@saS zO}dN9-3Je(%>ABYn>Bm?zOe91t5)jLLXfFMPEsNpS0yBL8WodOknR=cpM6&==c5V=Jp5+>6=RwKK_!~{eiN3ot0JKI1NS!i_qGZ?ssV)oC3i6z4)6eB9I+z8p7*w(8{3(Ax$IU|A6YJVudXT{^7l z|H;_6%WV7+iT-J~zWP&*IE5d;cvC6<9t7FwK6`q*=@Pnc^CnFJ;S|BY$zUsrK{b~D l+T@>t7-v);Q7r!d<~Qs#0@pWKjv4>}002ovPDHLkV1jqrjhFxc From bfb179e5f0b3ce067c66a90af358835f70dd7b77 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 11:42:19 +0100 Subject: [PATCH 079/137] :zap: Ignore issue as convict types are wrong --- packages/cli/src/GenericHelpers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/GenericHelpers.ts b/packages/cli/src/GenericHelpers.ts index c1f942dde8..74e9578fec 100644 --- a/packages/cli/src/GenericHelpers.ts +++ b/packages/cli/src/GenericHelpers.ts @@ -95,6 +95,7 @@ export async function getConfigValue(configKey: string): Promise Date: Thu, 25 Mar 2021 12:58:54 +0100 Subject: [PATCH 080/137] :add: Add iconv-lite for encoding/decoding for MoveBinaryData (#1473) --- .../nodes-base/nodes/MoveBinaryData.node.ts | 59 +++++++++++++++++-- packages/nodes-base/package.json | 3 +- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/MoveBinaryData.node.ts b/packages/nodes-base/nodes/MoveBinaryData.node.ts index b715bf3971..1286fab193 100644 --- a/packages/nodes-base/nodes/MoveBinaryData.node.ts +++ b/packages/nodes-base/nodes/MoveBinaryData.node.ts @@ -4,6 +4,10 @@ import { unset, } from 'lodash'; +import { + BINARY_ENCODING, +} from 'n8n-core'; + import { IExecuteFunctions } from 'n8n-core'; import { IBinaryData, @@ -13,6 +17,18 @@ import { INodeTypeDescription, } from 'n8n-workflow'; +import * as iconv from 'iconv-lite'; +iconv.encodingExists('utf8'); +const bomAware: string[] = []; +const encodeDecodeOptions: INodePropertyOptions[] = []; +Object.keys((iconv as any).encodings).forEach(encoding => { + if(!(encoding.startsWith('_') || typeof (iconv as any).encodings[encoding] == 'string')) { // only encodings without direct alias or internals + if((iconv as any).encodings[encoding].bomAware) { + bomAware.push(encoding); + } + encodeDecodeOptions.push({ name: encoding, value: encoding}); + } +}); export class MoveBinaryData implements INodeType { description: INodeTypeDescription = { @@ -189,17 +205,47 @@ export class MoveBinaryData implements INodeType { { displayName: 'Encoding', name: 'encoding', - type: 'string', + type: 'options', + options: encodeDecodeOptions, displayOptions: { show: { '/mode': [ 'binaryToJson', + 'jsonToBinary', ], }, }, default: 'utf8', description: 'Set the encoding of the data stream', }, + { + displayName: 'Strip BOM', + name: 'stripBOM', + displayOptions: { + show: { + '/mode': [ + 'binaryToJson', + ], + encoding: bomAware + }, + }, + type: 'boolean', + default: true, + }, + { + displayName: 'Add BOM', + name: 'addBOM', + displayOptions: { + show: { + '/mode': [ + 'jsonToBinary', + ], + encoding: bomAware + }, + }, + type: 'boolean', + default: false, + }, { displayName: 'File Name', name: 'fileName', @@ -336,19 +382,19 @@ export class MoveBinaryData implements INodeType { continue; } - const encoding = (options.encoding as BufferEncoding) || 'utf8'; + const encoding = (options.encoding as string) || 'utf8'; let convertedValue = value.data; if (setAllData === true) { // Set the full data - convertedValue = Buffer.from(convertedValue, 'base64').toString(encoding); + convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, {stripBOM: options.stripBOM as boolean}); newItem.json = JSON.parse(convertedValue); } else { // Does get added to existing data so copy it first newItem.json = JSON.parse(JSON.stringify(item.json)); if (options.keepAsBase64 !== true) { - convertedValue = Buffer.from(convertedValue, 'base64').toString(encoding); + convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, {stripBOM: options.stripBOM as boolean}); } if (options.jsonParse) { @@ -372,6 +418,7 @@ export class MoveBinaryData implements INodeType { const convertAllData = this.getNodeParameter('convertAllData', itemIndex) as boolean; const destinationKey = this.getNodeParameter('destinationKey', itemIndex) as string; + const encoding = (options.encoding as string) || 'utf8'; let value: IDataObject | string = item.json; if (convertAllData === false) { const sourceKey = this.getNodeParameter('sourceKey', itemIndex) as string; @@ -396,7 +443,7 @@ export class MoveBinaryData implements INodeType { value = JSON.stringify(value); } - value = Buffer.from(value as string).toString('base64'); + value = iconv.encode(value as string, encoding, {addBOM: options.addBOM as boolean}).toString(BINARY_ENCODING); } const convertedValue: IBinaryData = { @@ -437,4 +484,4 @@ export class MoveBinaryData implements INodeType { return [returnData]; } -} +} \ No newline at end of file diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index b4317f1f93..2d97909a8c 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -589,6 +589,7 @@ "get-system-fonts": "^2.0.2", "glob-promise": "^3.4.0", "gm": "^1.23.1", + "iconv-lite": "^0.6.2", "imap-simple": "^4.3.0", "iso-639-1": "^2.1.3", "jsonwebtoken": "^8.5.1", @@ -639,4 +640,4 @@ "json" ] } -} +} \ No newline at end of file From 3db1cdbe843ef3b2d75e10b8e9014c48e40e3bf1 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 12:59:57 +0100 Subject: [PATCH 081/137] :zap: Minor improvements to MoveBinaryData encoding --- .../nodes-base/nodes/MoveBinaryData.node.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/MoveBinaryData.node.ts b/packages/nodes-base/nodes/MoveBinaryData.node.ts index 1286fab193..f31f326c59 100644 --- a/packages/nodes-base/nodes/MoveBinaryData.node.ts +++ b/packages/nodes-base/nodes/MoveBinaryData.node.ts @@ -13,23 +13,32 @@ import { IBinaryData, IDataObject, INodeExecutionData, + INodePropertyOptions, INodeType, INodeTypeDescription, } from 'n8n-workflow'; import * as iconv from 'iconv-lite'; iconv.encodingExists('utf8'); + +// Create options for bomAware and encoding const bomAware: string[] = []; const encodeDecodeOptions: INodePropertyOptions[] = []; Object.keys((iconv as any).encodings).forEach(encoding => { - if(!(encoding.startsWith('_') || typeof (iconv as any).encodings[encoding] == 'string')) { // only encodings without direct alias or internals - if((iconv as any).encodings[encoding].bomAware) { + if (!(encoding.startsWith('_') || typeof (iconv as any).encodings[encoding] == 'string')) { // only encodings without direct alias or internals + if ((iconv as any).encodings[encoding].bomAware) { bomAware.push(encoding); } - encodeDecodeOptions.push({ name: encoding, value: encoding}); + encodeDecodeOptions.push({ name: encoding, value: encoding }); } }); +encodeDecodeOptions.sort((a, b) => { + if (a.name < b.name) { return -1; } + if (a.name > b.name) { return 1; } + return 0; +}); + export class MoveBinaryData implements INodeType { description: INodeTypeDescription = { displayName: 'Move Binary Data', @@ -387,14 +396,14 @@ export class MoveBinaryData implements INodeType { if (setAllData === true) { // Set the full data - convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, {stripBOM: options.stripBOM as boolean}); + convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, { stripBOM: options.stripBOM as boolean }); newItem.json = JSON.parse(convertedValue); } else { // Does get added to existing data so copy it first newItem.json = JSON.parse(JSON.stringify(item.json)); if (options.keepAsBase64 !== true) { - convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, {stripBOM: options.stripBOM as boolean}); + convertedValue = iconv.decode(Buffer.from(convertedValue, BINARY_ENCODING), encoding, { stripBOM: options.stripBOM as boolean }); } if (options.jsonParse) { @@ -443,7 +452,7 @@ export class MoveBinaryData implements INodeType { value = JSON.stringify(value); } - value = iconv.encode(value as string, encoding, {addBOM: options.addBOM as boolean}).toString(BINARY_ENCODING); + value = iconv.encode(value as string, encoding, { addBOM: options.addBOM as boolean }).toString(BINARY_ENCODING); } const convertedValue: IBinaryData = { @@ -484,4 +493,4 @@ export class MoveBinaryData implements INodeType { return [returnData]; } -} \ No newline at end of file +} From 0272cec01d2a2fb1d6c245daef54d3d2e52785a3 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 13:19:11 +0100 Subject: [PATCH 082/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/MoveBinaryData.node.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/nodes/MoveBinaryData.node.ts b/packages/nodes-base/nodes/MoveBinaryData.node.ts index f31f326c59..666f8c3790 100644 --- a/packages/nodes-base/nodes/MoveBinaryData.node.ts +++ b/packages/nodes-base/nodes/MoveBinaryData.node.ts @@ -24,9 +24,10 @@ iconv.encodingExists('utf8'); // Create options for bomAware and encoding const bomAware: string[] = []; const encodeDecodeOptions: INodePropertyOptions[] = []; -Object.keys((iconv as any).encodings).forEach(encoding => { - if (!(encoding.startsWith('_') || typeof (iconv as any).encodings[encoding] == 'string')) { // only encodings without direct alias or internals - if ((iconv as any).encodings[encoding].bomAware) { +const encodings = (iconv as any).encodings; // tslint:disable-line:no-any +Object.keys(encodings).forEach(encoding => { + if (!(encoding.startsWith('_') || typeof encodings[encoding] === 'string')) { // only encodings without direct alias or internals + if (encodings[encoding].bomAware) { bomAware.push(encoding); } encodeDecodeOptions.push({ name: encoding, value: encoding }); @@ -235,7 +236,7 @@ export class MoveBinaryData implements INodeType { '/mode': [ 'binaryToJson', ], - encoding: bomAware + encoding: bomAware, }, }, type: 'boolean', @@ -249,7 +250,7 @@ export class MoveBinaryData implements INodeType { '/mode': [ 'jsonToBinary', ], - encoding: bomAware + encoding: bomAware, }, }, type: 'boolean', From be83c240baad3ef5b043420e6980c4d8699bb427 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 15:16:38 +0100 Subject: [PATCH 083/137] :whale: Allow manual rpi docker image build --- .github/workflows/docker-images-rpi.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-images-rpi.yml b/.github/workflows/docker-images-rpi.yml index 155fd61158..1eeb66ecdb 100644 --- a/.github/workflows/docker-images-rpi.yml +++ b/.github/workflows/docker-images-rpi.yml @@ -4,6 +4,12 @@ on: push: tags: - n8n@* + workflow_dispatch: + inputs: + version: + description: 'n8n version to build docker image for.' + required: true + default: '0.112.0' jobs: armv7_job: @@ -28,7 +34,7 @@ jobs: run: | docker buildx build \ --platform linux/arm/v7 \ - --build-arg N8N_VERSION=${{steps.vars.outputs.tag}} \ - -t ${{ secrets.DOCKER_USERNAME }}/n8n:${{steps.vars.outputs.tag}}-rpi \ + --build-arg N8N_VERSION=${{github.event.inputs.version || steps.vars.outputs.tag}} \ + -t ${{ secrets.DOCKER_USERNAME }}/n8n:${{github.event.inputs.version || steps.vars.outputs.tag}}-rpi \ -t ${{ secrets.DOCKER_USERNAME }}/n8n:latest-rpi \ --output type=image,push=true docker/images/n8n-rpi From 1a2b3dfbdc6a2c28ae55f7c404671904b1452c31 Mon Sep 17 00:00:00 2001 From: mjysci Date: Thu, 25 Mar 2021 22:19:16 +0800 Subject: [PATCH 084/137] :bug: Fix rpi docker image permission issue (#1293) --- docker/images/n8n-rpi/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docker/images/n8n-rpi/Dockerfile b/docker/images/n8n-rpi/Dockerfile index 7497d532e6..674fff1d39 100644 --- a/docker/images/n8n-rpi/Dockerfile +++ b/docker/images/n8n-rpi/Dockerfile @@ -15,6 +15,5 @@ ENV NODE_ENV production WORKDIR /data -USER node - -CMD n8n +CMD chown -R node:node /home/node/.n8n \ +&& gosu node n8n From 0f9429b2613d290a6932b8014df43cd43cacb576 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 17:10:02 +0100 Subject: [PATCH 085/137] :zap: Fix conflicts --- packages/nodes-base/nodes/Asana/Asana.node.ts | 2 +- .../nodes/Asana/AsanaTrigger.node.ts | 2 +- packages/nodes-base/nodes/Asana/asana.png | Bin 1730 -> 0 bytes packages/nodes-base/nodes/Asana/asana.svg | 18 ++++++++++ packages/nodes-base/nodes/Github/github.svg | 2 +- .../nodes-base/nodes/Gitlab/Gitlab.node.ts | 2 +- .../nodes/Gitlab/GitlabTrigger.node.ts | 2 +- packages/nodes-base/nodes/Gitlab/gitlab.png | Bin 1125 -> 0 bytes packages/nodes-base/nodes/Gitlab/gitlab.svg | 15 ++++++++ .../nodes/Google/Calendar/googleCalendar.svg | 2 +- .../nodes/Google/Drive/googleDrive.svg | 2 +- .../nodes/Google/Sheet/GoogleSheets.node.ts | 2 +- .../nodes/Google/Sheet/googleSheets.svg | 20 +++++++++++ .../nodes/Google/Sheet/googlesheets.png | Bin 1094 -> 0 bytes packages/nodes-base/nodes/Hubspot/hubspot.svg | 2 +- packages/nodes-base/nodes/Jira/jira.svg | 2 +- .../nodes/Mailchimp/Mailchimp.node.ts | 2 +- .../nodes/Mailchimp/MailchimpTrigger.node.ts | 2 +- .../nodes-base/nodes/Mailchimp/mailchimp.png | Bin 1136 -> 0 bytes .../nodes-base/nodes/Mailchimp/mailchimp.svg | 19 ++++++++++ .../nodes/MessageBird/MessageBird.node.ts | 2 +- .../nodes/MessageBird/messagebird.png | Bin 1305 -> 0 bytes .../nodes/MessageBird/messagebird.svg | 11 ++++++ .../Microsoft/Excel/MicrosoftExcel.node.ts | 2 +- .../nodes/Microsoft/Excel/excel.png | Bin 1964 -> 0 bytes .../nodes/Microsoft/Excel/excel.svg | 34 ++++++++++++++++++ .../nodes/MondayCom/MondayCom.node.ts | 2 +- .../nodes-base/nodes/MondayCom/mondayCom.png | Bin 1420 -> 0 bytes .../nodes-base/nodes/MondayCom/mondayCom.svg | 11 ++++++ .../nodes-base/nodes/PayPal/PayPal.node.ts | 2 +- .../nodes/PayPal/PayPalTrigger.node.ts | 2 +- packages/nodes-base/nodes/PayPal/paypal.png | Bin 862 -> 0 bytes packages/nodes-base/nodes/PayPal/paypal.svg | 12 +++++++ packages/nodes-base/nodes/Redis/Redis.node.ts | 2 +- packages/nodes-base/nodes/Redis/redis.png | Bin 1419 -> 0 bytes packages/nodes-base/nodes/Redis/redis.svg | 17 +++++++++ .../nodes/Salesforce/salesforce.svg | 2 +- packages/nodes-base/nodes/Slack/slack.svg | 2 +- .../nodes-base/nodes/Telegram/telegram.svg | 2 +- packages/nodes-base/nodes/Xero/Xero.node.ts | 2 +- packages/nodes-base/nodes/Xero/xero.png | Bin 4586 -> 0 bytes packages/nodes-base/nodes/Xero/xero.svg | 16 +++++++++ 42 files changed, 195 insertions(+), 22 deletions(-) delete mode 100644 packages/nodes-base/nodes/Asana/asana.png create mode 100644 packages/nodes-base/nodes/Asana/asana.svg delete mode 100644 packages/nodes-base/nodes/Gitlab/gitlab.png create mode 100644 packages/nodes-base/nodes/Gitlab/gitlab.svg create mode 100644 packages/nodes-base/nodes/Google/Sheet/googleSheets.svg delete mode 100644 packages/nodes-base/nodes/Google/Sheet/googlesheets.png delete mode 100644 packages/nodes-base/nodes/Mailchimp/mailchimp.png create mode 100644 packages/nodes-base/nodes/Mailchimp/mailchimp.svg delete mode 100644 packages/nodes-base/nodes/MessageBird/messagebird.png create mode 100644 packages/nodes-base/nodes/MessageBird/messagebird.svg delete mode 100644 packages/nodes-base/nodes/Microsoft/Excel/excel.png create mode 100644 packages/nodes-base/nodes/Microsoft/Excel/excel.svg delete mode 100644 packages/nodes-base/nodes/MondayCom/mondayCom.png create mode 100644 packages/nodes-base/nodes/MondayCom/mondayCom.svg delete mode 100644 packages/nodes-base/nodes/PayPal/paypal.png create mode 100644 packages/nodes-base/nodes/PayPal/paypal.svg delete mode 100644 packages/nodes-base/nodes/Redis/redis.png create mode 100644 packages/nodes-base/nodes/Redis/redis.svg delete mode 100644 packages/nodes-base/nodes/Xero/xero.png create mode 100644 packages/nodes-base/nodes/Xero/xero.svg diff --git a/packages/nodes-base/nodes/Asana/Asana.node.ts b/packages/nodes-base/nodes/Asana/Asana.node.ts index e0fed24e1b..c2ed508654 100644 --- a/packages/nodes-base/nodes/Asana/Asana.node.ts +++ b/packages/nodes-base/nodes/Asana/Asana.node.ts @@ -28,7 +28,7 @@ export class Asana implements INodeType { description: INodeTypeDescription = { displayName: 'Asana', name: 'asana', - icon: 'file:asana.png', + icon: 'file:asana.svg', group: ['input'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Asana/AsanaTrigger.node.ts b/packages/nodes-base/nodes/Asana/AsanaTrigger.node.ts index 6e51b75993..78c00c2fcd 100644 --- a/packages/nodes-base/nodes/Asana/AsanaTrigger.node.ts +++ b/packages/nodes-base/nodes/Asana/AsanaTrigger.node.ts @@ -25,7 +25,7 @@ export class AsanaTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'Asana Trigger', name: 'asanaTrigger', - icon: 'file:asana.png', + icon: 'file:asana.svg', group: ['trigger'], version: 1, description: 'Starts the workflow when Asana events occure.', diff --git a/packages/nodes-base/nodes/Asana/asana.png b/packages/nodes-base/nodes/Asana/asana.png deleted file mode 100644 index c4d8a22b0cf33dc882d1fd47aef86d50ea59247d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1730 zcmXAp3pmu-8^@>Gtz7>}8%yibv&g!X+)6`2u9=Y;Gh^Nl>_0A#(=g7{x_5KubpQjw(~Z%((Rn9w3MY@%f6vLx9AG&r)C!TTyrz5ZF+- z1Oy9UNhll>h2*2*Gc>?DuPCttL@q33L#IXXSu&ufDr7DIPujRbQfemyY6>ho1xP%E z8w)66_&iZj-~?z=We7e=1WNe@P7sF=r(pn|t|S0)1xhA>ngHmDfEWoVDIiz~$man4 zzkqgeLv^qi5W@lW0-&UBlpwGHH4BiFpcp=!Ox>u+lER|XAczTZ&Hz#@AVx!6<;x{d zTqGc{U@0Cjvmy3*C^7+%;^6pjBptf}mXZO&(x9k#C^`;KU;#oH2ntc60Mr~1ngJ;3 z8^X^8gODtUlMD%>;3Nioo`78Ng7^YJ5+Io;kSt#~F+>Spi5kg0rYLrRA`&6?IYj1y zTy#?uI)$288Y+JVFD?*+Lv2yld3!xGL^7+h@ClkMQcC@wq zueqtAzPhUHQel2xUV0Lhf;)NK!*ZXtUwVoq3bo~{_L2#eMHTyU#)QWtooeerF#v|-;aVNL_# z#wNX-ACj3Bk>U&*PK{X_i0a?$kfXR2DVA#BoK_^NgE85)Uoa-S4;dd>3B0WBu`6h~ zdLL%KXqtXorW1ImNpq1@+z?LC8ErgCJ?hzj78sXJOql2IFv8jC6J8sQgsC*9I*wi1 zWL;_IO)mM~f=Kt@!fLH< zD{*}DH?#*4^^4LWfmqL`)3S~IkYibNy^Yx>(VCYY=_5TPt)kvm*l-Wq_ZW)Dt-=7W z@j2)BMPuwoIlcbqEqPSCOZ(F$!sXtGt&jG@4%RMD=J%lQNX$M{|HzLyH>fl*zEX>^KyjJtlW*~cA^c=6t>W(P=k~RKQgl^ixP@M6r;djiBxsUG;3wvX3 zvuqB@zp3o2+|(VB?P0*Tuq!pt_=Op^)$hulrgpPz##8t&N<2qhb~rx>=UeV}#CI;ztwyQ}SM`pxTb$ap?+N>3RcYmd2 zaJH6(*LXxl?uT_BcIxeytwuLzQNqz1UX7L(`sKTc?cCLdxW)tVZa-l$zs`*71!`B= zhi)Gz%Xq-;X)3(At4@>gGpokt#1i|R_nQn;Pqh}~o7Ug9DT0WfQWC}~me%g|YSxv< zR))*mzQbx3^$wYGS{nOaL=^wnDY}>$Qb77X*=V7otWTqVe3Q4lbjo;Vak*~Cu)z!7 z4?gw3rM-6FA+w(nRS@}=NR#$Mm235%J5_v0ozB(u_ZobnC5w-b&Z76rLTzhD9FtR# z`v*e!8qswj#Z4CnYRoKrnj}WM6aR~>WY#WRs}s1aI-^{ zYb&obR`zC8lVPi-_Q}@FRHdZ0V?BY{hkU0mbfu_Vb7U|MoE?Vdq_VHb-0TZ&L*qZo UY5Ic`%9exjIgatT>c&j@7ckF+w*UYD diff --git a/packages/nodes-base/nodes/Asana/asana.svg b/packages/nodes-base/nodes/Asana/asana.svg new file mode 100644 index 0000000000..8d5b10f3e4 --- /dev/null +++ b/packages/nodes-base/nodes/Asana/asana.svg @@ -0,0 +1,18 @@ + + + asana_node_icon + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Github/github.svg b/packages/nodes-base/nodes/Github/github.svg index 933c133ff3..811c46c1c9 100644 --- a/packages/nodes-base/nodes/Github/github.svg +++ b/packages/nodes-base/nodes/Github/github.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts index cd429b48f0..6056af734b 100644 --- a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts +++ b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts @@ -17,7 +17,7 @@ export class Gitlab implements INodeType { description: INodeTypeDescription = { displayName: 'GitLab', name: 'gitlab', - icon: 'file:gitlab.png', + icon: 'file:gitlab.svg', group: ['input'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Gitlab/GitlabTrigger.node.ts b/packages/nodes-base/nodes/Gitlab/GitlabTrigger.node.ts index 9839e68532..66412981ec 100644 --- a/packages/nodes-base/nodes/Gitlab/GitlabTrigger.node.ts +++ b/packages/nodes-base/nodes/Gitlab/GitlabTrigger.node.ts @@ -18,7 +18,7 @@ export class GitlabTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'GitLab Trigger', name: 'gitlabTrigger', - icon: 'file:gitlab.png', + icon: 'file:gitlab.svg', group: ['trigger'], version: 1, subtitle: '={{$parameter["owner"] + "/" + $parameter["repository"] + ": " + $parameter["events"].join(", ")}}', diff --git a/packages/nodes-base/nodes/Gitlab/gitlab.png b/packages/nodes-base/nodes/Gitlab/gitlab.png deleted file mode 100644 index 9aae9cc6f4810e2880526c7e2b97d72d1038a4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$j1TY$aRqW8yJ$Z1)cD${`e&}{ zQ+JJz#cF>Rt37ho{If{yv8(12H;q5@Kq4TtKnI_z6=Y|p zC&UC9>B!6c{rdjR{mW-hFP=B8r@NylTu<^eBkO4f2Bt($7sn8f<8P-%21_}Lw6YuV zC@IbE=-}>pAT{0P@w6i|YU9`2CMKjz^%a@^=l?06a{sI~?=pMz_kFNEw{!Wc)%&(P zyt@2+f2D%Yku$mHtX1X(YzeOv-X=TgV58>#9k1s%Wt!V_9lo(X{p4|0U}%t@%|Q!Mvt;@Alr5gbnSc2ZE+e-m(0kf{s@EftKx)nwQL6Q^|5|^^QFY zH(cavI52ySkdNB4$k(L@TB;)tzX(=4sWmOZw4)?Otd8Yk!f`SjU*zi!;_yiecai}oGYKOgc%xm)jsrRDa0 z*}C)3ygua^a&^r@p&L8xHd&nIPv3FvF-L5q^Ktcr#V-3-&1K_qsdyUO60mRCrHy*W zqpoTn<2fJwO|jWNUF&tN@BYltlnpY;r)MUnT)MKNyl-pXwSy?_auHEs^W$ugn@0@UM z$#1O)&aRTps0^RhBD3t#u^US(wM(;n*DDM7B&P}%rL^AR`l@&NwMR|lggi$p35OM_ zC*l&ai)1I;i@Xfe$x;2V_R7Ysm9la1ZXpR__g+ZcTekIHN!+@}r?huHoU5Is`{iKf z&Zep1TdiVNgnyiJxag>MzWBnp=*| + + gitlab_node_icon + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Google/Calendar/googleCalendar.svg b/packages/nodes-base/nodes/Google/Calendar/googleCalendar.svg index c139a747d2..634c13601d 100644 --- a/packages/nodes-base/nodes/Google/Calendar/googleCalendar.svg +++ b/packages/nodes-base/nodes/Google/Calendar/googleCalendar.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Google/Drive/googleDrive.svg b/packages/nodes-base/nodes/Google/Drive/googleDrive.svg index 8d09ca1271..8ca43d996d 100644 --- a/packages/nodes-base/nodes/Google/Drive/googleDrive.svg +++ b/packages/nodes-base/nodes/Google/Drive/googleDrive.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts index 6d941c8ee4..ac3750e9fa 100644 --- a/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts +++ b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts @@ -29,7 +29,7 @@ export class GoogleSheets implements INodeType { description: INodeTypeDescription = { displayName: 'Google Sheets ', name: 'googleSheets', - icon: 'file:googlesheets.png', + icon: 'file:googleSheets.svg', group: ['input', 'output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Google/Sheet/googleSheets.svg b/packages/nodes-base/nodes/Google/Sheet/googleSheets.svg new file mode 100644 index 0000000000..b09ceb2ac8 --- /dev/null +++ b/packages/nodes-base/nodes/Google/Sheet/googleSheets.svg @@ -0,0 +1,20 @@ + + + google_sheets_node_icon + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Google/Sheet/googlesheets.png b/packages/nodes-base/nodes/Google/Sheet/googlesheets.png deleted file mode 100644 index 3d469791278fc576b1a8093014601e7dd5c51176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmV-M1iAZ(P)npHUafbrGjv z{r>*^|NY48+qKulCeeT<&wduVZ5gg;3Z`7``1I24-ofbCvev|ho|9^_koNWU!|K_= z=GL{>#(d4Ddds6`u8kzEYz3B40F6fmctinvLihdq;PUCu?cRi?mTt3?R>Y7Ds9gY_ zPXGP>_4)bl@$l8|;l}FOtKh|Pw3TPDk2te<8mnXjk4poFM*wp@{Q3Lx`uFDS=-ct< z;^N}V)6b^RyqDU#i_x!U&Yp{=nO@77Z>Wq=zKbTXZ4tL<51LpeYf1o|NdRdz@$>WM z^zQ2H>(=h$*V)<1Y`jUh%#EJpU)Z9I9Kl6D?fY7{IhqXit;non4M= z1c+GH@0ay3)W>@gR&L)pHXh_YpHcdh#s9G&uVB1hIH#0*j>pPn#NaZ<4YkX1hH(N0 zv0i+yzbAU6OmhTm9HMlJo+jXuil2NKmP&=Q!}WH0sgQ!NVDSYNPv2x150iF752H1^ z&_~8Rt>7sSO#={dH@-OJ2u!xY>Sdlc8q;oIHG&zNmdO!*Mh%eKX*+ zP)r@{5*~ZB!2m$0Wv~zt*9Sug!ibxLNQ)Obyu9giI2=OJy(>7h1oe>+F*8I3k`{|4 z>GxZjqM{^x-y=#G&i5;=ulF}Mm-vUbv3PkONSFf^13nWgS=O+H#rZD`N6S3kqaXWw zjl%Z0B8sxk#aUfj`>{yjdp85*=OO0ec*(N0gL{-ti`&&W;G}Z \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Jira/jira.svg b/packages/nodes-base/nodes/Jira/jira.svg index c1ee7fe198..edf23f5aea 100644 --- a/packages/nodes-base/nodes/Jira/jira.svg +++ b/packages/nodes-base/nodes/Jira/jira.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Mailchimp/Mailchimp.node.ts b/packages/nodes-base/nodes/Mailchimp/Mailchimp.node.ts index 447ce89548..8426bae101 100644 --- a/packages/nodes-base/nodes/Mailchimp/Mailchimp.node.ts +++ b/packages/nodes-base/nodes/Mailchimp/Mailchimp.node.ts @@ -56,7 +56,7 @@ export class Mailchimp implements INodeType { description: INodeTypeDescription = { displayName: 'Mailchimp', name: 'mailchimp', - icon: 'file:mailchimp.png', + icon: 'file:mailchimp.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Mailchimp/MailchimpTrigger.node.ts b/packages/nodes-base/nodes/Mailchimp/MailchimpTrigger.node.ts index 5a9e039c10..b0f25a882a 100644 --- a/packages/nodes-base/nodes/Mailchimp/MailchimpTrigger.node.ts +++ b/packages/nodes-base/nodes/Mailchimp/MailchimpTrigger.node.ts @@ -19,7 +19,7 @@ export class MailchimpTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'Mailchimp Trigger', name: 'mailchimpTrigger', - icon: 'file:mailchimp.png', + icon: 'file:mailchimp.svg', group: ['trigger'], version: 1, description: 'Handle Mailchimp events via webhooks', diff --git a/packages/nodes-base/nodes/Mailchimp/mailchimp.png b/packages/nodes-base/nodes/Mailchimp/mailchimp.png deleted file mode 100644 index cf751b34db7c47f92331e6c2945aa7b2aa7424f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1136 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2II1AIbUf%M=9A^$ud0$piV666=m z!1C)0$Dxz!bsNk2QxlxkMK&+#YO^tWxwG*7gS%H3%%~1CQjq4kc`hd-I?&_Eipdgu z7x((j*}~^|n1O-W#nZ(x#N+teY1c2^G7xC(zauSSu=hKkz3%hB^19Ok-kjtyQ`zaE zS2SZI+wA=QvZYfG*8de2a*C^yKdZXLF0Ik^LhNl(g~fL6(|IqI_{lh*nw{I+^Z>D_UN>w@1|TRO7Kvy45N7CnukB zQ(Ky>#=mHe?T2kmOVi@jeJ4rYUBCBh>6d#JWg@%fvaTe^E}D{i`C>3%kjaL_tV+ul zKh$!O-2KGC=4Sqq%}&;K-Cd_ugkuPwskB@wI?G#He?Q?7CCJ|Gp)srC++s zyE6QT<&me8>o#cCD{OB|%$uPG+~N_n^9 z%6;amL9e;*K3{T|C+T}YZAjH`sg~A*vZ=@B8Pz@6clM8F0)K$d_gszMj105AiJYoO ztgl!vy0GJ@hh%usW673ZD|TPs$Qi*}&~LcpxZ3$0yc6?pyB~60SbSpjpIq-vl0B(6 z<{tU9(|Z2I*|m%|PgP~VWk0*Tj$vXvuk(^!*DiSZZCN{g!*RAfjJ>7v?H}}7ol`ST z=-bd3BDh~6?jqw|K4k_+x8Db{5|^fxz1Pxi+VZ4gEmx%L)&7lVKdt-2QG0cDt+Z&0 z?is5xlb0`-PRs3B^I#>zeCv)wQ}1mtX=KcEJjN8yU%~Iul#-8QnH7So=QbRFO~VDd7hRzw&DTJl#Ga z%l@N5dPqS2!%H^xH+`1QJ*pw-6nVb3I%u+W#=l#UOZ@n@hMZ&a{#`P^<^HbOXQx*+ zms&BYe)_!c)00KVZmWF!uBmxmX};0ZNB@<=)UCbFeX9QFF>m!VCe>?VX_diwqKlW7 z?f?Hy*LtDn+Lhm?IQ#C~{~_$FP44pzRc&+HYd@7}8eem@H$FXkdEO15JEp + + mailchimp_node_icon + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/MessageBird/MessageBird.node.ts b/packages/nodes-base/nodes/MessageBird/MessageBird.node.ts index 3d82fa9920..ab1b642135 100644 --- a/packages/nodes-base/nodes/MessageBird/MessageBird.node.ts +++ b/packages/nodes-base/nodes/MessageBird/MessageBird.node.ts @@ -17,7 +17,7 @@ export class MessageBird implements INodeType { description: INodeTypeDescription = { displayName: 'MessageBird', name: 'messageBird', - icon: 'file:messagebird.png', + icon: 'file:messagebird.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/MessageBird/messagebird.png b/packages/nodes-base/nodes/MessageBird/messagebird.png deleted file mode 100644 index 006b762950d6604ab0e58a3ebf90e984f04907f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1305 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xg+bI6B3hk`{3u+q^6EQYb$Fqb0`Z}TW&b_ z-}^zkqPOjSoVabPclqS!dv2C(uD$;xw(Q>QzqM&~pR4cBRJYJmeeF@1E!)8ShQay( z-v%)C+MTap-D$>irE9Gdwtt&E^F~OQ4%<4-R^B*+t+V@d4m{vFV|PYphuMeSz6BZV zI!Dg3d@^9G{r=#y+z-Pktq1y_Hm^UBV~`uYa2pR_*`cd~Mn;z-!?$b;KXCBv%-8YN zZM*-o^>ZglY3epIiN9If%Im6qd;Thh?b;h-R8F#9dM1*|JbxG0@^vr%7oJwj;9Zg@ zJ=2?KNy{stibCNK(Zg#!e`vA<3vRg_D_!w_@`WeuGu)4ockQ1YS7^3>3%e1zH0^7I z`J9~Q>DwI^+cU0F+$*a1@Y#~e8}|}3{)^sWvdd_Tz543=^FJT1#;wq465jjaEyLxzEI2Nx`2e|Nhi>6UA@9h-Qwmce%K z$TJ~@9u6EC>zZ_zuKfM#C;PrVJa+st)sCVo-LHOB|I&Z6c`NIl71yLJZt=9fyRt88 zQP9q1B3fMG+s?Z_tk7>sd+_*qV*K4x)yEDMq$L!7xh52G;Cu6h2jMTH7A2Y{2T9Ig z_CI`^H>*G{^uFy5vpo50b_Q8(cE4TMzWhGxiuU2hoBq{!Hm*A0wB-A<=kE?MJMY%G zeSqPj#hiT$eGa~3*dr1!@5Xb_zQ9FYceZ_ck`?>P^Zxe;2|b=!9YLNFf9>Xc*sJ8f z_9avJr(J!EeEc!EdYbA>n4Lk*jUt-nsCK2}_KiCcQ_ zwcR%5$KNb$hpVD{F0v+cN64?YdVdmE zSm~eo!`Kkg_J1y0^#<<37d!Yie@;7W%&oI3OqSP5I||Jl(eT z+b+pn{PRl=S4cd59`&qYY1LJkJfHo_n-)#9toW}~(t74_)5=9#ZKisE*}c<{(S7#< zW9F4PA`u)F+3I_OR)7CfAz_v8_&fDS?UXk*9r2S|WThW|t$Nz_NUSDWXWctqztxw| zZ{EJ}{kmI4X}^lQ1+ybxwlZPW)%M51ZrULboFyt I=akR{0A)r^>i_@% diff --git a/packages/nodes-base/nodes/MessageBird/messagebird.svg b/packages/nodes-base/nodes/MessageBird/messagebird.svg new file mode 100644 index 0000000000..76a221909c --- /dev/null +++ b/packages/nodes-base/nodes/MessageBird/messagebird.svg @@ -0,0 +1,11 @@ + + + messagebird_node_icon + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Microsoft/Excel/MicrosoftExcel.node.ts b/packages/nodes-base/nodes/Microsoft/Excel/MicrosoftExcel.node.ts index 4efade884d..9953484b03 100644 --- a/packages/nodes-base/nodes/Microsoft/Excel/MicrosoftExcel.node.ts +++ b/packages/nodes-base/nodes/Microsoft/Excel/MicrosoftExcel.node.ts @@ -36,7 +36,7 @@ export class MicrosoftExcel implements INodeType { description: INodeTypeDescription = { displayName: 'Microsoft Excel', name: 'microsoftExcel', - icon: 'file:excel.png', + icon: 'file:excel.svg', group: ['input'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Microsoft/Excel/excel.png b/packages/nodes-base/nodes/Microsoft/Excel/excel.png deleted file mode 100644 index ba2b10c06305af8b06f424a16a69ed42fa1a584f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1964 zcmV;d2UGZoP)az#6OR3LLk0AUXxaz!0+L?CfRA#+6^b3_qtHy?6E0BbcLaz!9#UOD+AaX<>az-F=MIdoSYK?XPV;TT!H2`Wf0Bt)qc~Bp7L?3cRO@Lt_ zaz+3D|NQ;@A$Ld~azsCXS^ob109*k2`}-ntMjLTMAaq6mZ9Db$^(1pg0A&FC{QLL# z_cC`*`TF_1$-pLaNC0XxhNF)`d{{MjP%w5)B6>;yXDjFI>BZ2<0An2hSOC!2(yYC) zK6_R?dQ>fSOS#9su)wt%S50AL0HQUKE0)Sj}Wf1QbZn}$<_WD#&c0A?ouNC4#N<)pT% zW{z}ZjdBWaJ^(WS-s9hpshEkRk%Xa*089V?JOBVX05*SAErU{axA=7c001>~QchC< z`vuek{QddQ{3-nT^Ueu{fkHbT(1vLG->I818W8Bvv|COoBKgO^i+^??^U~3~l8S;t zZ*!g!000GBNkl9u>xGL_w_ujc75)y_aU}S_1Wfuw^K&zB0Ra@<_ z?mhlo-^2#&!L(QE2S4=T91b6Hp7Z9uKkm}3vBnzzl64aQ#-!7=OsjVpb&BioPQbXT zx)j%uLnkgA*xhTjrnI{>x^4!m^@_$*Codj6dsLsA^rx(Z*4q2GLMTf4b$G|#gXi`e zOeufLWYroB2E8OatuaFBOIWd0>kjWcapU;@UXvfHvg);3gH}t(=&ij+G=DIuD`Xk+cYb!k%vm)5BpdnWypDXSh{5L|zN3T@f9MPVO&r0>f;hg6L{ zre1InDllw%_S5HkOZoh1?#BVuR_!){O_jU0*x1HS*5BT$QKM%i;eF&HNi#A#Nf{@J zNOb@9v95(47m_fe7G@Hy?^@`1;q4m?27`9gUku6=AEVU>p(|y2YGO2i2ET=9VDxJe zSwOgn9Gx0A>M z-x6akMB)fpUuER&&^SvZYR%$cp)gXtO910GkEJ6vI6}zVV~#U_q;uX0H$tco8h8AP z4WBH!-EKPyJaWrC`hZm-lPCwFiby$U^Q=dt>rI}g2nmLorbj38e;pf&FEu$c;_9~i zYvcs6Pw6w0i+g+n5S!9KE*_5$h?q@r@bn;!CMSPj_%=;4=lVy#xQ z$+5wh99VBC3#0vt{tQDD345tlZ04Kw`8veLS04uId=XCwFHJuOS3L+{nTC%gl-L9; zc8(*F)4qrWkyt|3m!E}4gZB}7URHd>xXNs^vJi}kJS2i75z3Sjt=Z-&pLF;2xyMi- z*(a0yfG~wrV(KF@OCy+1Gr!F?^aTB^46%7%4g>W2B;FVT4(i=2co^NA;)ym)%u~r# zAU3s%2dD^cY++h>%OQB>;&g&(3n?*Fn-(B8FRP7GsU&=Pgezou`XM6Wr7cY%-S*vm zlg+-#_M^f`b_mGM2XSMQSQvs<7A$5|qRrhrkL2v3a4X?anp56zC)9IAU893kX7m&?hm zWf(y$O-Vj^b@k0eA3TUcY-S$F%oLClcjutY(Xit4ttEwpMQXKs8%4czky@zWFH*}v zHAY2RlwwoMhe9FoC0=Zn*<)ws=AO(#Y~Id20p{KeVveEu9veEm6f+2~u4a#IA(vu- zJ@%EZg&q!d!Ywm>?KbI`-(#PNJlwpLhmkYiudQ(KQI+bc{GCqn{=MqLNxxtHXr?C& z*SGK44s4Uz18m#2eftiLDu?!-Ki*?7!GX_2Xgdy%9j8$|bh{Q$%6>SKS_vo@#EKBk z%eqd~W$oJv<7xRUPk>fB%gciR!fvk!+P4iS;kMzZH6lPRTF ygx#WRU$Yob?Es8jNK|i0{@<&rHP%=|qxlJI?1yVrEEZ${0000 + + microsoft_excel_node_icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts b/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts index 413ca91531..f1aa20f977 100644 --- a/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts +++ b/packages/nodes-base/nodes/MondayCom/MondayCom.node.ts @@ -49,7 +49,7 @@ export class MondayCom implements INodeType { description: INodeTypeDescription = { displayName: 'Monday.com', name: 'mondayCom', - icon: 'file:mondayCom.png', + icon: 'file:mondayCom.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/MondayCom/mondayCom.png b/packages/nodes-base/nodes/MondayCom/mondayCom.png deleted file mode 100644 index 83a0a2c0049a1a442c76e07e405b13ca07be92b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmX|>2~<*97{{-IrlxtaR5WtQaca(3Q)Y7Qbm`r{19@d<5-+kZx-{1HDzI)GkFU^-qGBU6< z000>$-1l9}~KyurVPW~66=K$eh0Lfw?4(-SQugObp2>i8{23vCbrhpzIQr%6n1*f;d z&1g(uV5uKi!3RJs0NH{|_j-IS4QJsQh`Cz;=pn-a+$!t_x=D~r5P0GRWbn0UjI!B12jL1 zhtqmnTjl8Ag9H7~n;(@)3i7j3j&mb9hpFBhH&~b&>nrQ;{Q1YJ;}NVtXR{SX_Gdh% z0YHU$dG4k$8mGkJft|q^zN-E;N63&CM*8x#i);%28H!WYRoxr+hw6MRb84^6O6IzM zPVs1en(}s_Lx_vb&_d}N{u_Qc&G!PKTc6)R=&O5@%D!*@muiC}(RumVRgDSQ!4MgA zH0EdioKlcE0wf z^U15qY_bI-da*I-l4OA}lvS;Nd}hq8BL3F7+*zHH%!zEDaovSVY5Jj*R9sc?>Eyek zVR=Dl^$LkiTeQ%@Ha%ty@7`#kD!Wo?Hpt#l+SMc=MoN6_QE?fGt0K7WA`5}@YTT`EMju&iV)xlx{UUyQ>nU+wV~4*QhgV*y zYk1;Q*v)PW_?PMzxBRGFYjSV z=|;`RGIlC_LwE4#%9WQZKaLPK37;y=e!uCyH_pCabUE@wAhD4$L2&B)zL%$W;|qK2 zw6I_Gd1Zy7vA7klv$bNN$l+>nv{BB>1SuwMI#WerEdm|l0y?}KM*{YY_vH8&!Et&)E|Pdn+1`PiLp&&GKH^Q_B8 z#-_|sH--1s`NgA*jT`x~*E6KID|oq=*txa$v#V%F;8|Jl+QJFnYoBR@$!dUYmP-F?J>hxDt8UsIT4~<6E1i4 zpOGD6L}ykOMI57f(e3s1v)eJ9q3$#-9bfAggGPRyQTmD diff --git a/packages/nodes-base/nodes/MondayCom/mondayCom.svg b/packages/nodes-base/nodes/MondayCom/mondayCom.svg new file mode 100644 index 0000000000..5abd596adc --- /dev/null +++ b/packages/nodes-base/nodes/MondayCom/mondayCom.svg @@ -0,0 +1,11 @@ + + + monday_node_icon + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/PayPal/PayPal.node.ts b/packages/nodes-base/nodes/PayPal/PayPal.node.ts index 0fbc56d80b..f22e1c93f3 100644 --- a/packages/nodes-base/nodes/PayPal/PayPal.node.ts +++ b/packages/nodes-base/nodes/PayPal/PayPal.node.ts @@ -31,7 +31,7 @@ export class PayPal implements INodeType { description: INodeTypeDescription = { displayName: 'PayPal', name: 'payPal', - icon: 'file:paypal.png', + icon: 'file:paypal.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/PayPal/PayPalTrigger.node.ts b/packages/nodes-base/nodes/PayPal/PayPalTrigger.node.ts index 2962d92600..94b69ade48 100644 --- a/packages/nodes-base/nodes/PayPal/PayPalTrigger.node.ts +++ b/packages/nodes-base/nodes/PayPal/PayPalTrigger.node.ts @@ -20,7 +20,7 @@ export class PayPalTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'PayPal Trigger', name: 'payPalTrigger', - icon: 'file:paypal.png', + icon: 'file:paypal.svg', group: ['trigger'], version: 1, description: 'Handle PayPal events via webhooks', diff --git a/packages/nodes-base/nodes/PayPal/paypal.png b/packages/nodes-base/nodes/PayPal/paypal.png deleted file mode 100644 index 6780c5de679e3c1a5bd2a167458018655aeb9b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$R15G4aRqV(En67oK7x=8^Bw~k z5Cj*5a~bA>WKq?isc(jB2dM-bi_Cz?g2c_6AZ*@%nQ)63mcHUB+yUeY8P)5 zTrWflNV3)*1quQg;yMLD1I4xTB{Xvx=06cKu47pIf?>fk#+mm-EovB+ypmAQmQc6qlb`tq<=x!m+LamZ zcKb^f^L3lWS92G<X(N!(s>4zOgvRbyk^|HJfoiL)#Izqdy$BSoLd( z?Q+dgOWMu2ZO*(cwmlmse$u(JA!6+pQ^ETTdOkI!>%N99diX$xhx_t}b*DT#=d1c0 zy*Kmlxvuz#V^x!U9ZJ3aKC8gU}<&1UWjhk~ODRAAN>m_&kr>BM4oatX|R$Q-n z|3E41(gvGuo>kXR6>SYl_1M^%d875;!6)_1Y}}J?wM>1jYBP80%l7$>ZzX@UC?As+ z`4e@{KPb6FS-e&Ez3;8LpR4;Wi9TTSiFhCXUi{J#%PhtNp$A^eWNYd^&`aPo_Vb%N z<=;ff&v_DM(ULdzHA}iDJWQ*ske|tYc$$5}>GU@zopr0N`|RYybcN diff --git a/packages/nodes-base/nodes/PayPal/paypal.svg b/packages/nodes-base/nodes/PayPal/paypal.svg new file mode 100644 index 0000000000..2d457931fc --- /dev/null +++ b/packages/nodes-base/nodes/PayPal/paypal.svg @@ -0,0 +1,12 @@ + + + paypal_node_icon + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Redis/Redis.node.ts b/packages/nodes-base/nodes/Redis/Redis.node.ts index f7b1bd0bdd..716a751d70 100644 --- a/packages/nodes-base/nodes/Redis/Redis.node.ts +++ b/packages/nodes-base/nodes/Redis/Redis.node.ts @@ -16,7 +16,7 @@ export class Redis implements INodeType { description: INodeTypeDescription = { displayName: 'Redis', name: 'redis', - icon: 'file:redis.png', + icon: 'file:redis.svg', group: ['input'], version: 1, description: 'Get, send and update data in Redis.', diff --git a/packages/nodes-base/nodes/Redis/redis.png b/packages/nodes-base/nodes/Redis/redis.png deleted file mode 100644 index 7254774f29e2e715691d854b2e9cdf0cb6e68556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1419 zcmV;61$6p}P)|-7#PJYCzU5AyDloIDkq&N zC(D_ct1BpvA|kgfDX=Ulr79?)DJYgFCXgj1y)G)WEh&>GCd4Npjvye}a&E{pFT*b? zt}7{+Cnt>_9*i6u{rLFw*VgCI(7!G!qbVq#C?{PR8~*$I`RwfZ=;!Co&f9x;+IDiv zJvg>4D!DBw!XX^{@bKiDn8+_GvMedV9T@J=&+NIk>8q*Ym6Op{QqWRP&PztjML^3z zJjpmTj3gxZ@bL8O>-OE;@yp8O%F5ikyVIzs=cuOUqMy#4o!^Lr-GYDCXk@TsW7J_? z(p*^2P)njmN1Z)AmM}1rDJh2-7={oK`tl|-;O*Ml@W#dMy}aqLuH&br$dZ!6 zhK9O!cC%}1t5;X2P*9aEEuJVRha)3#9v-(L9iki=!5S6*{r&dd-tOJq@5932!ot<8 ztlONM;E#;ojEcmHinecWxn5nQJv_ueJDNB+uq`TpAt00>Ag>}Hmm3+r8510elV^&TCX132zB478EWfDpPe7;hsT5S zbsZsOQETG(?sYsmzGSqUlv3N6sgAb}N#_rZRtq}Dh^Pjgtv&Dm<6bUT>$J@#Y9~)t z7wb@=U8uZi+7@P+&)F|wq>fNydHkU7q^(J?#>$t4hVg=q?D=U6^~Mu{z}(>AgX~_U z8=$ zeaJCI3G`_MThzhq)MB+YTCNN)8wmOlm0{A`9Z(e6^pf|K(z2oi6Cp+z$VD|_+$oAU z7{-}!3aE1I+))qtz)DdDC~{@%g`s^a zn!$uw)R;I{o(9oeZ-i61wD892ImTx=!!3I5gok|bZqcMjbB~hmSMIwYM@&qyuAOa6d6{fs$g}h(`sh~ zMiqLIs)=uekQ3qGsbz7R8G zBEuk&IOg$D;ekhsQ{lwzBa$!n+&pc9c-}0^&Fk%nM)|0nXywc^?+#0U#D%VvQpurb z9rK6^)NWUA(OiA|Y@I*HBMWEDT<0f+F|BW#t2cM&=zeK^T)MGpy6scZDAfCwP=32aY@ + + redis_node_icon + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/nodes-base/nodes/Salesforce/salesforce.svg b/packages/nodes-base/nodes/Salesforce/salesforce.svg index 1de81b28ff..26f1bf161b 100644 --- a/packages/nodes-base/nodes/Salesforce/salesforce.svg +++ b/packages/nodes-base/nodes/Salesforce/salesforce.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Slack/slack.svg b/packages/nodes-base/nodes/Slack/slack.svg index a0dd9b585e..a69053160d 100644 --- a/packages/nodes-base/nodes/Slack/slack.svg +++ b/packages/nodes-base/nodes/Slack/slack.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Telegram/telegram.svg b/packages/nodes-base/nodes/Telegram/telegram.svg index 8256014e98..fe13cb81f4 100644 --- a/packages/nodes-base/nodes/Telegram/telegram.svg +++ b/packages/nodes-base/nodes/Telegram/telegram.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/nodes-base/nodes/Xero/Xero.node.ts b/packages/nodes-base/nodes/Xero/Xero.node.ts index 3b5f20547c..27369c647e 100644 --- a/packages/nodes-base/nodes/Xero/Xero.node.ts +++ b/packages/nodes-base/nodes/Xero/Xero.node.ts @@ -41,7 +41,7 @@ export class Xero implements INodeType { description: INodeTypeDescription = { displayName: 'Xero', name: 'xero', - icon: 'file:xero.png', + icon: 'file:xero.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', diff --git a/packages/nodes-base/nodes/Xero/xero.png b/packages/nodes-base/nodes/Xero/xero.png deleted file mode 100644 index 61b8f10c8c2cc1766e5af51667036794ed4000f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4586 zcmVg)Xd{qpki@9^;O@9**P z@$K&I0khca?Ca_2>F)0D)&Kw7|NjTE)ZqXB?d<|JVQj=l}m0ro-L;{|d0u46xA-t<4^yz7DR>5~sxpvenH0|H=RV|Ns6D zvC}iL%JcvKHq)P|Nrgx_zJAf6ROD%s>vUqyXyV__V)EBpSkPw_UY^D6Ryn_ro|+qyeFNt z@c;kw`TJzP&=9WA2(Hc#sK+Cpx!V8#^!xpo>ihlt`uO|$>G%2f`1kYm^zrlZ=I!n^ zwayK!%)tNu!1(|7{r;2a`Gw{A^Y{4j_4M%Z@aygE=<4YSuF(;&&`GYtB&NYPqq+S5 z|FHl6xb*+*`uyhk{HgBzuJyBSHs#~ z!`Mx|)C{oGO1jY+tjSKX$1beJG^)cPr^70xy&IvuE}*x<`v0c)|C8_k>H7Y=@%-`l z`R4TZ?(_BG@${_e^pD-`Zq@6T+UIr9;z`2WaK_hCz}ITR)Iz(|M!3*EwayW%%qy+O z9jeFE{r{f%|E%->uk!z%@c;4q{rda*x9<6|?fH)8_}%gLdf@h+=Jl53^rPYIpWf?* z)#P8x;cCX%W4X&nwaX`~#?Afz|NZ`?@czK?`KaghiQw~+;O~Fi@0s1}lGfvi)Z>8B z;)T%PG{N6n#@u+x+GD}gIJ?waz0z*G$`Pl?ssI18`TyDY{loM9ZRGvY_55Vp^mp3s zo7UlD$K5Eg&U&-IHJh(6ny-fQ|4h&8k;>Iuq_a(&t9emRNB{s1s7XXYR9M5ESp|3$ zM-<-M-IL9pOKwkc?hHp4hM)mLa47CttawXXpru#^D3nsHv`}|37r_%sBlt7;%c*8u2bTp8**`_ z9+yuCy=W<}(j+6jsjOb|Xc^7vsc{;Hs2VUasS?RWN>Z#=vrR%pij@j6trCg}rBtdU z#PrhJC)O7YAHFniqDTdL(;gvJgnWz=>5UxJqbF3+VzmmBfi=-WT&-i@B8-N&m~pX8 zffHbj#{4Q7owxCtj!l~u9!zT~nqpH$kL<12FxJNEXBulhS6Y6 z4Eq*o41p`6#dw1TCu2nTHCGSYa_x#6QfFsoI*??(oO)*afd{twHeI2>6<6?jLR=}6 z%VkPj7(?3hGE5{A3ei9AKg~V{(V~i4U*OOOYd6Hk7vxg{tptg{m0u8l^Mi$ruinjhA}igt@|yxxJHMM>a=(s-!? z-+3LTQpicYP);btVwJ)s)J#dUOgLRvZKRMj7ZjMhd*~-gzB}^fiu9yhsm4jY$VTX; za!jMfbIn3rp%ITXD{x`w0?VYm{x~BQ74;u@SX2~sWn9U+5r&GnA~X4_N@XL>A{+p1 zDD?Ny{o@m9*8UR6V z!-pOrBt-;G*ViWQ$_Vj$3sdH&eg5=&HcKm@LK!b@t-T$E9w7pd-k~>rdP~mQ!3n(f zz<``fQ3?LliBEKg9uA>Lh-eW3fitG{n)02F8$tQvgbJ1JG*nEbA?#S7$Qm}JSymP% zP#24bY%F}va0dhhVdFzjNsJt%By%kzn%XV_4}83B=!i1dWt61}HG2dk50VW}o3Phy z#I%=!Xmqbjy5k5=bAG5-+aUC8hdnPi5(JWq1`|jGFzJ%hhFT3oibg7D0X0H-`qOo7 z?5`Imd@hQsd(GF$0dl8aUZ;0gyB)g}fxL?*{gP+n6mH6BQy!`Cy;BGQcPWCF2@nh4 z$*xceVN!?>d%&lILkg~Bz7-ikNmQ`?`_0P>Lsk}05;ye8@!P*h z@$X$e-!qJvaObR&pp|mnbpNu?A56OJ)2^zf7ZxQNh9zzLggw&GVgxgeS4yd;40FvbmP|9R(2iY z>LwYO>tox3ZL!ySymw}m?A~mcKdZ)BP+d6ZDHHR&-(76Vey-W+Y`WjzJ=yH9t}ba_ zIm~b%HpFhf_2t()!EHo&X^&=dw}gan)+A)(P0iPqdnea4#%?R0x89$UkdTm4Rkw(l zca^``lKzr2CF7(g=VVP|N-&txShLcT^9k>CnUALB2{C;5;b$@>oXbkWb(6}OAAY+N z?5k<)8s|-au{kpyiL?1HkLUEw#g@RDA+F2^4G%T9&4@pD&S`IKzRj@B!6p`o<7nDa z88)_l(=!eTIo4_;veEmxiJ4r}mg0QgboDQvU(U(rzkCyTtESjuNS!ew)noc7BPD+4 zmdieKrj%?qCB5tdL;!p?`*ta&D{5KB0ZLF{RQ>vFc3R7ib#3+=GoG|$dlOknO3Yyx z&vjtou+$-ycbiQ2bh%cIw^%MaXRp4&;vL5W{%hV?{Y{Y5!CqGy8!rS^Gp^n zef(uT^823nVv~Uftju4v*_XcM+?4=W-VOL{OT7}-a3KQZ#2#03EmQuT1?_d{i|wZG z{+_e`DpuyqnUm>uqbU!WF^)0qh)>Blp1Api_>__rrlhkx;Ift?J*Fv2d&41N15OM6 zcOC5SuTL?|`!~-lxZ7Y^opqBN$-VwtHaKS%peg4YGv^x~A3AeJ#?L>;&uDCZ$gs!( zc>(}4pIO+7W6C3Gk7aUz)^O}~9`9RO{#!;Me{76>&~V!=gHwz~V@l)AljnU{S&62c zpD_41llbDzGgI>OQ)bqj&hfkuFM+%+5M&-*&Jq{92Z4CJgH>a47E4!xW)+~3p%2L+S}`zCB$s>5J>JP#Zj>C1U}H|=ibBV+B(KT9 z7$6BuZt8;MU??A#Pf@}6GxL~$DG)H3m@n7F+bOgG#)7*Ul(B_E!t#830s{Ot>8-3d zJD0xPw;b4f?2DAbm!3+5Y~xwq-XZKAX!q`xI$=SP4oJcKohODqkm8(__f%S$GAe^!9 zo)ag=?He4vlD{B?9Ls$+l?+o5WZ7$VVYDff%T7hkVan=4lb1xf3JNM+M*hq}eEN=T1+5yY&3~zm^-O z<;t)DugXJ8m#0e!xMj1KrR4Mn*Sq_?mFwUD2fQV^*KaP1A(7jl5-7LBw9>B?{OcMt zut-26*PqgrrfZ-eTe1X&9vw3!ZNi2)EBn(W0b0BEZiUiW9X&D`qrpO&K4N)0HpKek zz}NJC`a(6!EmLR$)l!&^tM#%yvz)B!TmqoL=-hqlVz$5pa2uws`W zT7fl~bu_zGDH6jjOOYRvGN7tD)2~M<;-Upip6NIqm^+Fm;vn=iMDiF7DPNqkdT`W0 zMNU5sBuN;&mf56H*k}!DQ|o&Gmo7|N=QIug*iW~;YTblQ!}Srs>C1p#K(Iu)=X_OGgg74|H)ZuyG0m1hBw1uxwBK##6GC6W{ybD-bnoAm{_t3ZG*=7HA4h#rzH#+w|U|IkpQFI7drh%*V5JiB9h`AMCPgonNn*sE{>8b?(todafS4eTQ z*@oCTbqr+eZhj<}rAmaYzNDXGtAf@60l}TCVt>l<)zdJV1rZX1MlVrtwI0u-N`cI& zf5P(AdVf%I;gp4b0gnv%*WcxBX_e6thBJC}vQmcqixHL!Rk`AN%lH*pPB1LS4OQw-xHuPc!AwRU4rzHzzuv4Acfj3q+#oM(Kz7Ffjuxtm^G|svg z=LZ(2P1F(HM4VK|hn@{Z$`UgqTh*&1bWYWX<(i^wX2g!!erGsjM+F)McPk#wYEKC} zOZM-$t$gutu^xh=n<@lid^!n-6gox;U>`=y)k+Viav ziIyXE;X&nBm)7lm?@*wuqX-yGwVc$5Yzh@L$I5AlUxf2aa=4`iKL U#vRa)@c;k-07*qoM6N<$f)1CC;s5{u diff --git a/packages/nodes-base/nodes/Xero/xero.svg b/packages/nodes-base/nodes/Xero/xero.svg new file mode 100644 index 0000000000..ca25aa1e74 --- /dev/null +++ b/packages/nodes-base/nodes/Xero/xero.svg @@ -0,0 +1,16 @@ + + + xero_node_icon + + + + + + + + + + + + + \ No newline at end of file From 88c8af73a578113308a8ed7887f6f13b6c27acdd Mon Sep 17 00:00:00 2001 From: Miquel Colomer Date: Thu, 25 Mar 2021 17:50:12 +0100 Subject: [PATCH 086/137] + fix escaping single quotes --- packages/nodes-base/nodes/UProc/Json/Tools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/UProc/Json/Tools.ts b/packages/nodes-base/nodes/UProc/Json/Tools.ts index 72c4ae8148..36030e287c 100644 --- a/packages/nodes-base/nodes/UProc/Json/Tools.ts +++ b/packages/nodes-base/nodes/UProc/Json/Tools.ts @@ -1 +1 @@ -export const tools = {processors: [{'k':'checkCreditcardChecksum','d':'Check Card Number Has Valid Format','ed':'Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getCreditcardType','d':'Get Credit Card Type By Number','ed':'Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getAddressBySearch','d':'Get Exact Address By Search','ed':'Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona, España'}]},{'k':'getCoordinateBySearch','d':'Get Coordinates By Search','ed':'Discover latitude and longitude coordinates of a postal address','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona, España'}]},{'k':'checkAddressExist','d':'Check Exact Address Exists','ed':'Check if an exact address exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressNormalized','d':'Get Normalized Address','ed':'Allow to normalize an address, removing non allowed characters','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona Spain'}]},{'k':'checkAddressNumberExist','d':'Check Street Number Exists','ed':'Check if a house number exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressSplitted','d':'Get Parsed Address','ed':'Parse postal address into separated fields, getting a basic resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'getAddressSplittedBest','d':'Get Improved Parsed Address','ed':'Parse postal address into separated fields, getting an improved resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'checkCoordinateValid','d':'Check Valid Coordinates','ed':'Check if coordinates have a valid format','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'checkAgeBetw','d':'Check Age Between','ed':'Check if age is between two numbers','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years1','r':true,'t':'number','p':'35'},{'n':'years2','r':true,'t':'number','p':'50'}]},{'k':'getAgeByDate','d':'Get Age By Date','ed':'Discover the age of a birth date (multiple formats allowed)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeEq','d':'Check Ages Are Equal','ed':'Check if ages are equal','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'45'}]},{'k':'checkAgeGe','d':'Check Age Is Greater Or Equal','ed':'Check if age is greater or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'43'}]},{'k':'checkAgeGt','d':'Check Age Is Greater','ed':'Check if age is greater than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'40'}]},{'k':'checkAgeIsAdult','d':'Check Age Is Greater Than Or Equal To 18 Years','ed':'Check if birth date belongs to an adult: 18 years old (Spain)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1950-05-20'}]},{'k':'checkAgeIsForties','d':'Check Age Is Between 40 And 49 Years','ed':'Check if date returns an age between 40 and 49 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeIsRetired','d':'Check Age Is Greater Than 64 Years','ed':'Check if birth date returns an age greater than 64 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1954-05-20'}]},{'k':'checkAgeIsTwenties','d':'Check Age Is Between 20 And 29 Years','ed':'Check if date returns an age between 20 and 29 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'2000-05-20'}]},{'k':'checkAgeLe','d':'Check Age Is Lower Or Equal','ed':'Check if age is lower or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'checkAgeLt','d':'Check Age Is Lower','ed':'Chekc if age is lower than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'getAgeRange','d':'Get Age Range By Date','ed':'Discover the age range of a person by birth date','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getAsinByEan','d':'Get ASIN By EAN','ed':'Get ASIN code by EAN code querying Internet.','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkAsinExist','d':'Check ASIN Exists','ed':'Check if a ASIN code exists on Amazon marketplace','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkAsinValid','d':'Check ASIN Valid','ed':'Check if a ASIN code has a valid format','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'getAudioAdvancedSpeechByText','d':'Get Advanced Speech By Text','ed':'Get advanced human audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'Arabic','value':'arabic'},{'name':'Bengali','value':'bengali'},{'name':'British','value':'british'},{'name':'Czech','value':'czech'},{'name':'Danish','value':'danish'},{'name':'Dutch','value':'dutch'},{'name':'Filipino','value':'filipino'},{'name':'Finnish','value':'finnish'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Greek','value':'greek'},{'name':'Gujurati','value':'gujurati'},{'name':'Hindi','value':'hindi'},{'name':'Hungarian','value':'hungarian'},{'name':'Indonesian','value':'indonesian'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Kannada','value':'kannada'},{'name':'Korean','value':'korean'},{'name':'Malayalam','value':'malayalam'},{'name':'Mandarin','value':'mandarin'},{'name':'Norwegian','value':'norwegian'},{'name':'Polish','value':'polish'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Slovak','value':'slovak'},{'name':'Spanish','value':'spanish'},{'name':'Tamil','value':'tamil'},{'name':'Telugu','value':'telugu'},{'name':'Thai','value':'thai'},{'name':'Turkish','value':'turkish'},{'name':'Ukranian','value':'ukranian'},{'name':'Vietnamese','value':'vietnamese'}]}]},{'k':'getAudioSpeechByText','d':'Get Speech By Text','ed':'Get audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Spanish','value':'spanish'}]}]},{'k':'checkBankAccountValidEs','d':'Check Bank Account Is Valid (ES)','ed':'Discover if account number has a valid format','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'}]},{'k':'checkBankBicValid','d':'Check BIC Is Valid','ed':'Discover if BIC number has a valid format','g':'finance','p':[{'n':'bic','r':true,'t':'string','p':'DABAIE2D'}]},{'k':'getBankIbanByAccount','d':'Get IBAN By Account','ed':'Get IBAN number by account number of the country','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'},{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getBankIbanLookup','d':'Get IBAN Lookup','ed':'Get to search data bank information by IBAN account number','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'NL91ABNA0417164300'}]},{'k':'checkBankIbanValid','d':'Check IBAN Is Valid','ed':'Discover if IBAN account number has a valid format','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'ES3314650120311716144388'}]},{'k':'getBarcodeEncoded','d':'Get Encoded Barcode','ed':'Get an encoded barcode by number and required standard','g':'image','p':[{'n':'text','r':true,'t':'string','p':'0635753490879'},{'n':'bcid','r':true,'t':'options','p':'ean13','o':[{'name':'Auspost','value':'auspost'},{'name':'Azteccode','value':'azteccode'},{'name':'Azteccodecompact','value':'azteccodecompact'},{'name':'Aztecrune','value':'aztecrune'},{'name':'Bc412','value':'bc412'},{'name':'Channelcode','value':'channelcode'},{'name':'Codablockf','value':'codablockf'},{'name':'Code11','value':'code11'},{'name':'Code128','value':'code128'},{'name':'Code16k','value':'code16k'},{'name':'Code2of5','value':'code2of5'},{'name':'Code32','value':'code32'},{'name':'Code39','value':'code39'},{'name':'Code39ext','value':'code39ext'},{'name':'Code49','value':'code49'},{'name':'Code93','value':'code93'},{'name':'Code93ext','value':'code93ext'},{'name':'Codeone','value':'codeone'},{'name':'Coop2of5','value':'coop2of5'},{'name':'Daft','value':'daft'},{'name':'Databarexpanded','value':'databarexpanded'},{'name':'Databarexpandedcomposite','value':'databarexpandedcomposite'},{'name':'Databarexpandedstacked','value':'databarexpandedstacked'},{'name':'Databarexpandedstackedcomposite','value':'databarexpandedstackedcomposite'},{'name':'Databarlimited','value':'databarlimited'},{'name':'Databarlimitedcomposite','value':'databarlimitedcomposite'},{'name':'Databaromni','value':'databaromni'},{'name':'Databaromnicomposite','value':'databaromnicomposite'},{'name':'Databarstacked','value':'databarstacked'},{'name':'Databarstackedcomposite','value':'databarstackedcomposite'},{'name':'Databarstackedomni','value':'databarstackedomni'},{'name':'Databarstackedomnicomposite','value':'databarstackedomnicomposite'},{'name':'Databartruncated','value':'databartruncated'},{'name':'Databartruncatedcomposite','value':'databartruncatedcomposite'},{'name':'Datalogic2of5','value':'datalogic2of5'},{'name':'Datamatrix','value':'datamatrix'},{'name':'Datamatrixrectangular','value':'datamatrixrectangular'},{'name':'Dotcode','value':'dotcode'},{'name':'Ean13','value':'ean13'},{'name':'Ean13composite','value':'ean13composite'},{'name':'Ean14','value':'ean14'},{'name':'Ean2','value':'ean2'},{'name':'Ean5','value':'ean5'},{'name':'Ean8','value':'ean8'},{'name':'Ean8composite','value':'ean8composite'},{'name':'Flattermarken','value':'flattermarken'},{'name':'Gs1-128','value':'gs1-128'},{'name':'Gs1-128composite','value':'gs1-128composite'},{'name':'Gs1-cc','value':'gs1-cc'},{'name':'Gs1datamatrix','value':'gs1datamatrix'},{'name':'Gs1datamatrixrectangular','value':'gs1datamatrixrectangular'},{'name':'Gs1northamericancoupon','value':'gs1northamericancoupon'},{'name':'Hanxin','value':'hanxin'},{'name':'Hibcazteccode','value':'hibcazteccode'},{'name':'Hibccodablockf','value':'hibccodablockf'},{'name':'Hibccode128','value':'hibccode128'},{'name':'Hibccode39','value':'hibccode39'},{'name':'Hibcdatamatrix','value':'hibcdatamatrix'},{'name':'Hibcdatamatrixrectangular','value':'hibcdatamatrixrectangular'},{'name':'Hibcmicropdf417','value':'hibcmicropdf417'},{'name':'Hibcpdf417','value':'hibcpdf417'},{'name':'Iata2of5','value':'iata2of5'},{'name':'Identcode','value':'identcode'},{'name':'Industrial2of5','value':'industrial2of5'},{'name':'Interleaved2of5','value':'interleaved2of5'},{'name':'Isbn','value':'isbn'},{'name':'Ismn','value':'ismn'},{'name':'Issn','value':'issn'},{'name':'Itf14','value':'itf14'},{'name':'Japanpost','value':'japanpost'},{'name':'Kix','value':'kix'},{'name':'Leitcode','value':'leitcode'},{'name':'Matrix2of5','value':'matrix2of5'},{'name':'Maxicode','value':'maxicode'},{'name':'Micropdf417','value':'micropdf417'},{'name':'Msi','value':'msi'},{'name':'Onecode','value':'onecode'},{'name':'Pdf417','value':'pdf417'},{'name':'Pdf417compact','value':'pdf417compact'},{'name':'Pharmacode','value':'pharmacode'},{'name':'Pharmacode2','value':'pharmacode2'},{'name':'Planet','value':'planet'},{'name':'Plessey','value':'plessey'},{'name':'Posicode','value':'posicode'},{'name':'Postnet','value':'postnet'},{'name':'Pzn','value':'pzn'},{'name':'RationalizedCodabar','value':'rationalizedCodabar'},{'name':'Raw','value':'raw'},{'name':'Royalmail','value':'royalmail'},{'name':'Sscc18','value':'sscc18'},{'name':'Symbol','value':'symbol'},{'name':'Telepen','value':'telepen'},{'name':'Telepennumeric','value':'telepennumeric'},{'name':'Ultracode','value':'ultracode'},{'name':'Upca','value':'upca'},{'name':'Upcacomposite','value':'upcacomposite'},{'name':'Upce','value':'upce'},{'name':'Upcecomposite','value':'upcecomposite'}]}]},{'k':'getBookAuthorLookup','d':'Get Book By Author','ed':'Get book by author's surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookCategoryLookup','d':'Get Book By Category','ed':'Get all publications by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'checkBookIsbn','d':'Check ISBN Code Is Valid','ed':'Allow to check if an ISBN10/13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbnExist','d':'Check ISBN Code Exists','ed':'Allow to check if an ISBN book exist','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookIsbnLookup','d':'Get Book By ISBN','ed':'Get book or publication data by 10 or 13 digits ISBN code','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'checkBookIsbn10','d':'Check ISBN10 Code Is Valid','ed':'Allow to check if an ISBN10 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbn13','d':'Check ISBN13 Code Is Valid','ed':'Allow to check if an ISBN13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookListAuthorLookup','d':'Get Books By Author','ed':'Get books by author's surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookListCategoryLookup','d':'Get Books By Category','ed':'Get all books by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'getBookListPublisherLookup','d':'Get Books By Editor','ed':'Get all books by editor','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookListTitleLookup','d':'Get Books By Title','ed':'Get all books by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'Science'}]},{'k':'getBookPublisherLookup','d':'Get Book By Editor','ed':'Get book data by editor's name','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookTitleLookup','d':'Get Book By Title','ed':'Get book data by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'La empresa más feliz del mundo'}]},{'k':'getNifByDni','d':'Get NIF By DNI (ES)','ed':'Discover the letter of a dni card number','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'getCifNormalized','d':'Get Normalized CIF','ed':'Allow to normalize a CIF number, removing non allowed characters','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B 62084 959'}]},{'k':'getDniNormalized','d':'Get Normalized DNI (ES)','ed':'Allow to normalize a DNI number, removing non allowed characters','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016a116'}]},{'k':'getNieNormalized','d':'Get Normalized NIE (ES)','ed':'Allow to normalize a NIE number, removing non allowed characters','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'X402001 122g'}]},{'k':'getNifNormalized','d':'Get Normalized NIF (ES)','ed':'Allow to normalize a NIF number, removing non allowed characters','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'402001 122g'}]},{'k':'checkCifValid','d':'Check CIF Is Valid (ES)','ed':'Discover if a cif card number is valid','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'A58818501'}]},{'k':'checkDniValid','d':'Check Valid Dni (ES)','ed':'Discover if a dni card number is valid','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'checkNieValid','d':'Check NIE Is Valid (ES)','ed':'Discover if a NIE card number is valid','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'Y2918527W'}]},{'k':'checkNifValid','d':'Check NIF Is Valid (ES)','ed':'Discover if a nif card number is valid','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'44016116G'}]},{'k':'getCityByIp','d':'Get City By IP','ed':'Get city from ip','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCityByName','d':'Get City By Name (ES)','ed':'City search by partial name (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Bar'}]},{'k':'getCityByPhone','d':'Get City By Phone (ES)','ed':'Discover the city name by the local phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getCityByZipcode','d':'Get City By Zipcode (ES)','ed':'Discover the city name by the zipcode (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCityListByName','d':'Get Cities By Prefix (ES)','ed':'Get multiple cities by partial initial text (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barce'}]},{'k':'getCityListByPhone','d':'Get Cities By Phone (ES)','ed':'Get multiple cities by phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'938499145'}]},{'k':'getCityListByZipcode','d':'Get Cities By Zipcode (ES)','ed':'Get multiple cities by zipcode prefix (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'234'}]},{'k':'getCityNormalized','d':'Get Normalized City','ed':'Allow to normalize a city, removing non allowed characters','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barc3l0na'}]},{'k':'checkEan13Valid','d':'Check EAN13 Is Valid','ed':'Check if a EAN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkGtin13Valid','d':'Check GTIN13 Is Valid','ed':'Check if a GTIN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkEan14Valid','d':'Check EAN14 Is Valid','ed':'Check if a EAN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkGtin14Valid','d':'Check GTIN14 Is Valid','ed':'Check if a GTIN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkEan18Valid','d':'Check EAN18 Is Valid','ed':'Check if a EAN barcode of 18 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'000004006381333931'}]},{'k':'checkEan8Valid','d':'Check EAN8 Is Valid','ed':'Check if a EAN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtin8Valid','d':'Check GTIN8 Is Valid','ed':'Check if a GTIN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getEanByAsin','d':'Get EAN By ASIN','ed':'Get EAN code by ASIN code querying Internet.','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkEanExist','d':'Check EAN Exists','ed':'Check if a EAN code exists on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkUpcExist','d':'Check UPC Exists','ed':'Check if a UPC code exists','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkUpcFormat','d':'Check UPC Has Valid Format','ed':'Check if a UPC code has a valid format','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberIsin','d':'Check ISIN Code Is Valid','ed':'Check if ISIN number is valid','g':'company','p':[{'n':'isin','r':true,'t':'string','p':'US0378331005'}]},{'k':'getUpcLookup','d':'Get Product By UPC','ed':'Get product data of an UPC code on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberSsEs','d':'Check Social Security Number Is Valid (ES)','ed':'Check if SS number is valid, only for Spain','g':'company','p':[{'n':'number','r':true,'t':'string','p':'998239812282'}]},{'k':'checkNumberUuid','d':'Check UUID Number Is Valid','ed':'Check if it a valid UUID number','g':'security','p':[{'n':'uuid','r':true,'t':'string','p':'550e8400-e29b-41d4-a716-446655440000'}]},{'k':'checkEanValid','d':'Check EAN Is Valid','ed':'Check if a EAN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtinValid','d':'Check GTIN Is Valid','ed':'Check if a GTIN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getCommunityByZipcode','d':'Get Community By Zipcode (ES)','ed':'Discover the community name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCompanyByCif','d':'Get Company By CIF (ES)','ed':'Get company data by CIF','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B66998592'}]},{'k':'getCompanyByDomain','d':'Get Company By Domain','ed':'Get company data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyByDuns','d':'Get Company By DUNS (ES)','ed':'Get company data by DUNS','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'464016690'}]},{'k':'getCompanyByEmail','d':'Get Company By Email','ed':'Get company data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getCompanyByIp','d':'Get Company By IP','ed':'Get company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'getCompanyByName','d':'Get Company By Name','ed':'Get company data by name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'},{'n':'country','r':false,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D'ivoire','value':'Cote D'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People's Republic Of','value':'Korea, Democratic People's Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People's Democratic Republic','value':'Lao People's Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]}]},{'k':'getCompanyByPhone','d':'Get Company By Phone','ed':'Get company data by phone number','g':'company','p':[{'n':'phone','r':true,'t':'string','p':'34933197570'}]},{'k':'getCompanyByProfile','d':'Get Company By Social Profile','ed':'Get company data by social network uri (LinkedIn, Twitter, ...)','g':'company','p':[{'n':'url','r':true,'t':'string','p':'https://twitter.com/Cloudflare'}]},{'k':'getPersonByProfile','d':'Get Person By Social Profile','ed':'Get personal data by social network profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getRoleClassified','d':'Get Classified Role','ed':'Identify and classify a prospect role detecting the right area and seniority to filter later','g':'company','p':[{'n':'role','r':true,'t':'string','p':'Project Manager'}]},{'k':'checkCompanyDebtorByTaxid','d':'Check Company Is Debtor By TaxId (ES)','ed':'Check if company is debtor by TaxId','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B04363115'}]},{'k':'getPersonDecisionMaker','d':'Get Decision Maker','ed':'Get professional data of a decision maker by company name/domain and area','g':'company','p':[{'n':'company','r':true,'t':'string','p':'uproc.io'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getPersonDecisionMakerBySearch','d':'Get Decision Maker By Search Engine','ed':'Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyDomainByName','d':'Get Domain By Company Name','ed':'Get company domain by company name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonEmailsByDomainAndArea','d':'Get Decision Maker's Emails By Domain And Area','ed':'Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'oracle.com'},{'n':'area','r':true,'t':'options','p':'Marketing','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getCompanyExtendedByDomain','d':'Get Company (Extended) By Domain','ed':'Get company contact, social and technology data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyExtendedByEmail','d':'Get Company (Extended) By Email','ed':'Get company contact, social and technology data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getPersonExtendedByProfile','d':'Get Person (Extended) By Profile','ed':'Get personal and social data by social profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getProfileFacebookByCompany','d':'Get Facebook URI By Company','ed':'Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getCompanyFinancialByDomain','d':'Get Sales Data By Company's Domain','ed':'Get company sales data by company's domain name.

Next countries are supported: Spain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyFinancialByDuns','d':'Get Sales Data By Company's DUNS','ed':'Get company sales data by company's DUNS number.

Next countries are supported: Spain','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'461809423'}]},{'k':'getCompanyFinancialByName','d':'Get Sales Data By Company's Name','ed':'Get company sales data by company's name.

Next countries are supported: Spain','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getCompanyFinancialByTaxid','d':'Get Sales Data By Company's Taxid','ed':'Get company sales data by company's taxid (CIF).

Next countries are supported: Spain','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B62084959'}]},{'k':'getCompanyGeocodedByIp','d':'Get Geocoded Company By IP','ed':'Get geocoded company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'sendLinkedinInvitation','d':'Send Connection Request To Linkedin Profile','ed':'Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network! Thanks'}]},{'k':'sendLinkedinInvitationOrMessage','d':'Send Invitation Or Message To Linkedin Profile','ed':'Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message1','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'},{'n':'message2','r':true,'t':'string','p':'Hi {{first}}, thank you for accepting my invitation!'}]},{'k':'getProfileLinkedinByCompany','d':'Get LinkedIn URI By Company','ed':'Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonListByParams','d':'Get Employees By Parameters','ed':'Get employees by company name or domain, area, seniority and country','g':'company','p':[{'n':'country','r':true,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D'ivoire','value':'Cote D'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People's Republic Of','value':'Korea, Democratic People's Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People's Democratic Republic','value':'Lao People's Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]},{'n':'company','r':false,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'seniority','r':false,'t':'options','p':'','o':[{'name':'Apprentice','value':'Apprentice'},{'name':'Director','value':'Director'},{'name':'Executive','value':'Executive'},{'name':'Intermediate','value':'Intermediate'},{'name':'Manager','value':'Manager'}]},{'n':'email','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'phone','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]}]},{'k':'sendLinkedinMessage','d':'Send Message To Linkedin Profile','ed':'Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'}]},{'k':'getPersonMultipleDecisionMakerBySearch','d':'Get Decision Makers By Search Engine','ed':'Discover up to ten decision makers using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyNameByDomain','d':'Get Company's Name By Domain','ed':'Get company name by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyPhoneByDomain','d':'Get Phone By Company Domain','ed':'Get company phone by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getProfileTwitterByCompany','d':'Get Twitter URI By Company','ed':'Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getDistanceByAddresses','d':'Get Distance Between Addresses','ed':'Returns straight-line distance in kilometers between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'}]},{'k':'getRouteByAddresses','d':'Get Route Between Addresses','ed':'Returns driving routing time, distance, fuel consumption and cost between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByCoordinates','d':'Get Distance Between Coordinates','ed':'Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getRouteByCoordinates','d':'Get Route Between Coordinates','ed':'Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getCoordinateByIp','d':'Get Coordinates By IP','ed':'Discover latitude and longitude coordinates of an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getDistanceByIps','d':'Get Distance Between IPs','ed':'Returns straight-line distance in kilometers between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'}]},{'k':'getRouteByIps','d':'Get Route Between IPs','ed':'Returns driving routing time, distance, fuel consumption and cost between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByPhones','d':'Get Distance Between Phones','ed':'Returns straight-line distance in kilometers between two landline phones, using city and province of every phone','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getRouteByPhones','d':'Get Route Between Phones','ed':'Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getDistanceByZipcodes','d':'Get Distance Between Zipcodes','ed':'Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getRouteByZipcodes','d':'Get Route Between Zipcodes','ed':'Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getCoordinateCartesian','d':'Get Cartesian Coordinates','ed':'Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateDecimal','d':'Get Decimal Coordinates','ed':'Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'checkDistanceEq','d':'Check Distance Is Equal','ed':'Discover if the distance between two coordinates is equal to another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33.44'}]},{'k':'checkDistanceGe','d':'Check Distance Is Greater Or Equal','ed':'Discover if the distance in quilometers between two coordinates is greater or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33'}]},{'k':'checkDistanceGt','d':'Check Distance Is Greater','ed':'Discover if the distance in quilometers between two coordinates is greater than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'30'}]},{'k':'checkDistanceLe','d':'Check Distance Is Lower Or Equal','ed':'Discover if the distance in quilometers between two coordinates is lower or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'34'}]},{'k':'checkDistanceLt','d':'Check Distance Is Lower','ed':'Discover if the distance in quilometers between two coordinates is lower than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'50'}]},{'k':'getCoordinateUsng','d':'Get USNG Coordinates','ed':'Get USNG coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateUtm','d':'Get UTM Coordinates','ed':'Get UTM coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCountryByCode','d':'Get Country By ISO Code','ed':'Get country name by its ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryByCurrencyCode','d':'Get Country By Currency','ed':'Get country name by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryByIp','d':'Get Country By IP','ed':'Get country name by IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCountryByName','d':'Get Country By Name','ed':'Get country by prefix','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa'}]},{'k':'getCountryByPhone','d':'Get Country By Phone','ed':'Get country name by phone number, with worldwide coverage','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getCountryCodeByName','d':'Get Country Code By Name','ed':'Get Alpha2 code by country prefix or name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCountryListByCode','d':'Get Countries By ISO Code','ed':'Get multiple countries by ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryListByCurrencyCode','d':'Get Countries By Currency','ed':'Get multiple country names by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryListByName','d':'Get Countries By Prefix','ed':'Get multiple country names by initial name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'S'}]},{'k':'getCountryNormalized','d':'Get Normalized Country','ed':'Allow to normalize a country, removing non allowed characters','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa1n'}]},{'k':'checkCountryValidIso','d':'Check Country Code Exists','ed':'Check if country ISO code exists','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByCountry','d':'Get Currency Code By Country Name','ed':'Get ISO currency code by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyByCountryIsocode','d':'Get Currency Code By Country Code','ed':'Get ISO currency code by an ISO country code','g':'finance','p':[{'n':'country_code','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByIp','d':'Get Currency By IP','ed':'Get ISO currency code by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyByIsocode','d':'Get Currency By ISO Currency Code','ed':'Get an ISO currency code by a currency ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCurrencyConvertedBetweenIsocodeDate','d':'Get Conversion By Currencies And Date','ed':'Convert amount between supported currencies and an exchange date','g':'finance','p':[{'n':'amount','r':true,'t':'string','p':'10'},{'n':'isocode1','r':true,'t':'options','p':'EUR','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'isocode2','r':true,'t':'options','p':'USD','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'date','r':false,'t':'string','p':'2018-02-12'}]},{'k':'getCurrencyListByCountry','d':'Get Currencies By Country','ed':'Get multiple ISO currency codes by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyListByIp','d':'Get Currencies By IP','ed':'Get all ISO currency codes by an IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyListByIsocode','d':'Get Currencies By ISO Code','ed':'Get multiple ISO currency codes by a country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkCurrencyValidIso','d':'Check ISO Currency Code Is Valid','ed':'Discover if an ISO currency code is valid','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkDateBetw','d':'Check Date Is Between Dates','ed':'Discover if a date (date1) is betwen two dates (date2, date3)','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':true,'t':'string','p':'1975-05-19'},{'n':'date3','r':true,'t':'string','p':'1975-05-22'}]},{'k':'getDateDifference','d':'Get Difference Between Dates','ed':'Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'2018-10-10 00:00:00'},{'n':'date2','r':true,'t':'string','p':'2018-10-11 00:00:00'},{'n':'period','r':true,'t':'options','p':'seconds','o':[{'name':'Days','value':'days'},{'name':'Hours','value':'hours'},{'name':'Minutes','value':'minutes'},{'name':'Seconds','value':'seconds'}]}]},{'k':'checkDateEq','d':'Check Dates Are Equal','ed':'Discover if two dates are equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateGe','d':'Check Date Is Greater Or Equal','ed':'Discover if a date is greater or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateGt','d':'Check Date Is Greater','ed':'Discover if a date is greater','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateLe','d':'Check Date Is Lower Or Equal','ed':'Discover if a date is lower or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-19'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateLeap','d':'Check Date Is Leap Year','ed':'Discover if a date belongs to a leap year','g':'personal','p':[{'n':'date','r':false,'t':'string','p':'2008-05-20'}]},{'k':'checkDateLt','d':'Check Date Is Lower','ed':'Discover if a date is lower','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'getDateNormalized','d':'Get Normalized Date','ed':'Allow to normalize a date, removing non allowed characters','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20 /01/2018'}]},{'k':'getDateParsed','d':'Get Parsed Datetime','ed':'Parse datetime, without format dependency, into multiple fields','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20/01/2018'}]},{'k':'checkDateValid','d':'Check Date Is Valid','ed':'Discover if a date has a valid format','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getDeviceByUa','d':'Get Device By User Agent','ed':'Discover device features by user agent','g':'internet','p':[{'n':'useragent','r':true,'t':'string','p':'AppleTV5,3/9.1.1'}]},{'k':'getDomainBlacklists','d':'Get Domain Blacklists','ed':'Get all blacklists where a domain appears','g':'security','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getUrlByDomain','d':'Get Default URL By Domain','ed':'Get valid, existing and default URL when accessing a domain using a web browser.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getDomainByIp','d':'Get Domain By IP','ed':'Get the domain name related with the IP address','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainByUrl','d':'Get Root Domain By Web Address','ed':'Get root domain of any web address, removing non needed characters.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io'}]},{'k':'checkDomainCatchall','d':'Check Email Domain Is Catchall','ed':'Check if domain accepts all emails, existing or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'abinitio.es'}]},{'k':'checkDomainCertificate','d':'Check Domain Has Valid Certificate','ed':'Check if domain has a valid SSL certificate','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'uproc.io'}]},{'k':'getDomainCertificate','d':'Get Certificate By Domain','ed':'Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainDisposable','d':'Check Email Domain Is Temporary','ed':'Check if domain is temporary or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cowstore.org'}]},{'k':'checkDomainExist','d':'Check Domain Exists','ed':'Check if domain exists','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'}]},{'k':'checkDomainFormat','d':'Check Domain Has Valid Format','ed':'Check if domain has a valid format','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainFree','d':'Check Email Domain Is Free','ed':'Check if domain is a free service domain provider','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainIsp','d':'Get ISP By Domain','ed':'Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainLogo','d':'Get Logo By Domain','ed':'Discover logo (favicon) used in domain','g':'image','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainMx','d':'Check Domain Has MX Record','ed':'Check if domain has a MX record','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getUrlPdf','d':'Get Pdf By URL','ed':'Generate a PDF file by URL provided using Chrome browser','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'checkDomainRecord','d':'Check Domain Has DNS Record','ed':'Check if domain has a record of that type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecord','d':'Get Domain Record By DNS Type','ed':'Get the domain record by its type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecords','d':'Get Domain DNS Records','ed':'Get all domain dns records','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainReverse','d':'Check Domain Has IP','ed':'Check if domain has assigned the IP address defined','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'mail.nova.es'},{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainReverseIp','d':'Get IP By Domain','ed':'Get the IPv4 address linked with a domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'www.gmail.com'}]},{'k':'getUrlScreenshot','d':'Get Screenshot By URL','ed':'Generate a screenshot by URL provided using Chrome browser','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'width','r':false,'t':'options','p':'640','o':[{'name':'1024','value':'1024'},{'name':'160','value':'160'},{'name':'320','value':'320'},{'name':'640','value':'640'},{'name':'800','value':'800'}]},{'n':'fullpage','r':false,'t':'options','p':'no','o':[{'name':'No','value':'no'},{'name':'Yes','value':'yes'}]},{'n':'useragent','r':false,'t':'string','p':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36'},{'n':'selector','r':false,'t':'string','p':'h1.mt-4'}]},{'k':'getUrlShareableLinks','d':'Get Shareable Links','ed':'Generates shareable URIs to use on social networks and email using a content URI and a text.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'},{'n':'text','r':true,'t':'string','p':'This is an amazing title for my content'}]},{'k':'getDomainTechnologies','d':'Get Technologies By Domain','ed':'Discover client and server technologies used in domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getUrlTechnologies','d':'Get Technologies By URL','ed':'Discover client and server technologies used in web page','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'}]},{'k':'getDomainVisits','d':'Get Visits By Domain','ed':'Get Website visits and rank of any domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainWhois','d':'Get Whois By Domain','ed':'Get the domain whois data by fields','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getIpWhois','d':'Get Whois By IP Address','ed':'Get whois data fields by IP address provided.','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'140.82.118.4'}]},{'k':'sendEmailCustom','d':'Send Custom Email','ed':'Send a custom email (HTML supported) to a recipient','g':'communication','p':[{'n':'email_from','r':true,'t':'string','p':'mcolomer@killia.com'},{'n':'email_to','r':true,'t':'string','p':'mcolomer@gmail.com'},{'n':'subject','r':true,'t':'string','p':'Welcome email'},{'n':'body','r':true,'t':'string','p':'Hi!

Welcome to uProc and start improving your business processes!'}]},{'k':'checkEmailDisposable','d':'Check Email Is Disposable Domain','ed':'Check if email domain belongs to a disposable email service','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@jetable.com'}]},{'k':'getEmailDomain','d':'Get Domain By Email','ed':'Get domain part from an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExists','d':'Check Email Exists (Simple)','ed':'Discover if the email recipient exists, returning email status','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExistsExtended','d':'Check Email Exists (Extended)','ed':'Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getEmailFirstReferences','d':'Get First Web References Of An Email','ed':'Get three first web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'getEmailFix','d':'Get Fixed Domain Email','ed':'Fix the email domain of those misspelled emails (supports all domains)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmil.com'}]},{'k':'checkEmailFormat','d':'Check Email Has Valid Format','ed':'Check if email has a valid format','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@test.com'}]},{'k':'checkEmailFree','d':'Check Email Is Free','ed':'Check if email belongs to free service provider, like gmail, hotmail, ...','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@gmail.com'}]},{'k':'getEmailGdprListByDomain','d':'Get GDPR Emails By Domain','ed':'Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getEmailListByDomain','d':'Get Emails By Domain','ed':'Get emails list found on internet by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListByEmail','d':'Get Emails By Email','ed':'Get emails list found on internet by non-free email (similar to hunter.io)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListInSite','d':'Get Emails In Website','ed':'Get emails list found inside website by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uoc.edu'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailNormalized','d':'Get Normalized Email','ed':'Normalize email address, removing non allowed characters','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test @gmail.com'}]},{'k':'getEmailRecipient','d':'Get Email By Name, Surname And Domain','ed':'Discover an email by company website or domain and prospect's firstname and lastname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':false,'t':'string','p':'Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByCompanyAndFullname','d':'Get Email By Fullname And Company','ed':'Discover an email by company's name and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'company','r':true,'t':'string','p':'uproc'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByDomainAndFullname','d':'Get Email By Fullname And Domain','ed':'Discover an email by company website or domain and prospect's fullname.

If 'verify' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByProfile','d':'Get Email By Social Network Profile','ed':'Discover an email by contact's LinkedIn profile URI','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getEmailRecipientGdpr','d':'Get Public Email By Name, Surname And Domain (GDPR)','ed':'Discover an email by company website or domain and prospect's firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'hello'},{'n':'lastname','r':false,'t':'string','p':''}]},{'k':'getEmailReferences','d':'Get Web References Of An Email','ed':'Get web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'checkEmailRole','d':'Check Email Is Role Based','ed':'Check if email belongs to a system or role based account','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmail.com'}]},{'k':'sendMobileSms','d':'Send Custom Sms','ed':'Send a custom sms to a recipient with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'text','r':true,'t':'string','p':'Thanks for your participation!'}]},{'k':'checkEmailSmtp','d':'Check Email Has SMTP Server','ed':'Check if email domain has an SMTP server to receive emails','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailSpamtrap','d':'Check Email Is Spam Trap','ed':'Check if email is a spam trap','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'zzzwuzhdgvrxy@yahoo.co.jp'}]},{'k':'getEmailType','d':'Get Email Type','ed':'Get email type','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getFileCopiedBetweenUrls','d':'Get File Copied Between URLs','ed':'Copy file from one URL to another URL','g':'internet','p':[{'n':'source','r':true,'t':'string','p':'https://habilon.com/wp-content/uploads/2019/09/11b07c01.pdf'},{'n':'destination','r':true,'t':'string','p':'s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf'}]},{'k':'getFullnameParsed','d':'Get Parsed Fullname','ed':'Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender','g':'personal','p':[{'n':'fullname','r':true,'t':'string','p':'Colomer Salas Miquel'}]},{'k':'getGenderByEmail','d':'Get Gender By Email','ed':'Discover the gender of a person by the email, if person name is included in email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel.colomer@gmail.com'}]},{'k':'getGenderByPersonalName','d':'Get Gender By Name','ed':'Discover the gender of a person or company by name','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marc'}]},{'k':'checkGenderValid','d':'Check Gender Is Valid','ed':'Discover if a gender value is valid (multilanguage)','g':'personal','p':[{'n':'gender','r':true,'t':'string','p':'male'}]},{'k':'getImageExif','d':'Get EXIF Metadata From Image','ed':'It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg'}]},{'k':'getImageWithText','d':'Get Image With Text','ed':'Generate a new image by URL and text','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg'},{'n':'text','r':true,'t':'string','p':'Hi Miquel!'},{'n':'size','r':false,'t':'string','p':'80'}]},{'k':'getQrDecoded','d':'Get Decoded QR Code','ed':'Get QR Code decoded content by an image URL','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png'}]},{'k':'getQrEncoded','d':'Get Encoded QR Code','ed':'Get QR Code encoded by a text','g':'image','p':[{'n':'text','r':true,'t':'string','p':'Sample text to encode'}]},{'k':'getIpBlacklists','d':'Get Ip Blacklists','ed':'Get all blacklists where an IP address appears','g':'security','p':[{'n':'ip','r':true,'t':'string','p':'172.217.168.165'}]},{'k':'getLinkedinConnections','d':'Get LinkedIn Last Received Connections','ed':'Extract last 80 connections from your LinkedIn profile','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-connections'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinGroupMembers','d':'Get LinkedIn Group Members','ed':'Get members in a LinkedIn group','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/groups/59923/members/'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinInvitations','d':'Get LinkedIn Last Sent Invitations','ed':'Extract last 80 invitations sent from your LinkedIn','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-invitations'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinPostComments','d':'Get LinkedIn Post Comments','ed':'Get users who comment a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinPostLikes','d':'Get LinkedIn Post Likes','ed':'Get users who like a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinProfile','d':'Get LinkedIn Profile','ed':'Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'},{'name':'Slow','value':'slow'}]}]},{'k':'checkLinkedinProfileIsContact','d':'Check LinkedIn Profile Is Contact','ed':'Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getLinkedinProfiles','d':'Get LinkedIn Profiles','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]},{'n':'amount','r':false,'t':'string','p':'10'}]},{'k':'getLinkedinProfilesByCompany','d':'Get LinkedIn Company Employees','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/company/ibm/'},{'n':'list','r':false,'t':'string','p':'employees'}]},{'k':'getLinkedinProfilesByContent','d':'Get LinkedIn Profiles By Content','ed':'Extract fastly last profiles that have published content on LinkedIn by specific keywords','g':'communication','p':[{'n':'keywords','r':false,'t':'string','p':'Growth'},{'n':'list','r':false,'t':'string','p':'content'}]},{'k':'sendLinkedinVisit','d':'Send LinkedIn Profile Visit','ed':'Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas/'}]},{'k':'checkListContains','d':'Check List Contains','ed':'Check if the list contains a specific item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'2'}]},{'k':'checkListEnds','d':'Check List Ends With','ed':'Check if the list ends with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'3'}]},{'k':'checkListLengthBetw','d':'Check Length List Between','ed':'Check if the length of a list is between two quantities','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'4'}]},{'k':'checkListLengthEq','d':'Check Length List Equal','ed':'Checks if the length of a list equals a specified quantity','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGe','d':'Check Length List Greater Or Equal','ed':'Check if the length of a list is greater than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGt','d':'Check Length List Greater','ed':'Check if the length of a list is greater than a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'2'}]},{'k':'checkListLengthLe','d':'Check Length List Lower Or Equal','ed':'Check if the length of a list is less than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthLt','d':'Check Length List Lower','ed':'','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkListMax','d':'Check Greater Element','ed':'Checks if the largest item in a list matches the provided item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,4,8,3,4,5'},{'n':'number','r':true,'t':'string','p':'8'}]},{'k':'getListMax','d':'Get Greater Element','ed':'Returns the largest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListMin','d':'Check Lower Element','ed':'Checks if the smallest element in a list matches the provided element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'5,6,1,3,7'},{'n':'number','r':true,'t':'string','p':'1'}]},{'k':'getListMin','d':'Get Lower Element','ed':'Returns the smallest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'getListSort','d':'Get Sorted List','ed':'Returns an ascending sorted list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListSorted','d':'Check List Is Sorted','ed':'Check if a list is sorted in ascending order','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'checkListStarts','d':'Check List Starts With','ed':'Check if the list starts with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'1'}]},{'k':'checkListUnique','d':'Check Unique Es List','ed':'Check if a list consists of unique elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'getListUnique','d':'Get Unique List','ed':'Returns a single list, with no repeating elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListValid','d':'Check Valid List','ed':'Check if the supplied values ​​form a valid list of elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getLocaleByIp','d':'Get Locale Data By IP','ed':'Discover locale data (currency, language) by ipv4 or ipv6 address.','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByCoordinates','d':'Get Location By Coordinates','ed':'Discover the city name, zipcode, province or country by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.619206,2.2920828'}]},{'k':'getLocationByIp','d':'Get Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getReputationByIp','d':'Get Reputation By IP','ed':'Discover reputation by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getTimeByIp','d':'Get Time Data By IP','ed':'Discover datetime data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByName','d':'Get Location By Name','ed':'Discover location data by name','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getLocationByPhone','d':'Get Location By Landline Phone (ES)','ed':'Discover the city and the province from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'848491812'}]},{'k':'getLocationByZipcode','d':'Get Location By Zipcode (ES)','ed':'Discover the city and the province from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getLocationExtendedByIp','d':'Get Extended Location By IP','ed':'Discover geographical, company, timezone and reputation data by IPv4 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationGeocodedByIp','d':'Get Geocoded Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationListByName','d':'Get Locations By Name','ed':'Get most relevants locations by name (Google Maps typical search)','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Pintores Granollers'}]},{'k':'getLocationListByParams','d':'Get Locations By Parameters','ed':'Get most relevants locations by name, category, location and radius','g':'geographic','p':[{'n':'name','r':false,'t':'string','p':'Saba'},{'n':'category','r':false,'t':'options','p':'parking','o':[{'name':'Accounting','value':'accounting'},{'name':'Airport','value':'airport'},{'name':'Amusement_park','value':'amusement_park'},{'name':'Aquarium','value':'aquarium'},{'name':'Art_gallery','value':'art_gallery'},{'name':'Atm','value':'atm'},{'name':'Bakery','value':'bakery'},{'name':'Bank','value':'bank'},{'name':'Bar','value':'bar'},{'name':'Beauty_salon','value':'beauty_salon'},{'name':'Bicycle_store','value':'bicycle_store'},{'name':'Book_store','value':'book_store'},{'name':'Bowling_alley','value':'bowling_alley'},{'name':'Bus_station','value':'bus_station'},{'name':'Cafe','value':'cafe'},{'name':'Campground','value':'campground'},{'name':'Car_dealer','value':'car_dealer'},{'name':'Car_rental','value':'car_rental'},{'name':'Car_repair','value':'car_repair'},{'name':'Car_wash','value':'car_wash'},{'name':'Casino','value':'casino'},{'name':'Cemetery','value':'cemetery'},{'name':'Church','value':'church'},{'name':'City_hall','value':'city_hall'},{'name':'Clothing_store','value':'clothing_store'},{'name':'Convenience_store','value':'convenience_store'},{'name':'Courthouse','value':'courthouse'},{'name':'Dentist','value':'dentist'},{'name':'Department_store','value':'department_store'},{'name':'Doctor','value':'doctor'},{'name':'Electrician','value':'electrician'},{'name':'Electronics_store','value':'electronics_store'},{'name':'Embassy','value':'embassy'},{'name':'Establishment','value':'establishment'},{'name':'Finance','value':'finance'},{'name':'Fire_station','value':'fire_station'},{'name':'Florist','value':'florist'},{'name':'Food','value':'food'},{'name':'Funeral_home','value':'funeral_home'},{'name':'Furniture_store','value':'furniture_store'},{'name':'Gas_station','value':'gas_station'},{'name':'General_contractor','value':'general_contractor'},{'name':'Grocery_or_supermarket','value':'grocery_or_supermarket'},{'name':'Gym','value':'gym'},{'name':'Hair_care','value':'hair_care'},{'name':'Hardware_store','value':'hardware_store'},{'name':'Health','value':'health'},{'name':'Hindu_temple','value':'hindu_temple'},{'name':'Home_goods_store','value':'home_goods_store'},{'name':'Hospital','value':'hospital'},{'name':'Insurance_agency','value':'insurance_agency'},{'name':'Jewelry_store','value':'jewelry_store'},{'name':'Laundry','value':'laundry'},{'name':'Lawyer','value':'lawyer'},{'name':'Library','value':'library'},{'name':'Liquor_store','value':'liquor_store'},{'name':'Local_government_office','value':'local_government_office'},{'name':'Locksmith','value':'locksmith'},{'name':'Lodging','value':'lodging'},{'name':'Meal_delivery','value':'meal_delivery'},{'name':'Meal_takeaway','value':'meal_takeaway'},{'name':'Mosque','value':'mosque'},{'name':'Movie_rental','value':'movie_rental'},{'name':'Movie_theater','value':'movie_theater'},{'name':'Moving_location','value':'moving_location'},{'name':'Museum','value':'museum'},{'name':'Night_club','value':'night_club'},{'name':'Painter','value':'painter'},{'name':'Park','value':'park'},{'name':'Parking','value':'parking'},{'name':'Pet_store','value':'pet_store'},{'name':'Pharmacy','value':'pharmacy'},{'name':'Physiotherapist','value':'physiotherapist'},{'name':'Place_of_worship','value':'place_of_worship'},{'name':'Plumber','value':'plumber'},{'name':'Police','value':'police'},{'name':'Post_office','value':'post_office'},{'name':'Real_estate_agency','value':'real_estate_agency'},{'name':'Restaurant','value':'restaurant'},{'name':'Roofing_contractor','value':'roofing_contractor'},{'name':'Rv_park','value':'rv_park'},{'name':'School','value':'school'},{'name':'Shoe_store','value':'shoe_store'},{'name':'Shopping_mall','value':'shopping_mall'},{'name':'Spa','value':'spa'},{'name':'Stadium','value':'stadium'},{'name':'Storage','value':'storage'},{'name':'Store','value':'store'},{'name':'Subway_station','value':'subway_station'},{'name':'Synagogue','value':'synagogue'},{'name':'Taxi_stand','value':'taxi_stand'},{'name':'Train_station','value':'train_station'},{'name':'Transit_station','value':'transit_station'},{'name':'Travel_agency','value':'travel_agency'},{'name':'University','value':'university'},{'name':'Veterinary_care','value':'veterinary_care'},{'name':'Zoo','value':'zoo'}]},{'n':'location','r':true,'t':'string','p':'41.3851,2.1734'},{'n':'radius','r':false,'t':'string','p':'250'}]},{'k':'checkMobileAlive','d':'Check Mobile Is Alive','ed':'Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don't return if mobile is alive (like Vodafone)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryCode','d':'Get Country ISO Code By Mobile','ed':'Allow to get country code (two chars) of a mobile phone number with international format','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryPrefix','d':'Get Phone Prefix By Country ISO Code','ed':'Allow to get country prefix number by country code (2 characters)','g':'communication','p':[{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileExist','d':'Check Mobile Exists','ed':'Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with \'Mobile lookup\' tool.','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileFormat','d':'Check Mobile Has Valid Format','ed':'Discover if mobile phone number has a valid format, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34623123213'},{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileFormatEs','d':'Check Mobile Has Valid Format (ES)','ed':'Discover if mobile phone number has a valid format (only Spain)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'623123213'}]},{'k':'getMobileFormatted','d':'Get Formatted Mobile','ed':'Format international mobile number by country ISO code (2 letters).','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileHlrLookup','d':'Get HLR Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileImei','d':'Check Imei Is Valid','ed':'Discover if Imei number has a valid format','g':'communication','p':[{'n':'imei','r':true,'t':'string','p':'490154203237518'}]},{'k':'getMobileLookup','d':'Get Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileMnpLookup','d':'Get Mobile Portability Lookup','ed':'Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileNormalized','d':'Get Normalized Mobile','ed':'Allow to normalize a mobile phone, removing non allowed characters','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34 62318 2 770'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileOrPhoneLookupEs','d':'Get Mobile/Landline Lookup (Spain)','ed':'Discover if mobile or landline prefix exists on Spain.','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileOrPhoneMnpEs','d':'Get Landline/Mobile Portability Lookup (ES)','ed':'Get portability data about a landline or mobile number, only for Spain','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'605281220'}]},{'k':'checkMobileSms','d':'Check Mobile Supports Sms','ed':'Discover if a mobile number can receive sms, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefix','d':'Check Mobile Has Valid Prefix','ed':'Discover if mobile phone number has a valid prefix, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefixEs','d':'Check Mobile Has Valid Prefix (ES)','ed':'Discover if spanish mobile phone number has a valid prefix','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'605281220'}]},{'k':'getNameByPrefix','d':'Get Name By Prefix (ES)','ed':'Get first personal name matching by prefix and gender from INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'checkNameExist','d':'Check Name Exists (ES)','ed':'Check if a personal name exists in INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Juan'}]},{'k':'getNameListByPrefix','d':'Get Names By Prefix','ed':'Get multiple personal names by prefix','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'getNameNormalized','d':'Get Normalized Name','ed':'Normalize name removing non allowed characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'M4rc'}]},{'k':'checkNameValid','d':'Check Name Has Valid Format','ed':'Check if name contains accepted characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getUrlAnalysis','d':'Get URL Analysis','ed':'Analyze URL's health status about SSL, broken links, conflictive HTTP links with SSL, and more.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'getNetAton','d':'Get Number By IP','ed':'Convert an IP address to numeric notation','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'62.12.22.11'}]},{'k':'getNetByIp','d':'Get Network By IP','ed':'Discover network data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'checkUrlContains','d':'Check URL Contains','ed':'Check if an URL contains string or regular expression (case insensitive)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'regex','r':true,'t':'string','p':'uProc'}]},{'k':'getUrlContents','d':'Get Contents From URL','ed':'Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'},{'n':'selector','r':false,'t':'string','p':'emails'}]},{'k':'getUrlContentsParsed','d':'Get Parsed Contents From URL','ed':'Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getUrlDecode','d':'Get Decoded URL','ed':'Decode URL to recover original','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https%3A%2F%2Fgoogle.es'}]},{'k':'getUrlEncode','d':'Get Encoded URL','ed':'Encode URL to avoid problems','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://google.com'}]},{'k':'checkUrlExist','d':'Check URL Exists','ed':'Check if an URL exists','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'getNetFixip','d':'Get Fixed IP','ed':'Fix an IP address to the right format','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'212169160147'}]},{'k':'checkNetHostAlive','d':'Check Host Is Up','ed':'Discover if a computer is switched on','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.es'}]},{'k':'checkStringIp','d':'Check IP Has Valid Format','ed':'Check if IPv4 or IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'23.45.57.123'}]},{'k':'checkStringIp4','d':'Check IPv4 Has Valid Format','ed':'Check if IPv4 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'127.0.0.1'}]},{'k':'checkStringIp6','d':'Check IPv6 Has Valid Format','ed':'Check if IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'2a01:c50e:3544:bd00:4df0:7609:251a:f6d0'}]},{'k':'getUrlListContentsParsed','d':'Get Parsed Contents From Results URL','ed':'Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getNetNtoa','d':'Get IP By Number','ed':'Convert a number to an IP address','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'1501706957'}]},{'k':'getUrlParsed','d':'Get Parsed URL','ed':'Decode URL into multiple fields','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'}]},{'k':'getNetScan','d':'Get Opened Ports In Host','ed':'Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'google.es'}]},{'k':'checkNetServiceUp','d':'Check Service Is Up','ed':'Discover if a service in a port is available','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.com'},{'n':'port','r':true,'t':'string','p':'80'}]},{'k':'getUrlTables','d':'Get Table From URL','ed':'Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2'},{'n':'table','r':false,'t':'string','p':'3'}]},{'k':'checkUrlValid','d':'Check URL Is Valid','ed':'Check that an URL has a valid format','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'checkNumberBetw','d':'Check Number Is Between','ed':'Check if number is between two values','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'21'},{'n':'number3','r':true,'t':'string','p':'24'}]},{'k':'checkNumberDecimal','d':'Check Decimal Number Is Valid','ed':'Check if value is a decimal number','p':[{'n':'number','r':true,'t':'string','p':'0.23'}]},{'k':'checkNumberEq','d':'Check Number Is Equal','ed':'Check if number is equal to another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberEven','d':'Check Even Number Is Valid','ed':'Check if number is even','p':[{'n':'number','r':true,'t':'string','p':'2'}]},{'k':'checkNumberGe','d':'Check Number Is Greater Or Equal','ed':'Check if number is greater or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberGt','d':'Check Number Is Greater','ed':'Check if number is greater than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'22'}]},{'k':'checkNumberLe','d':'Check Number Is Lower Or Equal','ed':'Check if number is lower or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLt','d':'Check Number Is Lower','ed':'Check if number is lower than another','p':[{'n':'number1','r':true,'t':'string','p':'22'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLuhn','d':'Check Luhn Number Is Valid','ed':'Check if it a valid Luhn number','g':'security','p':[{'n':'luhn','r':true,'t':'string','p':'79927398713'}]},{'k':'checkNumberMod','d':'Check Modulus Is Equals','ed':'Check if modulus between two numbers is equal to a value','p':[{'n':'number','r':true,'t':'string','p':'10'},{'n':'mod','r':true,'t':'string','p':'2'},{'n':'rest','r':true,'t':'string','p':'0'}]},{'k':'checkNumberNatural','d':'Check Natural Number Is Valid','ed':'Check if value is a natural number','p':[{'n':'number','r':true,'t':'string','p':'0'}]},{'k':'checkStringNumeric','d':'Check Numeric String Is Valid','ed':'Check if string length contains only numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'123'}]},{'k':'checkNumberOdd','d':'Check Odd Number Is Valid','ed':'Check if number is odd','p':[{'n':'number','r':true,'t':'string','p':'3'}]},{'k':'checkNumberPrime','d':'Check Prime Number Is Valid','ed':'Check if number is prime','p':[{'n':'number','r':true,'t':'string','p':'11'}]},{'k':'checkPasswordStrong','d':'Check Password Is Strong','ed':'Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters','g':'security','p':[{'n':'password','r':true,'t':'string','p':'1agdA*$#'}]},{'k':'getPersonByEmail','d':'Get Person By Email','ed':'Get personal data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonByFirstnameLastnameCompanyLocation','d':'Get Person By Firstname, Lastname, Company And Location','ed':'Get personal data by firstname, lastname, company and location','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':false,'t':'string','p':'uProc'},{'n':'location','r':false,'t':'string','p':''}]},{'k':'getPersonByMobile','d':'Get Person By Mobile','ed':'Get personal data by mobile','g':'personal','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'sendPersonEmailToList','d':'Send Email's Contact To List','ed':'Add a contact email to a person list','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getPersonExtendedByEmail','d':'Get Person (Extended) By Email','ed':'Get prospect's contact data and company's location and social data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonExtendedByEmailAndCompany','d':'Get Person (Extended) By Email And Company','ed':'Get contact, location and social data by email and company name and location','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'company','r':false,'t':'string','p':'uProc'}]},{'k':'getPersonFakedData','d':'Get Random Person Data','ed':'Generates random fake data','g':'personal','p':[{'n':'locality','r':true,'t':'options','p':'English','o':[{'name':'Australia (English)','value':'Australia (English)'},{'name':'Australia Ocker (English)','value':'Australia Ocker (English)'},{'name':'Azerbaijani','value':'Azerbaijani'},{'name':'Bork (English)','value':'Bork (English)'},{'name':'Canada (English)','value':'Canada (English)'},{'name':'Canada (French)','value':'Canada (French)'},{'name':'Chinese','value':'Chinese'},{'name':'Chinese (Taiwan)','value':'Chinese (Taiwan)'},{'name':'Czech','value':'Czech'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Farsi','value':'Farsi'},{'name':'French','value':'French'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'German (Austria)','value':'German (Austria)'},{'name':'German (Switzerland)','value':'German (Switzerland)'},{'name':'Great Britain (English)','value':'Great Britain (English)'},{'name':'India (English)','value':'India (English)'},{'name':'Indonesia','value':'Indonesia'},{'name':'Ireland (English)','value':'Ireland (English)'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Korean','value':'Korean'},{'name':'Nepalese','value':'Nepalese'},{'name':'Norwegian','value':'Norwegian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Brazil)','value':'Portuguese (Brazil)'},{'name':'Russian','value':'Russian'},{'name':'Slovakian','value':'Slovakian'},{'name':'Spanish','value':'Spanish'},{'name':'Spanish Mexico','value':'Spanish Mexico'},{'name':'Swedish','value':'Swedish'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'United States (English)','value':'United States (English)'},{'name':'Vietnamese','value':'Vietnamese'}]}]},{'k':'getProfileByEmployeeData','d':'Get LinkedIn URI By First, Last And Company','ed':'Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':true,'t':'string','p':'uProc'}]},{'k':'getSurnameByPrefix','d':'Get Surname By Prefix (ES)','ed':'Get first personal surname matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Col'}]},{'k':'checkSurnameExist','d':'Check Surname Is Valid (ES)','ed':'Check if a personal surname appears in INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileLinkedinByEmail','d':'Get LinkedIn URI By Email','ed':'Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getSurnameListByPrefix','d':'Get Surnames By Prefix (ES)','ed':'Get personal surnames matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Co'}]},{'k':'getSurnameNormalized','d':'Get Normalized Surname','ed':'Normalize surname','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'C0lomer'}]},{'k':'getProfileTwitterByEmployeeData','d':'Get Twitter URI By First, Last And Company','ed':'Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Carlos'},{'n':'lastname','r':true,'t':'string','p':'Blanco'},{'n':'company','r':true,'t':'string','p':'Encomenda'}]},{'k':'checkSurnameValid','d':'Check Surname Has Valid Format','ed':'Check if surname contains accepted characters','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileXingByEmployeeData','d':'Get Xing URI By First, Last And Company','ed':'Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'David'},{'n':'lastname','r':true,'t':'string','p':'Tomás'},{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPhoneFixed','d':'Get Fixed Phone','ed':'Fix the international prefix of a phone based on the ISO code of a country','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'+1605281220'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormat','d':'Check Valid Phone Format By Country','ed':'Allow to discover if landline number has a good international format, depending on country ','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormatEs','d':'Check Valid Phone Format (ES)','ed':'Discover if landline phone number is valid, with Spain coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getPhoneNormalized','d':'Get Cleaned Phone','ed':'Clean a phone removing non allowed characters','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'3493218 767o'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneOrMobileValid','d':'Check Phone Or Mobile Valid','ed':'Discover if landline or mobile number has a valid prefix','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getPhoneParsed','d':'Get Parsed And Validated Phone','ed':'Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'checkPhoneValidPrefix','d':'Check Valid Phone Prefix','ed':'Discover if a landline phone number prefix exists, with worldwide coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'getProvinceByIp','d':'Get Province By IP','ed':'Discover the province name from an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getProvinceByName','d':'Get Province By Name (ES)','ed':'You can get the first province by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceByPhone','d':'Get Province By Phone (ES)','ed':'Discover the province name from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceByZipcode','d':'Get Province By Zipcode (ES)','ed':'Discover the province name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08'}]},{'k':'getProvinceListByName','d':'Get Provinces By Name (ES)','ed':'You can get a province list by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceListByPhone','d':'Get Provinces By Phone (ES)','ed':'You can get a province list by a phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceListByZipcode','d':'Get Provinces By Zipcode (ES)','ed':'You can get a province list by a zipcode prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'0'}]},{'k':'getProvinceNormalized','d':'Get Normalized Province','ed':'Allow to normalize a province, removing non allowed characters','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'Barce lona'}]},{'k':'checkRobinsonEmailExist','d':'Check Email Is Robinson (ES)','ed':'Discover if an email exists in the Robinson list (only Spain)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'manzaned@uvigo.es'}]},{'k':'checkRobinsonNifExist','d':'Check Nif Number Is Robinson (ES)','ed':'Discover if an nif exists in the Robinson list (only Spain)','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'00002206K'}]},{'k':'checkRobinsonPhoneExist','d':'Check Phone Is Robinson (ES)','ed':'Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'917156252'}]},{'k':'getSentimentByText','d':'Get Sentiment From A Text','ed':'It allows to analyze an english text with Emojis and detect sentiment','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am very happy'}]},{'k':'checkSocialDomainExist','d':'Check Domain Has Social Activity','ed':'Discover if a domain has social network presence','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainLookup','d':'Get Social Networks By Domain','ed':'Discover if a domain or a website has social activity and returns all social network profiles found','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainParsed','d':'Get Social Networks Activity By Domain','ed':'Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'checkSocialEmailExist','d':'Check Email Has Social Activity','ed':'Discover if the email has social network presence','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@gmail.com'}]},{'k':'getSocialEmailLookup','d':'Get Social Networks By Email','ed':'Discover if an email has social activity, and get all social network profiles found','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkSocialMobileExist','d':'Check Mobile Has Social Activity','ed':'Discover if the mobile phone has social network presence','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialMobileLookup','d':'Get Social Networks By Mobile','ed':'Discover if an mobile phone has social activity, and get all social network profiles found','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialUriParsed','d':'Get Social Network Activity','ed':'This tools parses a social uri address and extracts any available indicators','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.facebook.com/uprocdataquality'}]},{'k':'checkStringAlpha','d':'Check Alphabetic String Is Valid','ed':'Check if string length contains only letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'asc'}]},{'k':'checkStringAlphanumeric','d':'Check Alphanumeric String Is Valid','ed':'Check if string length contains only numbers and letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aa11'}]},{'k':'getStringBase64','d':'Get BASE64 Value','ed':'Convert a string to a BASE64 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'checkStringBlank','d':'Check String Is Empty','ed':'Check if string has no content','g':'text','p':[{'n':'text','r':true,'t':'string','p':''}]},{'k':'checkStringBoolean','d':'Check Boolean String Is Valid','ed':'Check if string is true or false','g':'text','p':[{'n':'text','r':true,'t':'string','p':'true'}]},{'k':'getStringByFormat','d':'Get Formatted String By Pattern','ed':'It allows to format a string using a format pattern','g':'text','p':[{'n':'text','r':true,'t':'string','p':'1122'},{'n':'format','r':true,'t':'string','p':'%09d'}]},{'k':'getStringByRegex','d':'Get Generated Text By Pattern','ed':'Generate a random string using a regular expression as a pattern','g':'text','p':[{'n':'regex','r':true,'t':'string','p':'[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*'}]},{'k':'checkStringContains','d':'Check String Contains Char','ed':'Check if string contains a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'checkStringEnds','d':'Check String Ends With','ed':'Check if string ends with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringFieldName','d':'Get Field Type By Value','ed':'Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address','g':'text','p':[{'n':'text','r':true,'t':'string','p':'myemail@mydomain.com'}]},{'k':'getStringJoin','d':'Get Merged Values By Text','ed':'Join a character or string to join two values','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'hi'},{'n':'text2','r':true,'t':'string','p':'good morning!'},{'n':'glue','r':true,'t':'string','p':','}]},{'k':'getStringLength','d':'Get String Length','ed':'Get length of a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'checkStringLengthBetw','d':'Check String Length Is Between','ed':'Check if string length is between two numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'5'}]},{'k':'checkStringLengthEq','d':'Check String Length Is Equal','ed':'Check if string length is equal to number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGe','d':'Check String Length Is Greater Or Equal','ed':'Check if string length is greater or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGt','d':'Check String Length Is Greater','ed':'Check if string length is greater than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkStringLengthLe','d':'Check String Length Is Lower Or Equal','ed':'Check if string length is lower or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthLt','d':'Check String Length Is Lower','ed':'Check if string length is lower than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'5'}]},{'k':'checkStringLowercase','d':'Check Text Is Lowercased','ed':'Check if string only contains lowercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aaa'}]},{'k':'getStringLowercase','d':'Get Lowercased Text','ed':'Convert all letters found in a string to lowercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringMd5','d':'Get MD5 String','ed':'Convert a string to a MD5 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringNormalized','d':'Get Normalized String By Field','ed':'Normalize a string depending on the field name','g':'text','p':[{'n':'field','r':true,'t':'options','p':'name','o':[{'name':'Alphabetic','value':'alphabetic'},{'name':'Alphanumeric','value':'alphanumeric'},{'name':'Cif','value':'cif'},{'name':'City','value':'city'},{'name':'Country','value':'country'},{'name':'Date','value':'date'},{'name':'Decimal','value':'decimal'},{'name':'Dni','value':'dni'},{'name':'Domain','value':'domain'},{'name':'Email','value':'email'},{'name':'Gender','value':'gender'},{'name':'Integer','value':'integer'},{'name':'Ip','value':'ip'},{'name':'Mobile','value':'mobile'},{'name':'Name','value':'name'},{'name':'Nie','value':'nie'},{'name':'Nif','value':'nif'},{'name':'Phone','value':'phone'},{'name':'Province','value':'province'},{'name':'Zipcode','value':'zipcode'}]},{'n':'text','r':true,'t':'string','p':'JMª Gº.Fco.gtez. Gro.'}]},{'k':'getStringParsed','d':'Get Parsed Text','ed':'Analyze string and return all emails, phones, zipcodes and links detected','g':'text','p':[{'n':'text','r':true,'t':'string','p':'My email is miquel@uproc.io and my phone is 34605281220'}]},{'k':'checkStringRandom','d':'Check String Is Random','ed':'Check if string contains random characters without sense','g':'text','p':[{'n':'text','r':true,'t':'string','p':'t2 chhsdfitoixcv'}]},{'k':'checkStringRegex','d':'Check String Is Valid By Pattern','ed':'Check if string contains a value that matches with a regular expression','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'regex','r':true,'t':'string','p':'^test$'}]},{'k':'getStringReplaceAll','d':'Get Texts Replaced By String','ed':'Replace all values found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringReplaceFirst','d':'Get Text Replaced By String','ed':'Replace first value found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringSha','d':'Get SHA String','ed':'Convert a string to a SHA encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringSplit','d':'Get Splitted Values By Separator','ed':'Split a value in two parts, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Texto largo, separado por coma'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getStringSplitAndJoin','d':'Get Splitted And Merged Values By Separator','ed':'Split a value in two parts and join them, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'separator','r':true,'t':'string','p':','},{'n':'glue','r':true,'t':'string','p':';'}]},{'k':'checkStringStarts','d':'Check String Starts With','ed':'Check if string starts with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringTranslated','d':'Get Translated Text','ed':'It allows to translate a text to any language','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, my name is Mike'},{'n':'language','r':true,'t':'options','p':'Spanish','o':[{'name':'Afrikaans','value':'Afrikaans'},{'name':'Albanian','value':'Albanian'},{'name':'Amharic','value':'Amharic'},{'name':'Arabic','value':'Arabic'},{'name':'Armenian','value':'Armenian'},{'name':'Azeerbaijani','value':'Azeerbaijani'},{'name':'Basque','value':'Basque'},{'name':'Belarusian','value':'Belarusian'},{'name':'Bengali','value':'Bengali'},{'name':'Bosnian','value':'Bosnian'},{'name':'Bulgarian','value':'Bulgarian'},{'name':'Catalan','value':'Catalan'},{'name':'Cebuano','value':'Cebuano'},{'name':'Chinese (Simplified)','value':'Chinese (Simplified)'},{'name':'Chinese (Traditional)','value':'Chinese (Traditional)'},{'name':'Corsican','value':'Corsican'},{'name':'Croatian','value':'Croatian'},{'name':'Czech','value':'Czech'},{'name':'Danish','value':'Danish'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Esperanto','value':'Esperanto'},{'name':'Estonian','value':'Estonian'},{'name':'Finnish','value':'Finnish'},{'name':'French','value':'French'},{'name':'Frisian','value':'Frisian'},{'name':'Galician','value':'Galician'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'Greek','value':'Greek'},{'name':'Gujarati','value':'Gujarati'},{'name':'Haitian Creole','value':'Haitian Creole'},{'name':'Hausa','value':'Hausa'},{'name':'Hawaiian','value':'Hawaiian'},{'name':'Hebrew','value':'Hebrew'},{'name':'Hindi','value':'Hindi'},{'name':'Hmong','value':'Hmong'},{'name':'Hungarian','value':'Hungarian'},{'name':'Icelandic','value':'Icelandic'},{'name':'Igbo','value':'Igbo'},{'name':'Indonesian','value':'Indonesian'},{'name':'Irish','value':'Irish'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Javanese','value':'Javanese'},{'name':'Kannada','value':'Kannada'},{'name':'Kazakh','value':'Kazakh'},{'name':'Khmer','value':'Khmer'},{'name':'Korean','value':'Korean'},{'name':'Kurdish','value':'Kurdish'},{'name':'Kyrgyz','value':'Kyrgyz'},{'name':'Lao','value':'Lao'},{'name':'Latin','value':'Latin'},{'name':'Latvian','value':'Latvian'},{'name':'Lithuanian','value':'Lithuanian'},{'name':'Luxembourgish','value':'Luxembourgish'},{'name':'Macedonian','value':'Macedonian'},{'name':'Malagasy','value':'Malagasy'},{'name':'Malay','value':'Malay'},{'name':'Malayalam','value':'Malayalam'},{'name':'Maltese','value':'Maltese'},{'name':'Maori','value':'Maori'},{'name':'Marathi','value':'Marathi'},{'name':'Mongolian','value':'Mongolian'},{'name':'Myanmar (Burmese)','value':'Myanmar (Burmese)'},{'name':'Nepali','value':'Nepali'},{'name':'Norwegian','value':'Norwegian'},{'name':'Nyanja (Chichewa)','value':'Nyanja (Chichewa)'},{'name':'Pashto','value':'Pashto'},{'name':'Persian','value':'Persian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Portugal, Brazil)','value':'Portuguese (Portugal, Brazil)'},{'name':'Punjabi','value':'Punjabi'},{'name':'Romanian','value':'Romanian'},{'name':'Russian','value':'Russian'},{'name':'Samoan','value':'Samoan'},{'name':'Scots Gaelic','value':'Scots Gaelic'},{'name':'Serbian','value':'Serbian'},{'name':'Sesotho','value':'Sesotho'},{'name':'Shona','value':'Shona'},{'name':'Sindhi','value':'Sindhi'},{'name':'Sinhala (Sinhalese)','value':'Sinhala (Sinhalese)'},{'name':'Slovak','value':'Slovak'},{'name':'Slovenian','value':'Slovenian'},{'name':'Somali','value':'Somali'},{'name':'Spanish','value':'Spanish'},{'name':'Sundanese','value':'Sundanese'},{'name':'Swahili','value':'Swahili'},{'name':'Swedish','value':'Swedish'},{'name':'Tagalog (Filipino)','value':'Tagalog (Filipino)'},{'name':'Tajik','value':'Tajik'},{'name':'Tamil','value':'Tamil'},{'name':'Telugu','value':'Telugu'},{'name':'Thai','value':'Thai'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'Urdu','value':'Urdu'},{'name':'Uzbek','value':'Uzbek'},{'name':'Vietnamese','value':'Vietnamese'},{'name':'Welsh','value':'Welsh'},{'name':'Xhosa','value':'Xhosa'},{'name':'Yiddish','value':'Yiddish'},{'name':'Yoruba','value':'Yoruba'},{'name':'Zulu','value':'Zulu'}]}]},{'k':'checkStringUppercase','d':'Check Text Is Uppercased','ed':'Check if string only contains uppercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'AAA'}]},{'k':'getStringUppercase','d':'Get Uppercased Text','ed':'Convert all letters found in a string to uppercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringVlookup','d':'Get String VLookup','ed':'Lookup string between multiple values by fuzzy logic and regex patterns','g':'text','p':[{'n':'text','r':true,'t':'string','p':'s4mple'},{'n':'texts','r':true,'t':'string','p':'sample,samples'}]},{'k':'getVatByAddress','d':'Get VAT% By Address','ed':'Get country VAT by address','g':'finance','p':[{'n':'address','r':true,'t':'string','p':'Mallorca, 120 España'}]},{'k':'getVatByCoordinates','d':'Get VAT% By Coordinates','ed':'Get country VAT by coordinates','g':'finance','p':[{'n':'coordinates','r':true,'t':'string','p':'41.61921,2.2904413'}]},{'k':'getVatByIp','d':'Get VAT% By IP','ed':'Get VAT by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getVatByIsocode','d':'Get VAT% By ISO Code','ed':'Get VAT value by country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getVatByNumber','d':'Get Data By TIN (VIES)','ed':'Get related european TIN number in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getVatByPhone','d':'Get VAT% By Phone','ed':'Get VAT by phone number, with worldwide coverage','g':'finance','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getVatByZipcode','d':'Get VAT% By Zipcode','ed':'Get VAT by zipcode','g':'finance','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkVatExist','d':'Check TIN Exists (VIES)','ed':'Check if TIN number exists in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getWordBanned','d':'Get Banned Words','ed':'Discover English banned words in the email body or subject','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am so thrilled to inform you that our new amazing feature is live!'}]},{'k':'getWordCleanAbuse','d':'Get Text Cleaned Without Abuse Words','ed':'Clean abuse words from a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'comentario de un maldito personaje'}]},{'k':'getWordCount','d':'Get Words Count','ed':'Count total words in a text','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'}]},{'k':'checkWordCountBetw','d':'Check Word Count Between','ed':'Check if the number of words in a sentence is between two determined quantities','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count1','r':true,'t':'string','p':'1'},{'n':'count2','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountEq','d':'Check Word Count Equal','ed':'Check if the number of words in a sentence equals a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGe','d':'Check Word Count Greater Or Equal','ed':'Check if the number of words in a sentence is greater than or equal to a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGt','d':'Check Word Count Greater','ed':'Check if the number of words in a sentence is greater than a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'1'}]},{'k':'checkWordCountLe','d':'Check Word Count Lower Or Equal','ed':'Check if the number of words present in a sentence is less than or equal to a quantity','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountLt','d':'Check Word Count Lower','ed':'','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'3'}]},{'k':'getZipcodeByIp','d':'Get Zipcode By IP','ed':'Discover the zipcode if you have an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getZipcodeByPrefix','d':'Get Zipcode By Prefix (ES)','ed':'Get first zipcode by prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'checkZipcodeExist','d':'Check Zipcode By Prefix Exists (ES)','ed':'Discover if a zipcode number prefix exists, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkZipcodeFormat','d':'Check Zipcode Has Valid Format (ES)','ed':'Discover if a zipcode number has a valid format, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getZipcodeListByPrefix','d':'Get Zipcodes By Prefix (ES)','ed':'Get multiple zipcodes by prefix, with worldwide coverage','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'getZipcodeNormalized','d':'Get Normalized Zipcode','ed':'Allow to normalize a zipcode, removing non allowed characters','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08i 12'}]}]}; \ No newline at end of file +export const tools = {processors: [{'k':'checkCreditcardChecksum','d':'Check Card Number Has Valid Format','ed':'Check if credit card number checksum is valid (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getCreditcardType','d':'Get Credit Card Type By Number','ed':'Get credit card type (Visa, Mastercard, Diners Club, Carte Blanche, American Express, Discover, JCB, enRoute, Solo, Switch, Maestro, LaserCard, ChinaUnionPay, BankCard, Voyager)','g':'finance','p':[{'n':'credit_card','r':true,'t':'string','p':'4024007151839544'}]},{'k':'getAddressBySearch','d':'Get Exact Address By Search','ed':'Get an exact address (street name, number, city, zipcode, province, region, country, latitude and longitude) by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona, España'}]},{'k':'getCoordinateBySearch','d':'Get Coordinates By Search','ed':'Discover latitude and longitude coordinates of a postal address','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona, España'}]},{'k':'checkAddressExist','d':'Check Exact Address Exists','ed':'Check if an exact address exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressNormalized','d':'Get Normalized Address','ed':'Allow to normalize an address, removing non allowed characters','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120, Barcelona Spain'}]},{'k':'checkAddressNumberExist','d':'Check Street Number Exists','ed':'Check if a house number exists by a partial address search','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Urgell, 120, Barcelona'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getAddressSplitted','d':'Get Parsed Address','ed':'Parse postal address into separated fields, getting a basic resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'getAddressSplittedBest','d':'Get Improved Parsed Address','ed':'Parse postal address into separated fields, getting an improved resolution','g':'geographic','p':[{'n':'address','r':true,'t':'string','p':'Compte Mallorca, 120 08036 Barcelona Barcelona Spain'}]},{'k':'checkCoordinateValid','d':'Check Valid Coordinates','ed':'Check if coordinates have a valid format','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'checkAgeBetw','d':'Check Age Between','ed':'Check if age is between two numbers','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years1','r':true,'t':'number','p':'35'},{'n':'years2','r':true,'t':'number','p':'50'}]},{'k':'getAgeByDate','d':'Get Age By Date','ed':'Discover the age of a birth date (multiple formats allowed)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeEq','d':'Check Ages Are Equal','ed':'Check if ages are equal','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'45'}]},{'k':'checkAgeGe','d':'Check Age Is Greater Or Equal','ed':'Check if age is greater or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'43'}]},{'k':'checkAgeGt','d':'Check Age Is Greater','ed':'Check if age is greater than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'40'}]},{'k':'checkAgeIsAdult','d':'Check Age Is Greater Than Or Equal To 18 Years','ed':'Check if birth date belongs to an adult: 18 years old (Spain)','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1950-05-20'}]},{'k':'checkAgeIsForties','d':'Check Age Is Between 40 And 49 Years','ed':'Check if date returns an age between 40 and 49 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'checkAgeIsRetired','d':'Check Age Is Greater Than 64 Years','ed':'Check if birth date returns an age greater than 64 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1954-05-20'}]},{'k':'checkAgeIsTwenties','d':'Check Age Is Between 20 And 29 Years','ed':'Check if date returns an age between 20 and 29 years old','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'2000-05-20'}]},{'k':'checkAgeLe','d':'Check Age Is Lower Or Equal','ed':'Check if age is lower or equal than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'checkAgeLt','d':'Check Age Is Lower','ed':'Chekc if age is lower than another','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'},{'n':'years','r':true,'t':'number','p':'46'}]},{'k':'getAgeRange','d':'Get Age Range By Date','ed':'Discover the age range of a person by birth date','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getAsinByEan','d':'Get ASIN By EAN','ed':'Get ASIN code by EAN code querying Internet.','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkAsinExist','d':'Check ASIN Exists','ed':'Check if a ASIN code exists on Amazon marketplace','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkAsinValid','d':'Check ASIN Valid','ed':'Check if a ASIN code has a valid format','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'getAudioAdvancedSpeechByText','d':'Get Advanced Speech By Text','ed':'Get advanced human audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'Arabic','value':'arabic'},{'name':'Bengali','value':'bengali'},{'name':'British','value':'british'},{'name':'Czech','value':'czech'},{'name':'Danish','value':'danish'},{'name':'Dutch','value':'dutch'},{'name':'Filipino','value':'filipino'},{'name':'Finnish','value':'finnish'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Greek','value':'greek'},{'name':'Gujurati','value':'gujurati'},{'name':'Hindi','value':'hindi'},{'name':'Hungarian','value':'hungarian'},{'name':'Indonesian','value':'indonesian'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Kannada','value':'kannada'},{'name':'Korean','value':'korean'},{'name':'Malayalam','value':'malayalam'},{'name':'Mandarin','value':'mandarin'},{'name':'Norwegian','value':'norwegian'},{'name':'Polish','value':'polish'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Slovak','value':'slovak'},{'name':'Spanish','value':'spanish'},{'name':'Tamil','value':'tamil'},{'name':'Telugu','value':'telugu'},{'name':'Thai','value':'thai'},{'name':'Turkish','value':'turkish'},{'name':'Ukranian','value':'ukranian'},{'name':'Vietnamese','value':'vietnamese'}]}]},{'k':'getAudioSpeechByText','d':'Get Speech By Text','ed':'Get audio file by provided text and language','g':'audio','p':[{'n':'text','r':true,'t':'string','p':'Hi! My name is Miquel. I will read any text you type here.'},{'n':'gender','r':true,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]},{'n':'language','r':true,'t':'options','p':'american','o':[{'name':'American','value':'american'},{'name':'French','value':'french'},{'name':'German','value':'german'},{'name':'Italian','value':'italian'},{'name':'Japanese','value':'japanese'},{'name':'Portuguese','value':'portuguese'},{'name':'Russian','value':'russian'},{'name':'Spanish','value':'spanish'}]}]},{'k':'checkBankAccountValidEs','d':'Check Bank Account Is Valid (ES)','ed':'Discover if account number has a valid format','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'}]},{'k':'checkBankBicValid','d':'Check BIC Is Valid','ed':'Discover if BIC number has a valid format','g':'finance','p':[{'n':'bic','r':true,'t':'string','p':'DABAIE2D'}]},{'k':'getBankIbanByAccount','d':'Get IBAN By Account','ed':'Get IBAN number by account number of the country','g':'finance','p':[{'n':'account','r':true,'t':'string','p':'14650120311716144388'},{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getBankIbanLookup','d':'Get IBAN Lookup','ed':'Get to search data bank information by IBAN account number','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'NL91ABNA0417164300'}]},{'k':'checkBankIbanValid','d':'Check IBAN Is Valid','ed':'Discover if IBAN account number has a valid format','g':'finance','p':[{'n':'iban','r':true,'t':'string','p':'ES3314650120311716144388'}]},{'k':'getBarcodeEncoded','d':'Get Encoded Barcode','ed':'Get an encoded barcode by number and required standard','g':'image','p':[{'n':'text','r':true,'t':'string','p':'0635753490879'},{'n':'bcid','r':true,'t':'options','p':'ean13','o':[{'name':'Auspost','value':'auspost'},{'name':'Azteccode','value':'azteccode'},{'name':'Azteccodecompact','value':'azteccodecompact'},{'name':'Aztecrune','value':'aztecrune'},{'name':'Bc412','value':'bc412'},{'name':'Channelcode','value':'channelcode'},{'name':'Codablockf','value':'codablockf'},{'name':'Code11','value':'code11'},{'name':'Code128','value':'code128'},{'name':'Code16k','value':'code16k'},{'name':'Code2of5','value':'code2of5'},{'name':'Code32','value':'code32'},{'name':'Code39','value':'code39'},{'name':'Code39ext','value':'code39ext'},{'name':'Code49','value':'code49'},{'name':'Code93','value':'code93'},{'name':'Code93ext','value':'code93ext'},{'name':'Codeone','value':'codeone'},{'name':'Coop2of5','value':'coop2of5'},{'name':'Daft','value':'daft'},{'name':'Databarexpanded','value':'databarexpanded'},{'name':'Databarexpandedcomposite','value':'databarexpandedcomposite'},{'name':'Databarexpandedstacked','value':'databarexpandedstacked'},{'name':'Databarexpandedstackedcomposite','value':'databarexpandedstackedcomposite'},{'name':'Databarlimited','value':'databarlimited'},{'name':'Databarlimitedcomposite','value':'databarlimitedcomposite'},{'name':'Databaromni','value':'databaromni'},{'name':'Databaromnicomposite','value':'databaromnicomposite'},{'name':'Databarstacked','value':'databarstacked'},{'name':'Databarstackedcomposite','value':'databarstackedcomposite'},{'name':'Databarstackedomni','value':'databarstackedomni'},{'name':'Databarstackedomnicomposite','value':'databarstackedomnicomposite'},{'name':'Databartruncated','value':'databartruncated'},{'name':'Databartruncatedcomposite','value':'databartruncatedcomposite'},{'name':'Datalogic2of5','value':'datalogic2of5'},{'name':'Datamatrix','value':'datamatrix'},{'name':'Datamatrixrectangular','value':'datamatrixrectangular'},{'name':'Dotcode','value':'dotcode'},{'name':'Ean13','value':'ean13'},{'name':'Ean13composite','value':'ean13composite'},{'name':'Ean14','value':'ean14'},{'name':'Ean2','value':'ean2'},{'name':'Ean5','value':'ean5'},{'name':'Ean8','value':'ean8'},{'name':'Ean8composite','value':'ean8composite'},{'name':'Flattermarken','value':'flattermarken'},{'name':'Gs1-128','value':'gs1-128'},{'name':'Gs1-128composite','value':'gs1-128composite'},{'name':'Gs1-cc','value':'gs1-cc'},{'name':'Gs1datamatrix','value':'gs1datamatrix'},{'name':'Gs1datamatrixrectangular','value':'gs1datamatrixrectangular'},{'name':'Gs1northamericancoupon','value':'gs1northamericancoupon'},{'name':'Hanxin','value':'hanxin'},{'name':'Hibcazteccode','value':'hibcazteccode'},{'name':'Hibccodablockf','value':'hibccodablockf'},{'name':'Hibccode128','value':'hibccode128'},{'name':'Hibccode39','value':'hibccode39'},{'name':'Hibcdatamatrix','value':'hibcdatamatrix'},{'name':'Hibcdatamatrixrectangular','value':'hibcdatamatrixrectangular'},{'name':'Hibcmicropdf417','value':'hibcmicropdf417'},{'name':'Hibcpdf417','value':'hibcpdf417'},{'name':'Iata2of5','value':'iata2of5'},{'name':'Identcode','value':'identcode'},{'name':'Industrial2of5','value':'industrial2of5'},{'name':'Interleaved2of5','value':'interleaved2of5'},{'name':'Isbn','value':'isbn'},{'name':'Ismn','value':'ismn'},{'name':'Issn','value':'issn'},{'name':'Itf14','value':'itf14'},{'name':'Japanpost','value':'japanpost'},{'name':'Kix','value':'kix'},{'name':'Leitcode','value':'leitcode'},{'name':'Matrix2of5','value':'matrix2of5'},{'name':'Maxicode','value':'maxicode'},{'name':'Micropdf417','value':'micropdf417'},{'name':'Msi','value':'msi'},{'name':'Onecode','value':'onecode'},{'name':'Pdf417','value':'pdf417'},{'name':'Pdf417compact','value':'pdf417compact'},{'name':'Pharmacode','value':'pharmacode'},{'name':'Pharmacode2','value':'pharmacode2'},{'name':'Planet','value':'planet'},{'name':'Plessey','value':'plessey'},{'name':'Posicode','value':'posicode'},{'name':'Postnet','value':'postnet'},{'name':'Pzn','value':'pzn'},{'name':'RationalizedCodabar','value':'rationalizedCodabar'},{'name':'Raw','value':'raw'},{'name':'Royalmail','value':'royalmail'},{'name':'Sscc18','value':'sscc18'},{'name':'Symbol','value':'symbol'},{'name':'Telepen','value':'telepen'},{'name':'Telepennumeric','value':'telepennumeric'},{'name':'Ultracode','value':'ultracode'},{'name':'Upca','value':'upca'},{'name':'Upcacomposite','value':'upcacomposite'},{'name':'Upce','value':'upce'},{'name':'Upcecomposite','value':'upcecomposite'}]}]},{'k':'getBookAuthorLookup','d':'Get Book By Author','ed':'Get book by author\'s surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookCategoryLookup','d':'Get Book By Category','ed':'Get all publications by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'checkBookIsbn','d':'Check ISBN Code Is Valid','ed':'Allow to check if an ISBN10/13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbnExist','d':'Check ISBN Code Exists','ed':'Allow to check if an ISBN book exist','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookIsbnLookup','d':'Get Book By ISBN','ed':'Get book or publication data by 10 or 13 digits ISBN code','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'checkBookIsbn10','d':'Check ISBN10 Code Is Valid','ed':'Allow to check if an ISBN10 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'0306406152'}]},{'k':'checkBookIsbn13','d':'Check ISBN13 Code Is Valid','ed':'Allow to check if an ISBN13 code has a valid format','g':'product','p':[{'n':'isbn','r':true,'t':'string','p':'9780306406157'}]},{'k':'getBookListAuthorLookup','d':'Get Books By Author','ed':'Get books by author\'s surname','g':'product','p':[{'n':'author','r':true,'t':'string','p':'Albert Einstein'}]},{'k':'getBookListCategoryLookup','d':'Get Books By Category','ed':'Get all books by category','g':'product','p':[{'n':'category','r':true,'t':'string','p':'science'}]},{'k':'getBookListPublisherLookup','d':'Get Books By Editor','ed':'Get all books by editor','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookListTitleLookup','d':'Get Books By Title','ed':'Get all books by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'Science'}]},{'k':'getBookPublisherLookup','d':'Get Book By Editor','ed':'Get book data by editor\'s name','g':'product','p':[{'n':'publisher','r':true,'t':'string','p':'Grupo RBA'}]},{'k':'getBookTitleLookup','d':'Get Book By Title','ed':'Get book data by title','g':'product','p':[{'n':'title','r':true,'t':'string','p':'La empresa más feliz del mundo'}]},{'k':'getNifByDni','d':'Get NIF By DNI (ES)','ed':'Discover the letter of a dni card number','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'getCifNormalized','d':'Get Normalized CIF','ed':'Allow to normalize a CIF number, removing non allowed characters','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B 62084 959'}]},{'k':'getDniNormalized','d':'Get Normalized DNI (ES)','ed':'Allow to normalize a DNI number, removing non allowed characters','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016a116'}]},{'k':'getNieNormalized','d':'Get Normalized NIE (ES)','ed':'Allow to normalize a NIE number, removing non allowed characters','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'X402001 122g'}]},{'k':'getNifNormalized','d':'Get Normalized NIF (ES)','ed':'Allow to normalize a NIF number, removing non allowed characters','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'402001 122g'}]},{'k':'checkCifValid','d':'Check CIF Is Valid (ES)','ed':'Discover if a cif card number is valid','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'A58818501'}]},{'k':'checkDniValid','d':'Check Valid Dni (ES)','ed':'Discover if a dni card number is valid','g':'personal','p':[{'n':'dni','r':true,'t':'string','p':'44016116'}]},{'k':'checkNieValid','d':'Check NIE Is Valid (ES)','ed':'Discover if a NIE card number is valid','g':'personal','p':[{'n':'nie','r':true,'t':'string','p':'Y2918527W'}]},{'k':'checkNifValid','d':'Check NIF Is Valid (ES)','ed':'Discover if a nif card number is valid','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'44016116G'}]},{'k':'getCityByIp','d':'Get City By IP','ed':'Get city from ip','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCityByName','d':'Get City By Name (ES)','ed':'City search by partial name (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Bar'}]},{'k':'getCityByPhone','d':'Get City By Phone (ES)','ed':'Discover the city name by the local phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getCityByZipcode','d':'Get City By Zipcode (ES)','ed':'Discover the city name by the zipcode (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCityListByName','d':'Get Cities By Prefix (ES)','ed':'Get multiple cities by partial initial text (only Spain)','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barce'}]},{'k':'getCityListByPhone','d':'Get Cities By Phone (ES)','ed':'Get multiple cities by phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'938499145'}]},{'k':'getCityListByZipcode','d':'Get Cities By Zipcode (ES)','ed':'Get multiple cities by zipcode prefix (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'234'}]},{'k':'getCityNormalized','d':'Get Normalized City','ed':'Allow to normalize a city, removing non allowed characters','g':'geographic','p':[{'n':'city','r':true,'t':'string','p':'Barc3l0na'}]},{'k':'checkEan13Valid','d':'Check EAN13 Is Valid','ed':'Check if a EAN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkGtin13Valid','d':'Check GTIN13 Is Valid','ed':'Check if a GTIN barcode of 13 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'4006381333931'}]},{'k':'checkEan14Valid','d':'Check EAN14 Is Valid','ed':'Check if a EAN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkGtin14Valid','d':'Check GTIN14 Is Valid','ed':'Check if a GTIN barcode of 14 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'04006381333931'}]},{'k':'checkEan18Valid','d':'Check EAN18 Is Valid','ed':'Check if a EAN barcode of 18 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'000004006381333931'}]},{'k':'checkEan8Valid','d':'Check EAN8 Is Valid','ed':'Check if a EAN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtin8Valid','d':'Check GTIN8 Is Valid','ed':'Check if a GTIN barcode of 8 digits has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getEanByAsin','d':'Get EAN By ASIN','ed':'Get EAN code by ASIN code querying Internet.','g':'product','p':[{'n':'asin','r':true,'t':'string','p':'B00005N5PF'}]},{'k':'checkEanExist','d':'Check EAN Exists','ed':'Check if a EAN code exists on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'0635753490879'}]},{'k':'checkUpcExist','d':'Check UPC Exists','ed':'Check if a UPC code exists','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkUpcFormat','d':'Check UPC Has Valid Format','ed':'Check if a UPC code has a valid format','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberIsin','d':'Check ISIN Code Is Valid','ed':'Check if ISIN number is valid','g':'company','p':[{'n':'isin','r':true,'t':'string','p':'US0378331005'}]},{'k':'getUpcLookup','d':'Get Product By UPC','ed':'Get product data of an UPC code on Amazon Marketplace (.com supported)','g':'product','p':[{'n':'upc','r':true,'t':'string','p':'635753490879'}]},{'k':'checkNumberSsEs','d':'Check Social Security Number Is Valid (ES)','ed':'Check if SS number is valid, only for Spain','g':'company','p':[{'n':'number','r':true,'t':'string','p':'998239812282'}]},{'k':'checkNumberUuid','d':'Check UUID Number Is Valid','ed':'Check if it a valid UUID number','g':'security','p':[{'n':'uuid','r':true,'t':'string','p':'550e8400-e29b-41d4-a716-446655440000'}]},{'k':'checkEanValid','d':'Check EAN Is Valid','ed':'Check if a EAN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'checkGtinValid','d':'Check GTIN Is Valid','ed':'Check if a GTIN barcode (8 or 13 digits) has a valid format','g':'product','p':[{'n':'ean','r':true,'t':'string','p':'40063812'}]},{'k':'getCommunityByZipcode','d':'Get Community By Zipcode (ES)','ed':'Discover the community name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getCompanyByCif','d':'Get Company By CIF (ES)','ed':'Get company data by CIF','g':'company','p':[{'n':'cif','r':true,'t':'string','p':'B66998592'}]},{'k':'getCompanyByDomain','d':'Get Company By Domain','ed':'Get company data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyByDuns','d':'Get Company By DUNS (ES)','ed':'Get company data by DUNS','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'464016690'}]},{'k':'getCompanyByEmail','d':'Get Company By Email','ed':'Get company data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getCompanyByIp','d':'Get Company By IP','ed':'Get company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'getCompanyByName','d':'Get Company By Name','ed':'Get company data by name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'},{'n':'country','r':false,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D\'ivoire','value':'Cote D\'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People\'s Republic Of','value':'Korea, Democratic People\'s Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People\'s Democratic Republic','value':'Lao People\'s Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]}]},{'k':'getCompanyByPhone','d':'Get Company By Phone','ed':'Get company data by phone number','g':'company','p':[{'n':'phone','r':true,'t':'string','p':'34933197570'}]},{'k':'getCompanyByProfile','d':'Get Company By Social Profile','ed':'Get company data by social network uri (LinkedIn, Twitter, ...)','g':'company','p':[{'n':'url','r':true,'t':'string','p':'https://twitter.com/Cloudflare'}]},{'k':'getPersonByProfile','d':'Get Person By Social Profile','ed':'Get personal data by social network profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getRoleClassified','d':'Get Classified Role','ed':'Identify and classify a prospect role detecting the right area and seniority to filter later','g':'company','p':[{'n':'role','r':true,'t':'string','p':'Project Manager'}]},{'k':'checkCompanyDebtorByTaxid','d':'Check Company Is Debtor By TaxId (ES)','ed':'Check if company is debtor by TaxId','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B04363115'}]},{'k':'getPersonDecisionMaker','d':'Get Decision Maker','ed':'Get professional data of a decision maker by company name/domain and area','g':'company','p':[{'n':'company','r':true,'t':'string','p':'uproc.io'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getPersonDecisionMakerBySearch','d':'Get Decision Maker By Search Engine','ed':'Discover the more suitable decision maker using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyDomainByName','d':'Get Domain By Company Name','ed':'Get company domain by company name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonEmailsByDomainAndArea','d':'Get Decision Maker\'s Emails By Domain And Area','ed':'Get professional emails of decision makers (by priority: executive, manager and directors) by company domain and area','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'oracle.com'},{'n':'area','r':true,'t':'options','p':'Marketing','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]}]},{'k':'getCompanyExtendedByDomain','d':'Get Company (Extended) By Domain','ed':'Get company contact, social and technology data by domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getCompanyExtendedByEmail','d':'Get Company (Extended) By Email','ed':'Get company contact, social and technology data by email','g':'company','p':[{'n':'email','r':true,'t':'string','p':'hello@killia.com'}]},{'k':'getPersonExtendedByProfile','d':'Get Person (Extended) By Profile','ed':'Get personal and social data by social profile','g':'personal','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getProfileFacebookByCompany','d':'Get Facebook URI By Company','ed':'Get Facebook company profile by name without manual search on Google or Facebook.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getCompanyFinancialByDomain','d':'Get Sales Data By Company\'s Domain','ed':'Get company sales data by company\'s domain name.

Next countries are supported: Spain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyFinancialByDuns','d':'Get Sales Data By Company\'s DUNS','ed':'Get company sales data by company\'s DUNS number.

Next countries are supported: Spain','g':'company','p':[{'n':'duns','r':true,'t':'string','p':'461809423'}]},{'k':'getCompanyFinancialByName','d':'Get Sales Data By Company\'s Name','ed':'Get company sales data by company\'s name.

Next countries are supported: Spain','g':'company','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getCompanyFinancialByTaxid','d':'Get Sales Data By Company\'s Taxid','ed':'Get company sales data by company\'s taxid (CIF).

Next countries are supported: Spain','g':'company','p':[{'n':'taxid','r':true,'t':'string','p':'B62084959'}]},{'k':'getCompanyGeocodedByIp','d':'Get Geocoded Company By IP','ed':'Get geocoded company data by IP address','g':'company','p':[{'n':'ip','r':true,'t':'string','p':'74.125.228.72'}]},{'k':'sendLinkedinInvitation','d':'Send Connection Request To Linkedin Profile','ed':'Send a custom message invitation to a non connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network! Thanks'}]},{'k':'sendLinkedinInvitationOrMessage','d':'Send Invitation Or Message To Linkedin Profile','ed':'Send a custom invitation message (parameter message1) if profile is connected or a custom message (parameter message2) otherwise (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message1','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'},{'n':'message2','r':true,'t':'string','p':'Hi {{first}}, thank you for accepting my invitation!'}]},{'k':'getProfileLinkedinByCompany','d':'Get LinkedIn URI By Company','ed':'Get LinkedIn company profile by name without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPersonListByParams','d':'Get Employees By Parameters','ed':'Get employees by company name or domain, area, seniority and country','g':'company','p':[{'n':'country','r':true,'t':'options','p':'Spain','o':[{'name':'Afghanistan','value':'Afghanistan'},{'name':'Albania','value':'Albania'},{'name':'Algeria','value':'Algeria'},{'name':'American Samoa','value':'American Samoa'},{'name':'Andorra','value':'Andorra'},{'name':'Angola','value':'Angola'},{'name':'Anguilla','value':'Anguilla'},{'name':'Antarctica','value':'Antarctica'},{'name':'Antigua And Barbuda','value':'Antigua And Barbuda'},{'name':'Argentina','value':'Argentina'},{'name':'Armenia','value':'Armenia'},{'name':'Aruba','value':'Aruba'},{'name':'Australia','value':'Australia'},{'name':'Austria','value':'Austria'},{'name':'Azerbaijan','value':'Azerbaijan'},{'name':'Bahamas','value':'Bahamas'},{'name':'Bahrain','value':'Bahrain'},{'name':'Bangladesh','value':'Bangladesh'},{'name':'Barbados','value':'Barbados'},{'name':'Belarus','value':'Belarus'},{'name':'Belgium','value':'Belgium'},{'name':'Belize','value':'Belize'},{'name':'Benin','value':'Benin'},{'name':'Bermuda','value':'Bermuda'},{'name':'Bhutan','value':'Bhutan'},{'name':'Bolivia','value':'Bolivia'},{'name':'Bosnia And Herzegovina','value':'Bosnia And Herzegovina'},{'name':'Botswana','value':'Botswana'},{'name':'Bouvet Island','value':'Bouvet Island'},{'name':'Brazil','value':'Brazil'},{'name':'British Indian Ocean Territory','value':'British Indian Ocean Territory'},{'name':'Brunei Darussalam','value':'Brunei Darussalam'},{'name':'Bulgaria','value':'Bulgaria'},{'name':'Burkina Faso','value':'Burkina Faso'},{'name':'Burundi','value':'Burundi'},{'name':'Cambodia','value':'Cambodia'},{'name':'Cameroon','value':'Cameroon'},{'name':'Canada','value':'Canada'},{'name':'Cape Verde','value':'Cape Verde'},{'name':'Cayman Islands','value':'Cayman Islands'},{'name':'Central African Republic','value':'Central African Republic'},{'name':'Chad','value':'Chad'},{'name':'Chile','value':'Chile'},{'name':'China','value':'China'},{'name':'Christmas Island','value':'Christmas Island'},{'name':'Cocos (keeling) Islands','value':'Cocos (keeling) Islands'},{'name':'Colombia','value':'Colombia'},{'name':'Comoros','value':'Comoros'},{'name':'Congo','value':'Congo'},{'name':'Congo, The Democratic Republic Of The','value':'Congo, The Democratic Republic Of The'},{'name':'Cook Islands','value':'Cook Islands'},{'name':'Costa Rica','value':'Costa Rica'},{'name':'Cote D\'ivoire','value':'Cote D\'ivoire'},{'name':'Croatia','value':'Croatia'},{'name':'Cuba','value':'Cuba'},{'name':'Cyprus','value':'Cyprus'},{'name':'Czech Republic','value':'Czech Republic'},{'name':'Denmark','value':'Denmark'},{'name':'Djibouti','value':'Djibouti'},{'name':'Dominica','value':'Dominica'},{'name':'Dominican Republic','value':'Dominican Republic'},{'name':'East Timor','value':'East Timor'},{'name':'Ecuador','value':'Ecuador'},{'name':'Egypt','value':'Egypt'},{'name':'El Salvador','value':'El Salvador'},{'name':'Equatorial Guinea','value':'Equatorial Guinea'},{'name':'Eritrea','value':'Eritrea'},{'name':'Estonia','value':'Estonia'},{'name':'Ethiopia','value':'Ethiopia'},{'name':'Falkland Islands (malvinas)','value':'Falkland Islands (malvinas)'},{'name':'Faroe Islands','value':'Faroe Islands'},{'name':'Fiji','value':'Fiji'},{'name':'Finland','value':'Finland'},{'name':'France','value':'France'},{'name':'French Guiana','value':'French Guiana'},{'name':'French Polynesia','value':'French Polynesia'},{'name':'French Southern Territories','value':'French Southern Territories'},{'name':'Gabon','value':'Gabon'},{'name':'Gambia','value':'Gambia'},{'name':'Georgia','value':'Georgia'},{'name':'Germany','value':'Germany'},{'name':'Ghana','value':'Ghana'},{'name':'Gibraltar','value':'Gibraltar'},{'name':'Greece','value':'Greece'},{'name':'Greenland','value':'Greenland'},{'name':'Grenada','value':'Grenada'},{'name':'Guadeloupe','value':'Guadeloupe'},{'name':'Guam','value':'Guam'},{'name':'Guatemala','value':'Guatemala'},{'name':'Guinea','value':'Guinea'},{'name':'Guinea-bissau','value':'Guinea-bissau'},{'name':'Guyana','value':'Guyana'},{'name':'Haiti','value':'Haiti'},{'name':'Heard Island And Mcdonald Islands','value':'Heard Island And Mcdonald Islands'},{'name':'Holy See (vatican City State)','value':'Holy See (vatican City State)'},{'name':'Honduras','value':'Honduras'},{'name':'Hong Kong','value':'Hong Kong'},{'name':'Hungary','value':'Hungary'},{'name':'Iceland','value':'Iceland'},{'name':'India','value':'India'},{'name':'Indonesia','value':'Indonesia'},{'name':'Iran, Islamic Republic Of','value':'Iran, Islamic Republic Of'},{'name':'Iraq','value':'Iraq'},{'name':'Ireland','value':'Ireland'},{'name':'Israel','value':'Israel'},{'name':'Italy','value':'Italy'},{'name':'Jamaica','value':'Jamaica'},{'name':'Japan','value':'Japan'},{'name':'Jordan','value':'Jordan'},{'name':'Kazakstan','value':'Kazakstan'},{'name':'Kenya','value':'Kenya'},{'name':'Kiribati','value':'Kiribati'},{'name':'Korea, Democratic People\'s Republic Of','value':'Korea, Democratic People\'s Republic Of'},{'name':'Korea, Republic Of','value':'Korea, Republic Of'},{'name':'Kosovo','value':'Kosovo'},{'name':'Kuwait','value':'Kuwait'},{'name':'Kyrgyzstan','value':'Kyrgyzstan'},{'name':'Lao People\'s Democratic Republic','value':'Lao People\'s Democratic Republic'},{'name':'Latvia','value':'Latvia'},{'name':'Lebanon','value':'Lebanon'},{'name':'Lesotho','value':'Lesotho'},{'name':'Liberia','value':'Liberia'},{'name':'Libyan Arab Jamahiriya','value':'Libyan Arab Jamahiriya'},{'name':'Liechtenstein','value':'Liechtenstein'},{'name':'Lithuania','value':'Lithuania'},{'name':'Luxembourg','value':'Luxembourg'},{'name':'Macau','value':'Macau'},{'name':'Macedonia, The Former Yugoslav Republic Of','value':'Macedonia, The Former Yugoslav Republic Of'},{'name':'Madagascar','value':'Madagascar'},{'name':'Malawi','value':'Malawi'},{'name':'Malaysia','value':'Malaysia'},{'name':'Maldives','value':'Maldives'},{'name':'Mali','value':'Mali'},{'name':'Malta','value':'Malta'},{'name':'Marshall Islands','value':'Marshall Islands'},{'name':'Martinique','value':'Martinique'},{'name':'Mauritania','value':'Mauritania'},{'name':'Mauritius','value':'Mauritius'},{'name':'Mayotte','value':'Mayotte'},{'name':'Mexico','value':'Mexico'},{'name':'Micronesia, Federated States Of','value':'Micronesia, Federated States Of'},{'name':'Moldova, Republic Of','value':'Moldova, Republic Of'},{'name':'Monaco','value':'Monaco'},{'name':'Mongolia','value':'Mongolia'},{'name':'Montenegro','value':'Montenegro'},{'name':'Montserrat','value':'Montserrat'},{'name':'Morocco','value':'Morocco'},{'name':'Mozambique','value':'Mozambique'},{'name':'Myanmar','value':'Myanmar'},{'name':'Namibia','value':'Namibia'},{'name':'Nauru','value':'Nauru'},{'name':'Nepal','value':'Nepal'},{'name':'Netherlands','value':'Netherlands'},{'name':'Netherlands Antilles','value':'Netherlands Antilles'},{'name':'New Caledonia','value':'New Caledonia'},{'name':'New Zealand','value':'New Zealand'},{'name':'Nicaragua','value':'Nicaragua'},{'name':'Niger','value':'Niger'},{'name':'Nigeria','value':'Nigeria'},{'name':'Niue','value':'Niue'},{'name':'Norfolk Island','value':'Norfolk Island'},{'name':'Northern Mariana Islands','value':'Northern Mariana Islands'},{'name':'Norway','value':'Norway'},{'name':'Oman','value':'Oman'},{'name':'Pakistan','value':'Pakistan'},{'name':'Palau','value':'Palau'},{'name':'Palestinian Territory, Occupied','value':'Palestinian Territory, Occupied'},{'name':'Panama','value':'Panama'},{'name':'Papua New Guinea','value':'Papua New Guinea'},{'name':'Paraguay','value':'Paraguay'},{'name':'Peru','value':'Peru'},{'name':'Philippines','value':'Philippines'},{'name':'Pitcairn','value':'Pitcairn'},{'name':'Poland','value':'Poland'},{'name':'Portugal','value':'Portugal'},{'name':'Puerto Rico','value':'Puerto Rico'},{'name':'Qatar','value':'Qatar'},{'name':'Reunion','value':'Reunion'},{'name':'Romania','value':'Romania'},{'name':'Russian Federation','value':'Russian Federation'},{'name':'Rwanda','value':'Rwanda'},{'name':'Saint Helena','value':'Saint Helena'},{'name':'Saint Kitts And Nevis','value':'Saint Kitts And Nevis'},{'name':'Saint Lucia','value':'Saint Lucia'},{'name':'Saint Pierre And Miquelon','value':'Saint Pierre And Miquelon'},{'name':'Saint Vincent And The Grenadines','value':'Saint Vincent And The Grenadines'},{'name':'Samoa','value':'Samoa'},{'name':'San Marino','value':'San Marino'},{'name':'Sao Tome And Principe','value':'Sao Tome And Principe'},{'name':'Saudi Arabia','value':'Saudi Arabia'},{'name':'Senegal','value':'Senegal'},{'name':'Serbia','value':'Serbia'},{'name':'Seychelles','value':'Seychelles'},{'name':'Sierra Leone','value':'Sierra Leone'},{'name':'Singapore','value':'Singapore'},{'name':'Slovakia','value':'Slovakia'},{'name':'Slovenia','value':'Slovenia'},{'name':'Solomon Islands','value':'Solomon Islands'},{'name':'Somalia','value':'Somalia'},{'name':'South Africa','value':'South Africa'},{'name':'South Georgia And The South Sandwich Islands','value':'South Georgia And The South Sandwich Islands'},{'name':'Spain','value':'Spain'},{'name':'Sri Lanka','value':'Sri Lanka'},{'name':'Sudan','value':'Sudan'},{'name':'Suriname','value':'Suriname'},{'name':'Svalbard And Jan Mayen','value':'Svalbard And Jan Mayen'},{'name':'Swaziland','value':'Swaziland'},{'name':'Sweden','value':'Sweden'},{'name':'Switzerland','value':'Switzerland'},{'name':'Syrian Arab Republic','value':'Syrian Arab Republic'},{'name':'Taiwan, Province Of China','value':'Taiwan, Province Of China'},{'name':'Tajikistan','value':'Tajikistan'},{'name':'Tanzania, United Republic Of','value':'Tanzania, United Republic Of'},{'name':'Thailand','value':'Thailand'},{'name':'Togo','value':'Togo'},{'name':'Tokelau','value':'Tokelau'},{'name':'Tonga','value':'Tonga'},{'name':'Trinidad And Tobago','value':'Trinidad And Tobago'},{'name':'Tunisia','value':'Tunisia'},{'name':'Turkey','value':'Turkey'},{'name':'Turkmenistan','value':'Turkmenistan'},{'name':'Turks And Caicos Islands','value':'Turks And Caicos Islands'},{'name':'Tuvalu','value':'Tuvalu'},{'name':'Uganda','value':'Uganda'},{'name':'Ukraine','value':'Ukraine'},{'name':'United Arab Emirates','value':'United Arab Emirates'},{'name':'United Kingdom','value':'United Kingdom'},{'name':'United States','value':'United States'},{'name':'United States Minor Outlying Islands','value':'United States Minor Outlying Islands'},{'name':'Uruguay','value':'Uruguay'},{'name':'Uzbekistan','value':'Uzbekistan'},{'name':'Vanuatu','value':'Vanuatu'},{'name':'Venezuela','value':'Venezuela'},{'name':'Viet Nam','value':'Viet Nam'},{'name':'Virgin Islands, British','value':'Virgin Islands, British'},{'name':'Virgin Islands, U.s.','value':'Virgin Islands, U.s.'},{'name':'Wallis And Futuna','value':'Wallis And Futuna'},{'name':'Western Sahara','value':'Western Sahara'},{'name':'Yemen','value':'Yemen'},{'name':'Zambia','value':'Zambia'},{'name':'Zimbabwe','value':'Zimbabwe'}]},{'n':'company','r':false,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'seniority','r':false,'t':'options','p':'','o':[{'name':'Apprentice','value':'Apprentice'},{'name':'Director','value':'Director'},{'name':'Executive','value':'Executive'},{'name':'Intermediate','value':'Intermediate'},{'name':'Manager','value':'Manager'}]},{'n':'email','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'phone','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]}]},{'k':'sendLinkedinMessage','d':'Send Message To Linkedin Profile','ed':'Send a custom private message to a connected Linkedin profile (supported uris: https://www.linkedin.com/in/USERID)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'message','r':true,'t':'string','p':'Hi {{first}}, would you like to be part of my network? Thanks'}]},{'k':'getPersonMultipleDecisionMakerBySearch','d':'Get Decision Makers By Search Engine','ed':'Discover up to ten decision makers using search engines (Bing) by company name and area (optional)','g':'company','p':[{'n':'company','r':true,'t':'string','p':'oracle'},{'n':'area','r':false,'t':'options','p':'','o':[{'name':'Communications','value':'Communications'},{'name':'Consulting','value':'Consulting'},{'name':'Customer service','value':'Customer service'},{'name':'Ecommerce','value':'Ecommerce'},{'name':'Education','value':'Education'},{'name':'Engineering','value':'Engineering'},{'name':'Finance','value':'Finance'},{'name':'Health professional','value':'Health professional'},{'name':'Human resources','value':'Human resources'},{'name':'Information technology','value':'Information technology'},{'name':'Legal','value':'Legal'},{'name':'Marketing','value':'Marketing'},{'name':'Operations','value':'Operations'},{'name':'Owner','value':'Owner'},{'name':'President','value':'President'},{'name':'Product','value':'Product'},{'name':'Public relations','value':'Public relations'},{'name':'Real estate','value':'Real estate'},{'name':'Recruiting','value':'Recruiting'},{'name':'Research','value':'Research'},{'name':'Sales','value':'Sales'}]},{'n':'clevel','r':false,'t':'options','p':'','o':[{'name':'No','value':'No'},{'name':'Yes','value':'Yes'}]},{'n':'location','r':false,'t':'string','p':''},{'n':'keyword','r':false,'t':'string','p':''}]},{'k':'getCompanyNameByDomain','d':'Get Company\'s Name By Domain','ed':'Get company name by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyPhoneByDomain','d':'Get Phone By Company Domain','ed':'Get company phone by company domain','g':'company','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getCompanyPhoneByName','d':'Get Phone By Company Name','ed':'Get company phone by company name','g':'company','p':[{'n':'name','r':true,'t':'string','p':'cyberclick'}]},{'k':'getProfileTwitterByCompany','d':'Get Twitter URI By Company','ed':'Get Twitter company profile by name without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'company','p':[{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getDistanceByAddresses','d':'Get Distance Between Addresses','ed':'Returns straight-line distance in kilometers between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'}]},{'k':'getRouteByAddresses','d':'Get Route Between Addresses','ed':'Returns driving routing time, distance, fuel consumption and cost between two addresses','g':'geographic','p':[{'n':'address1','r':true,'t':'string','p':'Mallorca 120, 08036, Barcelona'},{'n':'address2','r':true,'t':'string','p':'Mallorca 70, 08036, Barcelona'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByCoordinates','d':'Get Distance Between Coordinates','ed':'Returns straight-line distance in kilometers between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getRouteByCoordinates','d':'Get Route Between Coordinates','ed':'Returns driving routing time, distance, fuel consumption and cost between two GPS coordinates (latitude and longitude)','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.30'}]},{'k':'getCoordinateByIp','d':'Get Coordinates By IP','ed':'Discover latitude and longitude coordinates of an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getDistanceByIps','d':'Get Distance Between IPs','ed':'Returns straight-line distance in kilometers between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'}]},{'k':'getRouteByIps','d':'Get Route Between IPs','ed':'Returns driving routing time, distance, fuel consumption and cost between two IP addresses','g':'geographic','p':[{'n':'ip1','r':true,'t':'string','p':'95.23.100.79'},{'n':'ip2','r':true,'t':'string','p':'88.190.16.36'},{'n':'fuel_consumption','r':true,'t':'string','p':'5'},{'n':'price_liter','r':true,'t':'string','p':'1.2'}]},{'k':'getDistanceByPhones','d':'Get Distance Between Phones','ed':'Returns straight-line distance in kilometers between two landline phones, using city and province of every phone','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getRouteByPhones','d':'Get Route Between Phones','ed':'Returns driving routing time, distance, fuel consumption and cost between two landline phones, using city and province of every phone (only Spain)','g':'geographic','p':[{'n':'phone1','r':true,'t':'string','p':'932187670'},{'n':'phone2','r':true,'t':'string','p':'91213111111'}]},{'k':'getDistanceByZipcodes','d':'Get Distance Between Zipcodes','ed':'Returns straight-line distance in kilometers between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getRouteByZipcodes','d':'Get Route Between Zipcodes','ed':'Returns driving routing time, distance, fuel consumption and cost between two zipcodes, using city and province of every zipcode','g':'geographic','p':[{'n':'zipcode1','r':true,'t':'string','p':'08012'},{'n':'zipcode2','r':true,'t':'string','p':'28080'}]},{'k':'getCoordinateCartesian','d':'Get Cartesian Coordinates','ed':'Get Cartesian coordinates (X,Y,Z/WGS84) by Latitude and Longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateDecimal','d':'Get Decimal Coordinates','ed':'Get Decimal coordinates (degrees, minutes and seconds) by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'checkDistanceEq','d':'Check Distance Is Equal','ed':'Discover if the distance between two coordinates is equal to another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33.44'}]},{'k':'checkDistanceGe','d':'Check Distance Is Greater Or Equal','ed':'Discover if the distance in quilometers between two coordinates is greater or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'33'}]},{'k':'checkDistanceGt','d':'Check Distance Is Greater','ed':'Discover if the distance in quilometers between two coordinates is greater than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'30'}]},{'k':'checkDistanceLe','d':'Check Distance Is Lower Or Equal','ed':'Discover if the distance in quilometers between two coordinates is lower or equal than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'34'}]},{'k':'checkDistanceLt','d':'Check Distance Is Lower','ed':'Discover if the distance in quilometers between two coordinates is lower than another','g':'geographic','p':[{'n':'coordinates1','r':true,'t':'string','p':'41.2522,-12.10'},{'n':'coordinates2','r':true,'t':'string','p':'41.2522,-12.50'},{'n':'distance','r':true,'t':'string','p':'50'}]},{'k':'getCoordinateUsng','d':'Get USNG Coordinates','ed':'Get USNG coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCoordinateUtm','d':'Get UTM Coordinates','ed':'Get UTM coordinates by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.38879,2.15899'}]},{'k':'getCountryByCode','d':'Get Country By ISO Code','ed':'Get country name by its ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryByCurrencyCode','d':'Get Country By Currency','ed':'Get country name by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryByIp','d':'Get Country By IP','ed':'Get country name by IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCountryByName','d':'Get Country By Name','ed':'Get country by prefix','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa'}]},{'k':'getCountryByPhone','d':'Get Country By Phone','ed':'Get country name by phone number, with worldwide coverage','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getCountryCodeByName','d':'Get Country Code By Name','ed':'Get Alpha2 code by country prefix or name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCountryListByCode','d':'Get Countries By ISO Code','ed':'Get multiple countries by ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCountryListByCurrencyCode','d':'Get Countries By Currency','ed':'Get multiple country names by currency ISO code','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCountryListByName','d':'Get Countries By Prefix','ed':'Get multiple country names by initial name','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'S'}]},{'k':'getCountryNormalized','d':'Get Normalized Country','ed':'Allow to normalize a country, removing non allowed characters','g':'geographic','p':[{'n':'country','r':true,'t':'string','p':'Spa1n'}]},{'k':'checkCountryValidIso','d':'Check Country Code Exists','ed':'Check if country ISO code exists','g':'geographic','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByCountry','d':'Get Currency Code By Country Name','ed':'Get ISO currency code by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyByCountryIsocode','d':'Get Currency Code By Country Code','ed':'Get ISO currency code by an ISO country code','g':'finance','p':[{'n':'country_code','r':true,'t':'string','p':'ES'}]},{'k':'getCurrencyByIp','d':'Get Currency By IP','ed':'Get ISO currency code by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyByIsocode','d':'Get Currency By ISO Currency Code','ed':'Get an ISO currency code by a currency ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'getCurrencyConvertedBetweenIsocodeDate','d':'Get Conversion By Currencies And Date','ed':'Convert amount between supported currencies and an exchange date','g':'finance','p':[{'n':'amount','r':true,'t':'string','p':'10'},{'n':'isocode1','r':true,'t':'options','p':'EUR','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'isocode2','r':true,'t':'options','p':'USD','o':[{'name':'AUD','value':'AUD'},{'name':'BGN','value':'BGN'},{'name':'BRL','value':'BRL'},{'name':'CAD','value':'CAD'},{'name':'CHF','value':'CHF'},{'name':'CNY','value':'CNY'},{'name':'CZK','value':'CZK'},{'name':'DKK','value':'DKK'},{'name':'EUR','value':'EUR'},{'name':'GBP','value':'GBP'},{'name':'HKD','value':'HKD'},{'name':'HRK','value':'HRK'},{'name':'HUF','value':'HUF'},{'name':'IDR','value':'IDR'},{'name':'ILS','value':'ILS'},{'name':'INR','value':'INR'},{'name':'ISK','value':'ISK'},{'name':'JPY','value':'JPY'},{'name':'KRW','value':'KRW'},{'name':'MXN','value':'MXN'},{'name':'MYR','value':'MYR'},{'name':'NOK','value':'NOK'},{'name':'NZD','value':'NZD'},{'name':'PHP','value':'PHP'},{'name':'PLN','value':'PLN'},{'name':'RON','value':'RON'},{'name':'RUB','value':'RUB'},{'name':'SEK','value':'SEK'},{'name':'SGD','value':'SGD'},{'name':'THB','value':'THB'},{'name':'TRY','value':'TRY'},{'name':'USD','value':'USD'},{'name':'ZAR','value':'ZAR'}]},{'n':'date','r':false,'t':'string','p':'2018-02-12'}]},{'k':'getCurrencyListByCountry','d':'Get Currencies By Country','ed':'Get multiple ISO currency codes by a country name','g':'finance','p':[{'n':'country','r':true,'t':'string','p':'Spain'}]},{'k':'getCurrencyListByIp','d':'Get Currencies By IP','ed':'Get all ISO currency codes by an IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getCurrencyListByIsocode','d':'Get Currencies By ISO Code','ed':'Get multiple ISO currency codes by a country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkCurrencyValidIso','d':'Check ISO Currency Code Is Valid','ed':'Discover if an ISO currency code is valid','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'EUR'}]},{'k':'checkDateBetw','d':'Check Date Is Between Dates','ed':'Discover if a date (date1) is betwen two dates (date2, date3)','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':true,'t':'string','p':'1975-05-19'},{'n':'date3','r':true,'t':'string','p':'1975-05-22'}]},{'k':'getDateDifference','d':'Get Difference Between Dates','ed':'Returns difference between two dates (start and end) in seconds, minutes, hours or days
By default, difference is returned in seconds.','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'2018-10-10 00:00:00'},{'n':'date2','r':true,'t':'string','p':'2018-10-11 00:00:00'},{'n':'period','r':true,'t':'options','p':'seconds','o':[{'name':'Days','value':'days'},{'name':'Hours','value':'hours'},{'name':'Minutes','value':'minutes'},{'name':'Seconds','value':'seconds'}]}]},{'k':'checkDateEq','d':'Check Dates Are Equal','ed':'Discover if two dates are equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateGe','d':'Check Date Is Greater Or Equal','ed':'Discover if a date is greater or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateGt','d':'Check Date Is Greater','ed':'Discover if a date is greater','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-22'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'checkDateLe','d':'Check Date Is Lower Or Equal','ed':'Discover if a date is lower or equal','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-19'},{'n':'date2','r':false,'t':'string','p':'1975-05-20'}]},{'k':'checkDateLeap','d':'Check Date Is Leap Year','ed':'Discover if a date belongs to a leap year','g':'personal','p':[{'n':'date','r':false,'t':'string','p':'2008-05-20'}]},{'k':'checkDateLt','d':'Check Date Is Lower','ed':'Discover if a date is lower','g':'personal','p':[{'n':'date1','r':true,'t':'string','p':'1975-05-20'},{'n':'date2','r':false,'t':'string','p':'1975-05-21'}]},{'k':'getDateNormalized','d':'Get Normalized Date','ed':'Allow to normalize a date, removing non allowed characters','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20 /01/2018'}]},{'k':'getDateParsed','d':'Get Parsed Datetime','ed':'Parse datetime, without format dependency, into multiple fields','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'20/01/2018'}]},{'k':'checkDateValid','d':'Check Date Is Valid','ed':'Discover if a date has a valid format','g':'personal','p':[{'n':'date','r':true,'t':'string','p':'1975-05-20'}]},{'k':'getDeviceByUa','d':'Get Device By User Agent','ed':'Discover device features by user agent','g':'internet','p':[{'n':'useragent','r':true,'t':'string','p':'AppleTV5,3/9.1.1'}]},{'k':'getDomainBlacklists','d':'Get Domain Blacklists','ed':'Get all blacklists where a domain appears','g':'security','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getUrlByDomain','d':'Get Default URL By Domain','ed':'Get valid, existing and default URL when accessing a domain using a web browser.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getDomainByIp','d':'Get Domain By IP','ed':'Get the domain name related with the IP address','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainByUrl','d':'Get Root Domain By Web Address','ed':'Get root domain of any web address, removing non needed characters.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io'}]},{'k':'checkDomainCatchall','d':'Check Email Domain Is Catchall','ed':'Check if domain accepts all emails, existing or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'abinitio.es'}]},{'k':'checkDomainCertificate','d':'Check Domain Has Valid Certificate','ed':'Check if domain has a valid SSL certificate','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'uproc.io'}]},{'k':'getDomainCertificate','d':'Get Certificate By Domain','ed':'Get full SSL certificate data by domain (or website) and monitor your certificate status.

If domain has port 443 opened, a response will be returned.','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainDisposable','d':'Check Email Domain Is Temporary','ed':'Check if domain is temporary or not','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cowstore.org'}]},{'k':'checkDomainExist','d':'Check Domain Exists','ed':'Check if domain exists','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'}]},{'k':'checkDomainFormat','d':'Check Domain Has Valid Format','ed':'Check if domain has a valid format','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainFree','d':'Check Email Domain Is Free','ed':'Check if domain is a free service domain provider','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainIsp','d':'Get ISP By Domain','ed':'Get ISP known name of email domain name (hotmail, yahoo, gmail, mailgun, zoho, other)','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainLogo','d':'Get Logo By Domain','ed':'Discover logo (favicon) used in domain','g':'image','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'checkDomainMx','d':'Check Domain Has MX Record','ed':'Check if domain has a MX record','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'getUrlPdf','d':'Get Pdf By URL','ed':'Generate a PDF file by URL provided using Chrome browser','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'checkDomainRecord','d':'Check Domain Has DNS Record','ed':'Check if domain has a record of that type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'mydomain.com'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecord','d':'Get Domain Record By DNS Type','ed':'Get the domain record by its type','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'},{'n':'type','r':false,'t':'options','p':'A','o':[{'name':'A','value':'A'},{'name':'AAAA','value':'AAAA'},{'name':'CNAME','value':'CNAME'},{'name':'MX','value':'MX'},{'name':'NS','value':'NS'},{'name':'TXT','value':'TXT'}]}]},{'k':'getDomainRecords','d':'Get Domain DNS Records','ed':'Get all domain dns records','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'google.es'}]},{'k':'checkDomainReverse','d':'Check Domain Has IP','ed':'Check if domain has assigned the IP address defined','g':'internet','p':[{'n':'domain','r':false,'t':'string','p':'mail.nova.es'},{'n':'ip','r':true,'t':'string','p':'212.85.34.20'}]},{'k':'getDomainReverseIp','d':'Get IP By Domain','ed':'Get the IPv4 address linked with a domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'www.gmail.com'}]},{'k':'getUrlScreenshot','d':'Get Screenshot By URL','ed':'Generate a screenshot by URL provided using Chrome browser','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'width','r':false,'t':'options','p':'640','o':[{'name':'1024','value':'1024'},{'name':'160','value':'160'},{'name':'320','value':'320'},{'name':'640','value':'640'},{'name':'800','value':'800'}]},{'n':'fullpage','r':false,'t':'options','p':'no','o':[{'name':'No','value':'no'},{'name':'Yes','value':'yes'}]},{'n':'useragent','r':false,'t':'string','p':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36'},{'n':'selector','r':false,'t':'string','p':'h1.mt-4'}]},{'k':'getUrlShareableLinks','d':'Get Shareable Links','ed':'Generates shareable URIs to use on social networks and email using a content URI and a text.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'},{'n':'text','r':true,'t':'string','p':'This is an amazing title for my content'}]},{'k':'getDomainTechnologies','d':'Get Technologies By Domain','ed':'Discover client and server technologies used in domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getUrlTechnologies','d':'Get Technologies By URL','ed':'Discover client and server technologies used in web page','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.uproc.io/'}]},{'k':'getDomainVisits','d':'Get Visits By Domain','ed':'Get Website visits and rank of any domain','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'gmail.com'}]},{'k':'getDomainWhois','d':'Get Whois By Domain','ed':'Get the domain whois data by fields','g':'internet','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'}]},{'k':'getIpWhois','d':'Get Whois By IP Address','ed':'Get whois data fields by IP address provided.','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'140.82.118.4'}]},{'k':'sendEmailCustom','d':'Send Custom Email','ed':'Send a custom email (HTML supported) to a recipient','g':'communication','p':[{'n':'email_from','r':true,'t':'string','p':'mcolomer@killia.com'},{'n':'email_to','r':true,'t':'string','p':'mcolomer@gmail.com'},{'n':'subject','r':true,'t':'string','p':'Welcome email'},{'n':'body','r':true,'t':'string','p':'Hi!

Welcome to uProc and start improving your business processes!'}]},{'k':'checkEmailDisposable','d':'Check Email Is Disposable Domain','ed':'Check if email domain belongs to a disposable email service','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@jetable.com'}]},{'k':'getEmailDomain','d':'Get Domain By Email','ed':'Get domain part from an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExists','d':'Check Email Exists (Simple)','ed':'Discover if the email recipient exists, returning email status','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailExistsExtended','d':'Check Email Exists (Extended)','ed':'Discover if an email is valid, hardbounce, softbounce, spamtrap, free, temporary and recipient exists.

There are catchall (like Yahoo) or temporary domains that do not return the actual existence of an email','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getEmailFirstReferences','d':'Get First Web References Of An Email','ed':'Get three first web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'getEmailFix','d':'Get Fixed Domain Email','ed':'Fix the email domain of those misspelled emails (supports all domains)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmil.com'}]},{'k':'checkEmailFormat','d':'Check Email Has Valid Format','ed':'Check if email has a valid format','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@test.com'}]},{'k':'checkEmailFree','d':'Check Email Is Free','ed':'Check if email belongs to free service provider, like gmail, hotmail, ...','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'info@gmail.com'}]},{'k':'getEmailGdprListByDomain','d':'Get GDPR Emails By Domain','ed':'Get GDPR compliant emails list by domain for your Email Marketing campaigns in Europe.','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'}]},{'k':'getEmailListByDomain','d':'Get Emails By Domain','ed':'Get emails list found on internet by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListByEmail','d':'Get Emails By Email','ed':'Get emails list found on internet by non-free email (similar to hunter.io)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailListInSite','d':'Get Emails In Website','ed':'Get emails list found inside website by domain or URI (similar to hunter.io)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'uoc.edu'},{'n':'page','r':false,'t':'number','p':'1'}]},{'k':'getEmailNormalized','d':'Get Normalized Email','ed':'Normalize email address, removing non allowed characters','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test @gmail.com'}]},{'k':'getEmailRecipient','d':'Get Email By Name, Surname And Domain','ed':'Discover an email by company website or domain and prospect\'s firstname and lastname.

If \'verify\' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':false,'t':'string','p':'Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByCompanyAndFullname','d':'Get Email By Fullname And Company','ed':'Discover an email by company\'s name and prospect\'s fullname.

If \'verify\' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'company','r':true,'t':'string','p':'uproc'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByDomainAndFullname','d':'Get Email By Fullname And Domain','ed':'Discover an email by company website or domain and prospect\'s fullname.

If \'verify\' method is selected, tool checks multiple email variants in real-time, and returns a result depending on email server response','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'fullname','r':true,'t':'string','p':'Miquel Colomer'},{'n':'mode','r':true,'t':'options','p':'guess','o':[{'name':'Guess','value':'guess'},{'name':'Verify','value':'verify'}]}]},{'k':'getEmailRecipientByProfile','d':'Get Email By Social Network Profile','ed':'Discover an email by contact\'s LinkedIn profile URI','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getEmailRecipientGdpr','d':'Get Public Email By Name, Surname And Domain (GDPR)','ed':'Discover an email by company website or domain and prospect\'s firstname and lastname.

The tool only uses publicly available emails found on the internet and matches the recipient by first name and last name (GDPR compliant)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'killia.com'},{'n':'firstname','r':true,'t':'string','p':'hello'},{'n':'lastname','r':false,'t':'string','p':''}]},{'k':'getEmailReferences','d':'Get Web References Of An Email','ed':'Get web references of an email published on Internet','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@killia.com'}]},{'k':'checkEmailRole','d':'Check Email Is Role Based','ed':'Check if email belongs to a system or role based account','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'test@gmail.com'}]},{'k':'sendMobileSms','d':'Send Custom Sms','ed':'Send a custom sms to a recipient with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'text','r':true,'t':'string','p':'Thanks for your participation!'}]},{'k':'checkEmailSmtp','d':'Check Email Has SMTP Server','ed':'Check if email domain has an SMTP server to receive emails','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkEmailSpamtrap','d':'Check Email Is Spam Trap','ed':'Check if email is a spam trap','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'zzzwuzhdgvrxy@yahoo.co.jp'}]},{'k':'getEmailType','d':'Get Email Type','ed':'Get email type','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getFileCopiedBetweenUrls','d':'Get File Copied Between URLs','ed':'Copy file from one URL to another URL','g':'internet','p':[{'n':'source','r':true,'t':'string','p':'https://habilon.com/wp-content/uploads/2019/09/11b07c01.pdf'},{'n':'destination','r':true,'t':'string','p':'s3://ACCESSKEY:SECRETKEY@s3.amazon.com/BUCKET_NAME/sample.pdf'}]},{'k':'getFullnameParsed','d':'Get Parsed Fullname','ed':'Normalize fullname, fixing abbreviations, sorting if necessary and returning firstname, lastname and gender','g':'personal','p':[{'n':'fullname','r':true,'t':'string','p':'Colomer Salas Miquel'}]},{'k':'getGenderByEmail','d':'Get Gender By Email','ed':'Discover the gender of a person by the email, if person name is included in email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel.colomer@gmail.com'}]},{'k':'getGenderByPersonalName','d':'Get Gender By Name','ed':'Discover the gender of a person or company by name','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marc'}]},{'k':'checkGenderValid','d':'Check Gender Is Valid','ed':'Discover if a gender value is valid (multilanguage)','g':'personal','p':[{'n':'gender','r':true,'t':'string','p':'male'}]},{'k':'getImageExif','d':'Get EXIF Metadata From Image','ed':'It allows to discover all geograhical and technical EXIF metadata present in a photographic JPEG image.','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_photo_with_exif.jpg'}]},{'k':'getImageWithText','d':'Get Image With Text','ed':'Generate a new image by URL and text','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://killia-internal.s3-eu-west-1.amazonaws.com/sample/uproc_sample_resized.jpg'},{'n':'text','r':true,'t':'string','p':'Hi Miquel!'},{'n':'size','r':false,'t':'string','p':'80'}]},{'k':'getQrDecoded','d':'Get Decoded QR Code','ed':'Get QR Code decoded content by an image URL','g':'image','p':[{'n':'url','r':true,'t':'string','p':'https://s3.amazonaws.com/any-file/qr_38efdf6c60074375a6b0061201c644ac.png'}]},{'k':'getQrEncoded','d':'Get Encoded QR Code','ed':'Get QR Code encoded by a text','g':'image','p':[{'n':'text','r':true,'t':'string','p':'Sample text to encode'}]},{'k':'getIpBlacklists','d':'Get Ip Blacklists','ed':'Get all blacklists where an IP address appears','g':'security','p':[{'n':'ip','r':true,'t':'string','p':'172.217.168.165'}]},{'k':'getLinkedinConnections','d':'Get LinkedIn Last Received Connections','ed':'Extract last 80 connections from your LinkedIn profile','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-connections'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinGroupMembers','d':'Get LinkedIn Group Members','ed':'Get members in a LinkedIn group','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/groups/59923/members/'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinInvitations','d':'Get LinkedIn Last Sent Invitations','ed':'Extract last 80 invitations sent from your LinkedIn','g':'communication','p':[{'n':'list','r':false,'t':'string','p':'last-invitations'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]}]},{'k':'getLinkedinPostComments','d':'Get LinkedIn Post Comments','ed':'Get users who comment a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinPostLikes','d':'Get LinkedIn Post Likes','ed':'Get users who like a post on LinkedIn','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/posts/miquelcolomersalas_gdpr-emails-emailmarketing-activity-6607189465423314944-dbPv'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getLinkedinProfile','d':'Get LinkedIn Profile','ed':'Extract a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME)','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'},{'name':'Slow','value':'slow'}]}]},{'k':'checkLinkedinProfileIsContact','d':'Check LinkedIn Profile Is Contact','ed':'Check if a LinkedIn profile (url format accepted: https://linkedin.com/in/USERNAME) is a first degree contact','g':'communication','p':[{'n':'profile','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas'}]},{'k':'getLinkedinProfiles','d':'Get LinkedIn Profiles','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/search/results/people/?facetGeoRegion=%5B%22es%3A5064%22%5D&facetNetwork=%5B%22S%22%2C%22O%22%5D&keywords=cmo%20barcelona'},{'n':'list','r':false,'t':'string','p':'my-list'},{'n':'mode','r':false,'t':'options','p':'fast','o':[{'name':'Fast','value':'fast'},{'name':'Normal','value':'normal'}]},{'n':'amount','r':false,'t':'string','p':'10'}]},{'k':'getLinkedinProfilesByCompany','d':'Get LinkedIn Company Employees','ed':'Extract results from a LinkedIn search (url format accepted: https://linkedin.com/search/results/people/)','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/company/ibm/'},{'n':'list','r':false,'t':'string','p':'employees'}]},{'k':'getLinkedinProfilesByContent','d':'Get LinkedIn Profiles By Content','ed':'Extract fastly last profiles that have published content on LinkedIn by specific keywords','g':'communication','p':[{'n':'keywords','r':false,'t':'string','p':'Growth'},{'n':'list','r':false,'t':'string','p':'content'}]},{'k':'getLinkedinPublicProfileBySalesProfile','d':'Get Public Profile By Sales Profile','ed':'Converts a Sales proofile to a LinkedIn public profile','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/sales/people/AAEAAA--ETMBUWoPI56yWsffNb3dk4FTn5nYJ20,NAME_SEARCH,Ik98/'}]},{'k':'sendLinkedinVisit','d':'Send LinkedIn Profile Visit','ed':'Visits a profile to show interest and get profile views in return from contact, increasing your LinkedIn network','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.linkedin.com/in/miquelcolomersalas/'}]},{'k':'checkListContains','d':'Check List Contains','ed':'Check if the list contains a specific item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'2'}]},{'k':'checkListEnds','d':'Check List Ends With','ed':'Check if the list ends with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'3'}]},{'k':'checkListLengthBetw','d':'Check Length List Between','ed':'Check if the length of a list is between two quantities','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'4'}]},{'k':'checkListLengthEq','d':'Check Length List Equal','ed':'Checks if the length of a list equals a specified quantity','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGe','d':'Check Length List Greater Or Equal','ed':'Check if the length of a list is greater than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthGt','d':'Check Length List Greater','ed':'Check if the length of a list is greater than a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'2'}]},{'k':'checkListLengthLe','d':'Check Length List Lower Or Equal','ed':'Check if the length of a list is less than or equal to a certain amount','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkListLengthLt','d':'Check Length List Lower','ed':'','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkListMax','d':'Check Greater Element','ed':'Checks if the largest item in a list matches the provided item','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,4,8,3,4,5'},{'n':'number','r':true,'t':'string','p':'8'}]},{'k':'getListMax','d':'Get Greater Element','ed':'Returns the largest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListMin','d':'Check Lower Element','ed':'Checks if the smallest element in a list matches the provided element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'5,6,1,3,7'},{'n':'number','r':true,'t':'string','p':'1'}]},{'k':'getListMin','d':'Get Lower Element','ed':'Returns the smallest item in a list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'getListSort','d':'Get Sorted List','ed':'Returns an ascending sorted list','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListSorted','d':'Check List Is Sorted','ed':'Check if a list is sorted in ascending order','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'checkListStarts','d':'Check List Starts With','ed':'Check if the list starts with a specific element','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'text','r':true,'t':'string','p':'1'}]},{'k':'checkListUnique','d':'Check Unique Es List','ed':'Check if a list consists of unique elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3,4,5'}]},{'k':'getListUnique','d':'Get Unique List','ed':'Returns a single list, with no repeating elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'4,1,2,3,4'}]},{'k':'checkListValid','d':'Check Valid List','ed':'Check if the supplied values ​​form a valid list of elements','g':'text','p':[{'n':'list','r':true,'t':'string','p':'1,2,3'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getLocaleByIp','d':'Get Locale Data By IP','ed':'Discover locale data (currency, language) by ipv4 or ipv6 address.','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByCoordinates','d':'Get Location By Coordinates','ed':'Discover the city name, zipcode, province or country by latitude and longitude','g':'geographic','p':[{'n':'coordinates','r':true,'t':'string','p':'41.619206,2.2920828'}]},{'k':'getLocationByIp','d':'Get Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getReputationByIp','d':'Get Reputation By IP','ed':'Discover reputation by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getTimeByIp','d':'Get Time Data By IP','ed':'Discover datetime data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationByName','d':'Get Location By Name','ed':'Discover location data by name','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Cyberclick S.L.'}]},{'k':'getLocationByPhone','d':'Get Location By Landline Phone (ES)','ed':'Discover the city and the province from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'848491812'}]},{'k':'getLocationByZipcode','d':'Get Location By Zipcode (ES)','ed':'Discover the city and the province from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getLocationExtendedByIp','d':'Get Extended Location By IP','ed':'Discover geographical, company, timezone and reputation data by IPv4 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationGeocodedByIp','d':'Get Geocoded Location By IP','ed':'Discover the city name, zipcode, province, country, latitude and longitude from an ipv4 or ipv6 address and geocodes it','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getLocationListByName','d':'Get Locations By Name','ed':'Get most relevants locations by name (Google Maps typical search)','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Pintores Granollers'}]},{'k':'getLocationListByParams','d':'Get Locations By Parameters','ed':'Get most relevants locations by name, category, location and radius','g':'geographic','p':[{'n':'name','r':false,'t':'string','p':'Saba'},{'n':'category','r':false,'t':'options','p':'parking','o':[{'name':'Accounting','value':'accounting'},{'name':'Airport','value':'airport'},{'name':'Amusement_park','value':'amusement_park'},{'name':'Aquarium','value':'aquarium'},{'name':'Art_gallery','value':'art_gallery'},{'name':'Atm','value':'atm'},{'name':'Bakery','value':'bakery'},{'name':'Bank','value':'bank'},{'name':'Bar','value':'bar'},{'name':'Beauty_salon','value':'beauty_salon'},{'name':'Bicycle_store','value':'bicycle_store'},{'name':'Book_store','value':'book_store'},{'name':'Bowling_alley','value':'bowling_alley'},{'name':'Bus_station','value':'bus_station'},{'name':'Cafe','value':'cafe'},{'name':'Campground','value':'campground'},{'name':'Car_dealer','value':'car_dealer'},{'name':'Car_rental','value':'car_rental'},{'name':'Car_repair','value':'car_repair'},{'name':'Car_wash','value':'car_wash'},{'name':'Casino','value':'casino'},{'name':'Cemetery','value':'cemetery'},{'name':'Church','value':'church'},{'name':'City_hall','value':'city_hall'},{'name':'Clothing_store','value':'clothing_store'},{'name':'Convenience_store','value':'convenience_store'},{'name':'Courthouse','value':'courthouse'},{'name':'Dentist','value':'dentist'},{'name':'Department_store','value':'department_store'},{'name':'Doctor','value':'doctor'},{'name':'Electrician','value':'electrician'},{'name':'Electronics_store','value':'electronics_store'},{'name':'Embassy','value':'embassy'},{'name':'Establishment','value':'establishment'},{'name':'Finance','value':'finance'},{'name':'Fire_station','value':'fire_station'},{'name':'Florist','value':'florist'},{'name':'Food','value':'food'},{'name':'Funeral_home','value':'funeral_home'},{'name':'Furniture_store','value':'furniture_store'},{'name':'Gas_station','value':'gas_station'},{'name':'General_contractor','value':'general_contractor'},{'name':'Grocery_or_supermarket','value':'grocery_or_supermarket'},{'name':'Gym','value':'gym'},{'name':'Hair_care','value':'hair_care'},{'name':'Hardware_store','value':'hardware_store'},{'name':'Health','value':'health'},{'name':'Hindu_temple','value':'hindu_temple'},{'name':'Home_goods_store','value':'home_goods_store'},{'name':'Hospital','value':'hospital'},{'name':'Insurance_agency','value':'insurance_agency'},{'name':'Jewelry_store','value':'jewelry_store'},{'name':'Laundry','value':'laundry'},{'name':'Lawyer','value':'lawyer'},{'name':'Library','value':'library'},{'name':'Liquor_store','value':'liquor_store'},{'name':'Local_government_office','value':'local_government_office'},{'name':'Locksmith','value':'locksmith'},{'name':'Lodging','value':'lodging'},{'name':'Meal_delivery','value':'meal_delivery'},{'name':'Meal_takeaway','value':'meal_takeaway'},{'name':'Mosque','value':'mosque'},{'name':'Movie_rental','value':'movie_rental'},{'name':'Movie_theater','value':'movie_theater'},{'name':'Moving_location','value':'moving_location'},{'name':'Museum','value':'museum'},{'name':'Night_club','value':'night_club'},{'name':'Painter','value':'painter'},{'name':'Park','value':'park'},{'name':'Parking','value':'parking'},{'name':'Pet_store','value':'pet_store'},{'name':'Pharmacy','value':'pharmacy'},{'name':'Physiotherapist','value':'physiotherapist'},{'name':'Place_of_worship','value':'place_of_worship'},{'name':'Plumber','value':'plumber'},{'name':'Police','value':'police'},{'name':'Post_office','value':'post_office'},{'name':'Real_estate_agency','value':'real_estate_agency'},{'name':'Restaurant','value':'restaurant'},{'name':'Roofing_contractor','value':'roofing_contractor'},{'name':'Rv_park','value':'rv_park'},{'name':'School','value':'school'},{'name':'Shoe_store','value':'shoe_store'},{'name':'Shopping_mall','value':'shopping_mall'},{'name':'Spa','value':'spa'},{'name':'Stadium','value':'stadium'},{'name':'Storage','value':'storage'},{'name':'Store','value':'store'},{'name':'Subway_station','value':'subway_station'},{'name':'Synagogue','value':'synagogue'},{'name':'Taxi_stand','value':'taxi_stand'},{'name':'Train_station','value':'train_station'},{'name':'Transit_station','value':'transit_station'},{'name':'Travel_agency','value':'travel_agency'},{'name':'University','value':'university'},{'name':'Veterinary_care','value':'veterinary_care'},{'name':'Zoo','value':'zoo'}]},{'n':'location','r':true,'t':'string','p':'41.3851,2.1734'},{'n':'radius','r':false,'t':'string','p':'250'}]},{'k':'checkMobileAlive','d':'Check Mobile Is Alive','ed':'Discover if a mobile number is switched on to call it later, with worldwide coverage.
Some carriers don\'t return if mobile is alive (like Vodafone)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryCode','d':'Get Country ISO Code By Mobile','ed':'Allow to get country code (two chars) of a mobile phone number with international format','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileCountryPrefix','d':'Get Phone Prefix By Country ISO Code','ed':'Allow to get country prefix number by country code (2 characters)','g':'communication','p':[{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileExist','d':'Check Mobile Exists','ed':'Discover if mobile phone number exists in network operator, with worldwide coverage.
Get advanced mobile KPIs with \'Mobile lookup\' tool.','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileFormat','d':'Check Mobile Has Valid Format','ed':'Discover if mobile phone number has a valid format, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34623123213'},{'n':'country','r':true,'t':'string','p':'ES'}]},{'k':'checkMobileFormatEs','d':'Check Mobile Has Valid Format (ES)','ed':'Discover if mobile phone number has a valid format (only Spain)','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'623123213'}]},{'k':'getMobileFormatted','d':'Get Formatted Mobile','ed':'Format international mobile number by country ISO code (2 letters).','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileHlrLookup','d':'Get HLR Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileImei','d':'Check Imei Is Valid','ed':'Discover if Imei number has a valid format','g':'communication','p':[{'n':'imei','r':true,'t':'string','p':'490154203237518'}]},{'k':'getMobileLookup','d':'Get Mobile Lookup','ed':'Discover if mobile exist via real time [HLR](https://en.wikipedia.org/wiki/Home_location_register) query, as well as portability and roaming data','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileMnpLookup','d':'Get Mobile Portability Lookup','ed':'Get existence, portability and roaming of a mobile phone, via [MNP](https://en.wikipedia.org/wiki/Mobile_number_portability) query','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileNormalized','d':'Get Normalized Mobile','ed':'Allow to normalize a mobile phone, removing non allowed characters','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34 62318 2 770'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'getMobileOrPhoneLookupEs','d':'Get Mobile/Landline Lookup (Spain)','ed':'Discover if mobile or landline prefix exists on Spain.','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'34605281220'}]},{'k':'getMobileOrPhoneMnpEs','d':'Get Landline/Mobile Portability Lookup (ES)','ed':'Get portability data about a landline or mobile number, only for Spain','g':'communication','p':[{'n':'number','r':true,'t':'string','p':'605281220'}]},{'k':'checkMobileSms','d':'Check Mobile Supports Sms','ed':'Discover if a mobile number can receive sms, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefix','d':'Check Mobile Has Valid Prefix','ed':'Discover if mobile phone number has a valid prefix, with worldwide coverage','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'checkMobileValidPrefixEs','d':'Check Mobile Has Valid Prefix (ES)','ed':'Discover if spanish mobile phone number has a valid prefix','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'605281220'}]},{'k':'getNameByPrefix','d':'Get Name By Prefix (ES)','ed':'Get first personal name matching by prefix and gender from INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'checkNameExist','d':'Check Name Exists (ES)','ed':'Check if a personal name exists in INE data source (only Spain)','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Juan'}]},{'k':'getNameListByPrefix','d':'Get Names By Prefix','ed':'Get multiple personal names by prefix','g':'geographic','p':[{'n':'name','r':true,'t':'string','p':'Marce'},{'n':'gender','r':false,'t':'options','p':'male','o':[{'name':'Female','value':'female'},{'name':'Male','value':'male'}]}]},{'k':'getNameNormalized','d':'Get Normalized Name','ed':'Normalize name removing non allowed characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'M4rc'}]},{'k':'checkNameValid','d':'Check Name Has Valid Format','ed':'Check if name contains accepted characters','g':'personal','p':[{'n':'name','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getUrlAnalysis','d':'Get URL Analysis','ed':'Analyze URL\'s health status about SSL, broken links, conflictive HTTP links with SSL, and more.','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'}]},{'k':'getNetAton','d':'Get Number By IP','ed':'Convert an IP address to numeric notation','g':'internet','p':[{'n':'ip','r':true,'t':'string','p':'62.12.22.11'}]},{'k':'getNetByIp','d':'Get Network By IP','ed':'Discover network data by ipv4 or ipv6 address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'checkUrlContains','d':'Check URL Contains','ed':'Check if an URL contains string or regular expression (case insensitive)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://uproc.io'},{'n':'regex','r':true,'t':'string','p':'uProc'}]},{'k':'getUrlContents','d':'Get Contents From URL','ed':'Get text data from web, pdf or image (png, jpg, gif), allowing to filter some elements by regular expressions or field names (email, phone, zipcode).

Learn about regular expressions on [Wikipedia](https://en.wikipedia.org/wiki/Regular_expression)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'},{'n':'selector','r':false,'t':'string','p':'emails'}]},{'k':'getUrlContentsParsed','d':'Get Parsed Contents From URL','ed':'Obtains the content of a web in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getUrlDecode','d':'Get Decoded URL','ed':'Decode URL to recover original','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https%3A%2F%2Fgoogle.es'}]},{'k':'getUrlEncode','d':'Get Encoded URL','ed':'Encode URL to avoid problems','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://google.com'}]},{'k':'checkUrlExist','d':'Check URL Exists','ed':'Check if an URL exists','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'getNetFixip','d':'Get Fixed IP','ed':'Fix an IP address to the right format','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'212169160147'}]},{'k':'checkNetHostAlive','d':'Check Host Is Up','ed':'Discover if a computer is switched on','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.es'}]},{'k':'checkStringIp','d':'Check IP Has Valid Format','ed':'Check if IPv4 or IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'23.45.57.123'}]},{'k':'checkStringIp4','d':'Check IPv4 Has Valid Format','ed':'Check if IPv4 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'127.0.0.1'}]},{'k':'checkStringIp6','d':'Check IPv6 Has Valid Format','ed':'Check if IPv6 address has a valid format','g':'text','p':[{'n':'ip','r':true,'t':'string','p':'2a01:c50e:3544:bd00:4df0:7609:251a:f6d0'}]},{'k':'getUrlListContentsParsed','d':'Get Parsed Contents From Results URL','ed':'Obtains a list with multiple results from a website in a structured way in JSON format to be able to save it wherever you want','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://www.google.com/search?q=killia+Technologies'}]},{'k':'getNetNtoa','d':'Get IP By Number','ed':'Convert a number to an IP address','g':'internet','p':[{'n':'number','r':true,'t':'string','p':'1501706957'}]},{'k':'getUrlParsed','d':'Get Parsed URL','ed':'Decode URL into multiple fields','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://docs.uproc.io/pdf/resumen_del_servicio_EN.pdf'}]},{'k':'getNetScan','d':'Get Opened Ports In Host','ed':'Scan a host and returns most common open ports: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 27017','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'google.es'}]},{'k':'checkNetServiceUp','d':'Check Service Is Up','ed':'Discover if a service in a port is available','g':'internet','p':[{'n':'host','r':true,'t':'string','p':'www.google.com'},{'n':'port','r':true,'t':'string','p':'80'}]},{'k':'getUrlTables','d':'Get Table From URL','ed':'Get data from existing table in HTML page (by table number) or in a PDF file (by table column number) in CSV format (columns delimited by ;)','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2'},{'n':'table','r':false,'t':'string','p':'3'}]},{'k':'checkUrlValid','d':'Check URL Is Valid','ed':'Check that an URL has a valid format','g':'internet','p':[{'n':'url','r':true,'t':'string','p':'http://www.google.com'}]},{'k':'checkNumberBetw','d':'Check Number Is Between','ed':'Check if number is between two values','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'21'},{'n':'number3','r':true,'t':'string','p':'24'}]},{'k':'checkNumberDecimal','d':'Check Decimal Number Is Valid','ed':'Check if value is a decimal number','p':[{'n':'number','r':true,'t':'string','p':'0.23'}]},{'k':'checkNumberEq','d':'Check Number Is Equal','ed':'Check if number is equal to another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberEven','d':'Check Even Number Is Valid','ed':'Check if number is even','p':[{'n':'number','r':true,'t':'string','p':'2'}]},{'k':'checkNumberGe','d':'Check Number Is Greater Or Equal','ed':'Check if number is greater or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberGt','d':'Check Number Is Greater','ed':'Check if number is greater than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'22'}]},{'k':'checkNumberLe','d':'Check Number Is Lower Or Equal','ed':'Check if number is lower or equal than another','p':[{'n':'number1','r':true,'t':'string','p':'23'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLt','d':'Check Number Is Lower','ed':'Check if number is lower than another','p':[{'n':'number1','r':true,'t':'string','p':'22'},{'n':'number2','r':true,'t':'string','p':'23'}]},{'k':'checkNumberLuhn','d':'Check Luhn Number Is Valid','ed':'Check if it a valid Luhn number','g':'security','p':[{'n':'luhn','r':true,'t':'string','p':'79927398713'}]},{'k':'checkNumberMod','d':'Check Modulus Is Equals','ed':'Check if modulus between two numbers is equal to a value','p':[{'n':'number','r':true,'t':'string','p':'10'},{'n':'mod','r':true,'t':'string','p':'2'},{'n':'rest','r':true,'t':'string','p':'0'}]},{'k':'checkNumberNatural','d':'Check Natural Number Is Valid','ed':'Check if value is a natural number','p':[{'n':'number','r':true,'t':'string','p':'0'}]},{'k':'checkStringNumeric','d':'Check Numeric String Is Valid','ed':'Check if string length contains only numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'123'}]},{'k':'checkNumberOdd','d':'Check Odd Number Is Valid','ed':'Check if number is odd','p':[{'n':'number','r':true,'t':'string','p':'3'}]},{'k':'checkNumberPrime','d':'Check Prime Number Is Valid','ed':'Check if number is prime','p':[{'n':'number','r':true,'t':'string','p':'11'}]},{'k':'checkPasswordStrong','d':'Check Password Is Strong','ed':'Check is password is sure and contains a lowercase, uppercase, numbers, special characters and have a minimum length of four characters','g':'security','p':[{'n':'password','r':true,'t':'string','p':'1agdA*$#'}]},{'k':'getPersonByEmail','d':'Get Person By Email','ed':'Get personal data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonByFirstnameLastnameCompanyLocation','d':'Get Person By Firstname, Lastname, Company And Location','ed':'Get personal data by firstname, lastname, company and location','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':false,'t':'string','p':'uProc'},{'n':'location','r':false,'t':'string','p':''}]},{'k':'getPersonByMobile','d':'Get Person By Mobile','ed':'Get personal data by mobile','g':'personal','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'sendPersonEmailToList','d':'Send Email\'s Contact To List','ed':'Add a contact email to a person list','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'list','r':false,'t':'string','p':'my-list'}]},{'k':'getPersonExtendedByEmail','d':'Get Person (Extended) By Email','ed':'Get prospect\'s contact data and company\'s location and social data by email','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getPersonExtendedByEmailAndCompany','d':'Get Person (Extended) By Email And Company','ed':'Get contact, location and social data by email and company name and location','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'},{'n':'company','r':false,'t':'string','p':'uProc'}]},{'k':'getPersonFakedData','d':'Get Random Person Data','ed':'Generates random fake data','g':'personal','p':[{'n':'locality','r':true,'t':'options','p':'English','o':[{'name':'Australia (English)','value':'Australia (English)'},{'name':'Australia Ocker (English)','value':'Australia Ocker (English)'},{'name':'Azerbaijani','value':'Azerbaijani'},{'name':'Bork (English)','value':'Bork (English)'},{'name':'Canada (English)','value':'Canada (English)'},{'name':'Canada (French)','value':'Canada (French)'},{'name':'Chinese','value':'Chinese'},{'name':'Chinese (Taiwan)','value':'Chinese (Taiwan)'},{'name':'Czech','value':'Czech'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Farsi','value':'Farsi'},{'name':'French','value':'French'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'German (Austria)','value':'German (Austria)'},{'name':'German (Switzerland)','value':'German (Switzerland)'},{'name':'Great Britain (English)','value':'Great Britain (English)'},{'name':'India (English)','value':'India (English)'},{'name':'Indonesia','value':'Indonesia'},{'name':'Ireland (English)','value':'Ireland (English)'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Korean','value':'Korean'},{'name':'Nepalese','value':'Nepalese'},{'name':'Norwegian','value':'Norwegian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Brazil)','value':'Portuguese (Brazil)'},{'name':'Russian','value':'Russian'},{'name':'Slovakian','value':'Slovakian'},{'name':'Spanish','value':'Spanish'},{'name':'Spanish Mexico','value':'Spanish Mexico'},{'name':'Swedish','value':'Swedish'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'United States (English)','value':'United States (English)'},{'name':'Vietnamese','value':'Vietnamese'}]}]},{'k':'getProfileByEmployeeData','d':'Get LinkedIn URI By First, Last And Company','ed':'Get LinkedIn employee profile URI by firstname, lastname and company without manual search on Google or LinkedIn.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Miquel'},{'n':'lastname','r':true,'t':'string','p':'Colomer'},{'n':'company','r':true,'t':'string','p':'uProc'}]},{'k':'getSurnameByPrefix','d':'Get Surname By Prefix (ES)','ed':'Get first personal surname matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Col'}]},{'k':'checkSurnameExist','d':'Check Surname Is Valid (ES)','ed':'Check if a personal surname appears in INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileLinkedinByEmail','d':'Get LinkedIn URI By Email','ed':'Get LinkedIn employee profile URI by business email.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'getSurnameListByPrefix','d':'Get Surnames By Prefix (ES)','ed':'Get personal surnames matching by prefix from INE data source (only Spain)','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Co'}]},{'k':'getSurnameNormalized','d':'Get Normalized Surname','ed':'Normalize surname','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'C0lomer'}]},{'k':'getProfileTwitterByEmployeeData','d':'Get Twitter URI By First, Last And Company','ed':'Get Twitter profile by firstname, lastname and company without manual search on Google or Twitter.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'Carlos'},{'n':'lastname','r':true,'t':'string','p':'Blanco'},{'n':'company','r':true,'t':'string','p':'Encomenda'}]},{'k':'checkSurnameValid','d':'Check Surname Has Valid Format','ed':'Check if surname contains accepted characters','g':'personal','p':[{'n':'surname','r':true,'t':'string','p':'Gonzalez'}]},{'k':'getProfileXingByEmployeeData','d':'Get Xing URI By First, Last And Company','ed':'Get Xing profile by firstname, lastname and company without manual search on Google or Xing.

This tool uses search engines (Bing and Google) through proxies','g':'personal','p':[{'n':'firstname','r':true,'t':'string','p':'David'},{'n':'lastname','r':true,'t':'string','p':'Tomás'},{'n':'company','r':true,'t':'string','p':'Cyberclick'}]},{'k':'getPhoneFixed','d':'Get Fixed Phone','ed':'Fix the international prefix of a phone based on the ISO code of a country','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'+1605281220'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormat','d':'Check Valid Phone Format By Country','ed':'Allow to discover if landline number has a good international format, depending on country ','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':true,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneFormatEs','d':'Check Valid Phone Format (ES)','ed':'Discover if landline phone number is valid, with Spain coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'932187670'}]},{'k':'getPhoneNormalized','d':'Get Cleaned Phone','ed':'Clean a phone removing non allowed characters','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'3493218 767o'},{'n':'country','r':false,'t':'options','p':'ES','o':[{'name':'AD','value':'AD'},{'name':'AE','value':'AE'},{'name':'AF','value':'AF'},{'name':'AG','value':'AG'},{'name':'AI','value':'AI'},{'name':'AL','value':'AL'},{'name':'AM','value':'AM'},{'name':'AO','value':'AO'},{'name':'AQ','value':'AQ'},{'name':'AR','value':'AR'},{'name':'AS','value':'AS'},{'name':'AT','value':'AT'},{'name':'AU','value':'AU'},{'name':'AW','value':'AW'},{'name':'AX','value':'AX'},{'name':'AZ','value':'AZ'},{'name':'BA','value':'BA'},{'name':'BB','value':'BB'},{'name':'BD','value':'BD'},{'name':'BE','value':'BE'},{'name':'BF','value':'BF'},{'name':'BG','value':'BG'},{'name':'BH','value':'BH'},{'name':'BI','value':'BI'},{'name':'BJ','value':'BJ'},{'name':'BL','value':'BL'},{'name':'BM','value':'BM'},{'name':'BN','value':'BN'},{'name':'BO','value':'BO'},{'name':'BQ','value':'BQ'},{'name':'BR','value':'BR'},{'name':'BS','value':'BS'},{'name':'BT','value':'BT'},{'name':'BV','value':'BV'},{'name':'BW','value':'BW'},{'name':'BY','value':'BY'},{'name':'BZ','value':'BZ'},{'name':'CA','value':'CA'},{'name':'CC','value':'CC'},{'name':'CD','value':'CD'},{'name':'CF','value':'CF'},{'name':'CG','value':'CG'},{'name':'CH','value':'CH'},{'name':'CI','value':'CI'},{'name':'CK','value':'CK'},{'name':'CL','value':'CL'},{'name':'CM','value':'CM'},{'name':'CN','value':'CN'},{'name':'CO','value':'CO'},{'name':'CR','value':'CR'},{'name':'CU','value':'CU'},{'name':'CV','value':'CV'},{'name':'CW','value':'CW'},{'name':'CX','value':'CX'},{'name':'CY','value':'CY'},{'name':'CZ','value':'CZ'},{'name':'DE','value':'DE'},{'name':'DJ','value':'DJ'},{'name':'DK','value':'DK'},{'name':'DM','value':'DM'},{'name':'DO','value':'DO'},{'name':'DZ','value':'DZ'},{'name':'EC','value':'EC'},{'name':'EE','value':'EE'},{'name':'EG','value':'EG'},{'name':'EH','value':'EH'},{'name':'ER','value':'ER'},{'name':'ES','value':'ES'},{'name':'ET','value':'ET'},{'name':'FI','value':'FI'},{'name':'FJ','value':'FJ'},{'name':'FK','value':'FK'},{'name':'FM','value':'FM'},{'name':'FO','value':'FO'},{'name':'FR','value':'FR'},{'name':'GA','value':'GA'},{'name':'GB','value':'GB'},{'name':'GD','value':'GD'},{'name':'GE','value':'GE'},{'name':'GF','value':'GF'},{'name':'GG','value':'GG'},{'name':'GH','value':'GH'},{'name':'GI','value':'GI'},{'name':'GL','value':'GL'},{'name':'GM','value':'GM'},{'name':'GN','value':'GN'},{'name':'GP','value':'GP'},{'name':'GQ','value':'GQ'},{'name':'GR','value':'GR'},{'name':'GS','value':'GS'},{'name':'GT','value':'GT'},{'name':'GU','value':'GU'},{'name':'GW','value':'GW'},{'name':'GY','value':'GY'},{'name':'HK','value':'HK'},{'name':'HM','value':'HM'},{'name':'HN','value':'HN'},{'name':'HR','value':'HR'},{'name':'HT','value':'HT'},{'name':'HU','value':'HU'},{'name':'ID','value':'ID'},{'name':'IE','value':'IE'},{'name':'IL','value':'IL'},{'name':'IM','value':'IM'},{'name':'IN','value':'IN'},{'name':'IO','value':'IO'},{'name':'IQ','value':'IQ'},{'name':'IR','value':'IR'},{'name':'IS','value':'IS'},{'name':'IT','value':'IT'},{'name':'JE','value':'JE'},{'name':'JM','value':'JM'},{'name':'JO','value':'JO'},{'name':'JP','value':'JP'},{'name':'KE','value':'KE'},{'name':'KG','value':'KG'},{'name':'KH','value':'KH'},{'name':'KI','value':'KI'},{'name':'KM','value':'KM'},{'name':'KN','value':'KN'},{'name':'KP','value':'KP'},{'name':'KR','value':'KR'},{'name':'KW','value':'KW'},{'name':'KY','value':'KY'},{'name':'KZ','value':'KZ'},{'name':'LA','value':'LA'},{'name':'LB','value':'LB'},{'name':'LC','value':'LC'},{'name':'LI','value':'LI'},{'name':'LK','value':'LK'},{'name':'LR','value':'LR'},{'name':'LS','value':'LS'},{'name':'LT','value':'LT'},{'name':'LU','value':'LU'},{'name':'LV','value':'LV'},{'name':'LY','value':'LY'},{'name':'MA','value':'MA'},{'name':'MC','value':'MC'},{'name':'MD','value':'MD'},{'name':'ME','value':'ME'},{'name':'MF','value':'MF'},{'name':'MG','value':'MG'},{'name':'MH','value':'MH'},{'name':'MK','value':'MK'},{'name':'ML','value':'ML'},{'name':'MM','value':'MM'},{'name':'MN','value':'MN'},{'name':'MO','value':'MO'},{'name':'MP','value':'MP'},{'name':'MQ','value':'MQ'},{'name':'MR','value':'MR'},{'name':'MS','value':'MS'},{'name':'MT','value':'MT'},{'name':'MU','value':'MU'},{'name':'MV','value':'MV'},{'name':'MW','value':'MW'},{'name':'MX','value':'MX'},{'name':'MY','value':'MY'},{'name':'MZ','value':'MZ'},{'name':'NA','value':'NA'},{'name':'NC','value':'NC'},{'name':'NE','value':'NE'},{'name':'NF','value':'NF'},{'name':'NG','value':'NG'},{'name':'NI','value':'NI'},{'name':'NL','value':'NL'},{'name':'NO','value':'NO'},{'name':'NP','value':'NP'},{'name':'NR','value':'NR'},{'name':'NU','value':'NU'},{'name':'NZ','value':'NZ'},{'name':'OM','value':'OM'},{'name':'PA','value':'PA'},{'name':'PE','value':'PE'},{'name':'PF','value':'PF'},{'name':'PG','value':'PG'},{'name':'PH','value':'PH'},{'name':'PK','value':'PK'},{'name':'PL','value':'PL'},{'name':'PM','value':'PM'},{'name':'PN','value':'PN'},{'name':'PR','value':'PR'},{'name':'PS','value':'PS'},{'name':'PT','value':'PT'},{'name':'PW','value':'PW'},{'name':'PY','value':'PY'},{'name':'QA','value':'QA'},{'name':'RE','value':'RE'},{'name':'RO','value':'RO'},{'name':'RS','value':'RS'},{'name':'RU','value':'RU'},{'name':'RW','value':'RW'},{'name':'SA','value':'SA'},{'name':'SB','value':'SB'},{'name':'SC','value':'SC'},{'name':'SD','value':'SD'},{'name':'SE','value':'SE'},{'name':'SG','value':'SG'},{'name':'SH','value':'SH'},{'name':'SI','value':'SI'},{'name':'SJ','value':'SJ'},{'name':'SK','value':'SK'},{'name':'SL','value':'SL'},{'name':'SM','value':'SM'},{'name':'SN','value':'SN'},{'name':'SO','value':'SO'},{'name':'SR','value':'SR'},{'name':'SS','value':'SS'},{'name':'ST','value':'ST'},{'name':'SV','value':'SV'},{'name':'SX','value':'SX'},{'name':'SY','value':'SY'},{'name':'SZ','value':'SZ'},{'name':'TC','value':'TC'},{'name':'TD','value':'TD'},{'name':'TF','value':'TF'},{'name':'TG','value':'TG'},{'name':'TH','value':'TH'},{'name':'TJ','value':'TJ'},{'name':'TK','value':'TK'},{'name':'TL','value':'TL'},{'name':'TM','value':'TM'},{'name':'TN','value':'TN'},{'name':'TO','value':'TO'},{'name':'TR','value':'TR'},{'name':'TT','value':'TT'},{'name':'TV','value':'TV'},{'name':'TW','value':'TW'},{'name':'TZ','value':'TZ'},{'name':'UA','value':'UA'},{'name':'UG','value':'UG'},{'name':'UM','value':'UM'},{'name':'US','value':'US'},{'name':'UY','value':'UY'},{'name':'UZ','value':'UZ'},{'name':'VA','value':'VA'},{'name':'VC','value':'VC'},{'name':'VE','value':'VE'},{'name':'VG','value':'VG'},{'name':'VI','value':'VI'},{'name':'VN','value':'VN'},{'name':'VU','value':'VU'},{'name':'WF','value':'WF'},{'name':'WS','value':'WS'},{'name':'YE','value':'YE'},{'name':'YT','value':'YT'},{'name':'ZA','value':'ZA'},{'name':'ZM','value':'ZM'},{'name':'ZW','value':'ZW'}]}]},{'k':'checkPhoneOrMobileValid','d':'Check Phone Or Mobile Valid','ed':'Discover if landline or mobile number has a valid prefix','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'},{'n':'country','r':false,'t':'string','p':'ES'}]},{'k':'getPhoneParsed','d':'Get Parsed And Validated Phone','ed':'Parse phone number in multiple fields and verify format and prefix validity (phone existence is not checked)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'checkPhoneValidPrefix','d':'Check Valid Phone Prefix','ed':'Discover if a landline phone number prefix exists, with worldwide coverage','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'34932187670'}]},{'k':'getProvinceByIp','d':'Get Province By IP','ed':'Discover the province name from an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getProvinceByName','d':'Get Province By Name (ES)','ed':'You can get the first province by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceByPhone','d':'Get Province By Phone (ES)','ed':'Discover the province name from a landline phone number (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceByZipcode','d':'Get Province By Zipcode (ES)','ed':'Discover the province name from a zipcode number (only Spain)','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08'}]},{'k':'getProvinceListByName','d':'Get Provinces By Name (ES)','ed':'You can get a province list by a name prefix (only Spain)','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'B'}]},{'k':'getProvinceListByPhone','d':'Get Provinces By Phone (ES)','ed':'You can get a province list by a phone prefix (only Spain)','g':'geographic','p':[{'n':'phone','r':true,'t':'string','p':'932'}]},{'k':'getProvinceListByZipcode','d':'Get Provinces By Zipcode (ES)','ed':'You can get a province list by a zipcode prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'0'}]},{'k':'getProvinceNormalized','d':'Get Normalized Province','ed':'Allow to normalize a province, removing non allowed characters','g':'geographic','p':[{'n':'province','r':true,'t':'string','p':'Barce lona'}]},{'k':'checkRobinsonEmailExist','d':'Check Email Is Robinson (ES)','ed':'Discover if an email exists in the Robinson list (only Spain)','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'manzaned@uvigo.es'}]},{'k':'checkRobinsonNifExist','d':'Check Nif Number Is Robinson (ES)','ed':'Discover if an nif exists in the Robinson list (only Spain)','g':'personal','p':[{'n':'nif','r':true,'t':'string','p':'00002206K'}]},{'k':'checkRobinsonPhoneExist','d':'Check Phone Is Robinson (ES)','ed':'Discover if a phone (landline or mobile) exists in a Robinson list (only Spain)','g':'communication','p':[{'n':'phone','r':true,'t':'string','p':'917156252'}]},{'k':'getSentimentByText','d':'Get Sentiment From A Text','ed':'It allows to analyze an english text with Emojis and detect sentiment','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am very happy'}]},{'k':'checkSocialDomainExist','d':'Check Domain Has Social Activity','ed':'Discover if a domain has social network presence','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainLookup','d':'Get Social Networks By Domain','ed':'Discover if a domain or a website has social activity and returns all social network profiles found','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'getSocialDomainParsed','d':'Get Social Networks Activity By Domain','ed':'Search all social networks by domain, parses all found urls and returns social networks kpis (if data available)','g':'communication','p':[{'n':'domain','r':true,'t':'string','p':'cyberclick.es'}]},{'k':'checkSocialEmailExist','d':'Check Email Has Social Activity','ed':'Discover if the email has social network presence','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'mcolomer@gmail.com'}]},{'k':'getSocialEmailLookup','d':'Get Social Networks By Email','ed':'Discover if an email has social activity, and get all social network profiles found','g':'communication','p':[{'n':'email','r':true,'t':'string','p':'miquel@uproc.io'}]},{'k':'checkSocialMobileExist','d':'Check Mobile Has Social Activity','ed':'Discover if the mobile phone has social network presence','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialMobileLookup','d':'Get Social Networks By Mobile','ed':'Discover if an mobile phone has social activity, and get all social network profiles found','g':'communication','p':[{'n':'mobile','r':true,'t':'string','p':'34605281220'}]},{'k':'getSocialUriParsed','d':'Get Social Network Activity','ed':'This tools parses a social uri address and extracts any available indicators','g':'communication','p':[{'n':'url','r':true,'t':'string','p':'https://www.facebook.com/uprocdataquality'}]},{'k':'checkStringAlpha','d':'Check Alphabetic String Is Valid','ed':'Check if string length contains only letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'asc'}]},{'k':'checkStringAlphanumeric','d':'Check Alphanumeric String Is Valid','ed':'Check if string length contains only numbers and letters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aa11'}]},{'k':'getStringBase64','d':'Get BASE64 Value','ed':'Convert a string to a BASE64 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'checkStringBlank','d':'Check String Is Empty','ed':'Check if string has no content','g':'text','p':[{'n':'text','r':true,'t':'string','p':''}]},{'k':'checkStringBoolean','d':'Check Boolean String Is Valid','ed':'Check if string is true or false','g':'text','p':[{'n':'text','r':true,'t':'string','p':'true'}]},{'k':'getStringByFormat','d':'Get Formatted String By Pattern','ed':'It allows to format a string using a format pattern','g':'text','p':[{'n':'text','r':true,'t':'string','p':'1122'},{'n':'format','r':true,'t':'string','p':'%09d'}]},{'k':'getStringByRegex','d':'Get Generated Text By Pattern','ed':'Generate a random string using a regular expression as a pattern','g':'text','p':[{'n':'regex','r':true,'t':'string','p':'[0-9]{,2}-[a-zA-Z]{2,3}-[A-Z]{2,5}-[0-9]{2}-[a-z]*'}]},{'k':'checkStringContains','d':'Check String Contains Char','ed':'Check if string contains a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'checkStringEnds','d':'Check String Ends With','ed':'Check if string ends with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringFieldName','d':'Get Field Type By Value','ed':'Get field name, analyzing field value provided.

Supported values: Email, Domain, Isbn, Ean, Upc, Dni, Nie, Cif, Date, Gender (male, female), Landline, Mobile phone, Zip code, Web address','g':'text','p':[{'n':'text','r':true,'t':'string','p':'myemail@mydomain.com'}]},{'k':'getStringJoin','d':'Get Merged Values By Text','ed':'Join a character or string to join two values','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'hi'},{'n':'text2','r':true,'t':'string','p':'good morning!'},{'n':'glue','r':true,'t':'string','p':','}]},{'k':'getStringLength','d':'Get String Length','ed':'Get length of a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'checkStringLengthBetw','d':'Check String Length Is Between','ed':'Check if string length is between two numbers','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length1','r':true,'t':'number','p':'3'},{'n':'length2','r':true,'t':'number','p':'5'}]},{'k':'checkStringLengthEq','d':'Check String Length Is Equal','ed':'Check if string length is equal to number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGe','d':'Check String Length Is Greater Or Equal','ed':'Check if string length is greater or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthGt','d':'Check String Length Is Greater','ed':'Check if string length is greater than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'3'}]},{'k':'checkStringLengthLe','d':'Check String Length Is Lower Or Equal','ed':'Check if string length is lower or equal than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'4'}]},{'k':'checkStringLengthLt','d':'Check String Length Is Lower','ed':'Check if string length is lower than number','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'length','r':true,'t':'number','p':'5'}]},{'k':'checkStringLowercase','d':'Check Text Is Lowercased','ed':'Check if string only contains lowercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'aaa'}]},{'k':'getStringLowercase','d':'Get Lowercased Text','ed':'Convert all letters found in a string to lowercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringMd5','d':'Get MD5 String','ed':'Convert a string to a MD5 encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringNormalized','d':'Get Normalized String By Field','ed':'Normalize a string depending on the field name','g':'text','p':[{'n':'field','r':true,'t':'options','p':'name','o':[{'name':'Alphabetic','value':'alphabetic'},{'name':'Alphanumeric','value':'alphanumeric'},{'name':'Cif','value':'cif'},{'name':'City','value':'city'},{'name':'Country','value':'country'},{'name':'Date','value':'date'},{'name':'Decimal','value':'decimal'},{'name':'Dni','value':'dni'},{'name':'Domain','value':'domain'},{'name':'Email','value':'email'},{'name':'Gender','value':'gender'},{'name':'Integer','value':'integer'},{'name':'Ip','value':'ip'},{'name':'Mobile','value':'mobile'},{'name':'Name','value':'name'},{'name':'Nie','value':'nie'},{'name':'Nif','value':'nif'},{'name':'Phone','value':'phone'},{'name':'Province','value':'province'},{'name':'Zipcode','value':'zipcode'}]},{'n':'text','r':true,'t':'string','p':'JMª Gº.Fco.gtez. Gro.'}]},{'k':'getStringParsed','d':'Get Parsed Text','ed':'Analyze string and return all emails, phones, zipcodes and links detected','g':'text','p':[{'n':'text','r':true,'t':'string','p':'My email is miquel@uproc.io and my phone is 34605281220'}]},{'k':'checkStringRandom','d':'Check String Is Random','ed':'Check if string contains random characters without sense','g':'text','p':[{'n':'text','r':true,'t':'string','p':'t2 chhsdfitoixcv'}]},{'k':'checkStringRegex','d':'Check String Is Valid By Pattern','ed':'Check if string contains a value that matches with a regular expression','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'},{'n':'regex','r':true,'t':'string','p':'^test$'}]},{'k':'getStringReplaceAll','d':'Get Texts Replaced By String','ed':'Replace all values found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringReplaceFirst','d':'Get Text Replaced By String','ed':'Replace first value found in a string by another','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'find','r':true,'t':'string','p':'o'},{'n':'replace','r':true,'t':'string','p':'u'}]},{'k':'getStringSha','d':'Get SHA String','ed':'Convert a string to a SHA encoded value','g':'text','p':[{'n':'text','r':true,'t':'string','p':'test'}]},{'k':'getStringSplit','d':'Get Splitted Values By Separator','ed':'Split a value in two parts, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Texto largo, separado por coma'},{'n':'separator','r':true,'t':'string','p':','}]},{'k':'getStringSplitAndJoin','d':'Get Splitted And Merged Values By Separator','ed':'Split a value in two parts and join them, using a separator present in the original string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, good morning!'},{'n':'separator','r':true,'t':'string','p':','},{'n':'glue','r':true,'t':'string','p':';'}]},{'k':'checkStringStarts','d':'Check String Starts With','ed':'Check if string starts with a character','g':'text','p':[{'n':'text1','r':true,'t':'string','p':'test'},{'n':'text2','r':true,'t':'string','p':'t'}]},{'k':'getStringTranslated','d':'Get Translated Text','ed':'It allows to translate a text to any language','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, my name is Mike'},{'n':'language','r':true,'t':'options','p':'Spanish','o':[{'name':'Afrikaans','value':'Afrikaans'},{'name':'Albanian','value':'Albanian'},{'name':'Amharic','value':'Amharic'},{'name':'Arabic','value':'Arabic'},{'name':'Armenian','value':'Armenian'},{'name':'Azeerbaijani','value':'Azeerbaijani'},{'name':'Basque','value':'Basque'},{'name':'Belarusian','value':'Belarusian'},{'name':'Bengali','value':'Bengali'},{'name':'Bosnian','value':'Bosnian'},{'name':'Bulgarian','value':'Bulgarian'},{'name':'Catalan','value':'Catalan'},{'name':'Cebuano','value':'Cebuano'},{'name':'Chinese (Simplified)','value':'Chinese (Simplified)'},{'name':'Chinese (Traditional)','value':'Chinese (Traditional)'},{'name':'Corsican','value':'Corsican'},{'name':'Croatian','value':'Croatian'},{'name':'Czech','value':'Czech'},{'name':'Danish','value':'Danish'},{'name':'Dutch','value':'Dutch'},{'name':'English','value':'English'},{'name':'Esperanto','value':'Esperanto'},{'name':'Estonian','value':'Estonian'},{'name':'Finnish','value':'Finnish'},{'name':'French','value':'French'},{'name':'Frisian','value':'Frisian'},{'name':'Galician','value':'Galician'},{'name':'Georgian','value':'Georgian'},{'name':'German','value':'German'},{'name':'Greek','value':'Greek'},{'name':'Gujarati','value':'Gujarati'},{'name':'Haitian Creole','value':'Haitian Creole'},{'name':'Hausa','value':'Hausa'},{'name':'Hawaiian','value':'Hawaiian'},{'name':'Hebrew','value':'Hebrew'},{'name':'Hindi','value':'Hindi'},{'name':'Hmong','value':'Hmong'},{'name':'Hungarian','value':'Hungarian'},{'name':'Icelandic','value':'Icelandic'},{'name':'Igbo','value':'Igbo'},{'name':'Indonesian','value':'Indonesian'},{'name':'Irish','value':'Irish'},{'name':'Italian','value':'Italian'},{'name':'Japanese','value':'Japanese'},{'name':'Javanese','value':'Javanese'},{'name':'Kannada','value':'Kannada'},{'name':'Kazakh','value':'Kazakh'},{'name':'Khmer','value':'Khmer'},{'name':'Korean','value':'Korean'},{'name':'Kurdish','value':'Kurdish'},{'name':'Kyrgyz','value':'Kyrgyz'},{'name':'Lao','value':'Lao'},{'name':'Latin','value':'Latin'},{'name':'Latvian','value':'Latvian'},{'name':'Lithuanian','value':'Lithuanian'},{'name':'Luxembourgish','value':'Luxembourgish'},{'name':'Macedonian','value':'Macedonian'},{'name':'Malagasy','value':'Malagasy'},{'name':'Malay','value':'Malay'},{'name':'Malayalam','value':'Malayalam'},{'name':'Maltese','value':'Maltese'},{'name':'Maori','value':'Maori'},{'name':'Marathi','value':'Marathi'},{'name':'Mongolian','value':'Mongolian'},{'name':'Myanmar (Burmese)','value':'Myanmar (Burmese)'},{'name':'Nepali','value':'Nepali'},{'name':'Norwegian','value':'Norwegian'},{'name':'Nyanja (Chichewa)','value':'Nyanja (Chichewa)'},{'name':'Pashto','value':'Pashto'},{'name':'Persian','value':'Persian'},{'name':'Polish','value':'Polish'},{'name':'Portuguese (Portugal, Brazil)','value':'Portuguese (Portugal, Brazil)'},{'name':'Punjabi','value':'Punjabi'},{'name':'Romanian','value':'Romanian'},{'name':'Russian','value':'Russian'},{'name':'Samoan','value':'Samoan'},{'name':'Scots Gaelic','value':'Scots Gaelic'},{'name':'Serbian','value':'Serbian'},{'name':'Sesotho','value':'Sesotho'},{'name':'Shona','value':'Shona'},{'name':'Sindhi','value':'Sindhi'},{'name':'Sinhala (Sinhalese)','value':'Sinhala (Sinhalese)'},{'name':'Slovak','value':'Slovak'},{'name':'Slovenian','value':'Slovenian'},{'name':'Somali','value':'Somali'},{'name':'Spanish','value':'Spanish'},{'name':'Sundanese','value':'Sundanese'},{'name':'Swahili','value':'Swahili'},{'name':'Swedish','value':'Swedish'},{'name':'Tagalog (Filipino)','value':'Tagalog (Filipino)'},{'name':'Tajik','value':'Tajik'},{'name':'Tamil','value':'Tamil'},{'name':'Telugu','value':'Telugu'},{'name':'Thai','value':'Thai'},{'name':'Turkish','value':'Turkish'},{'name':'Ukrainian','value':'Ukrainian'},{'name':'Urdu','value':'Urdu'},{'name':'Uzbek','value':'Uzbek'},{'name':'Vietnamese','value':'Vietnamese'},{'name':'Welsh','value':'Welsh'},{'name':'Xhosa','value':'Xhosa'},{'name':'Yiddish','value':'Yiddish'},{'name':'Yoruba','value':'Yoruba'},{'name':'Zulu','value':'Zulu'}]}]},{'k':'checkStringUppercase','d':'Check Text Is Uppercased','ed':'Check if string only contains uppercase characters','g':'text','p':[{'n':'text','r':true,'t':'string','p':'AAA'}]},{'k':'getStringUppercase','d':'Get Uppercased Text','ed':'Convert all letters found in a string to uppercase','g':'text','p':[{'n':'text','r':true,'t':'string','p':'Hi, Mike!'}]},{'k':'getStringVlookup','d':'Get String VLookup','ed':'Lookup string between multiple values by fuzzy logic and regex patterns','g':'text','p':[{'n':'text','r':true,'t':'string','p':'s4mple'},{'n':'texts','r':true,'t':'string','p':'sample,samples'}]},{'k':'getVatByAddress','d':'Get VAT% By Address','ed':'Get country VAT by address','g':'finance','p':[{'n':'address','r':true,'t':'string','p':'Mallorca, 120 España'}]},{'k':'getVatByCoordinates','d':'Get VAT% By Coordinates','ed':'Get country VAT by coordinates','g':'finance','p':[{'n':'coordinates','r':true,'t':'string','p':'41.61921,2.2904413'}]},{'k':'getVatByIp','d':'Get VAT% By IP','ed':'Get VAT by IP address','g':'finance','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getVatByIsocode','d':'Get VAT% By ISO Code','ed':'Get VAT value by country ISO code','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'}]},{'k':'getVatByNumber','d':'Get Data By TIN (VIES)','ed':'Get related european TIN number in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getVatByPhone','d':'Get VAT% By Phone','ed':'Get VAT by phone number, with worldwide coverage','g':'finance','p':[{'n':'phone','r':true,'t':'string','p':'57122000111'}]},{'k':'getVatByZipcode','d':'Get VAT% By Zipcode','ed':'Get VAT by zipcode','g':'finance','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkVatExist','d':'Check TIN Exists (VIES)','ed':'Check if TIN number exists in Europe','g':'finance','p':[{'n':'isocode','r':true,'t':'string','p':'ES'},{'n':'tin','r':true,'t':'string','p':'44016116G'}]},{'k':'getWordBanned','d':'Get Banned Words','ed':'Discover English banned words in the email body or subject','g':'text','p':[{'n':'text','r':true,'t':'string','p':'I am so thrilled to inform you that our new amazing feature is live!'}]},{'k':'getWordCleanAbuse','d':'Get Text Cleaned Without Abuse Words','ed':'Clean abuse words from a string','g':'text','p':[{'n':'text','r':true,'t':'string','p':'comentario de un maldito personaje'}]},{'k':'getWordCount','d':'Get Words Count','ed':'Count total words in a text','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'}]},{'k':'checkWordCountBetw','d':'Check Word Count Between','ed':'Check if the number of words in a sentence is between two determined quantities','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count1','r':true,'t':'string','p':'1'},{'n':'count2','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountEq','d':'Check Word Count Equal','ed':'Check if the number of words in a sentence equals a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGe','d':'Check Word Count Greater Or Equal','ed':'Check if the number of words in a sentence is greater than or equal to a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountGt','d':'Check Word Count Greater','ed':'Check if the number of words in a sentence is greater than a certain amount','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'1'}]},{'k':'checkWordCountLe','d':'Check Word Count Lower Or Equal','ed':'Check if the number of words present in a sentence is less than or equal to a quantity','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'2'}]},{'k':'checkWordCountLt','d':'Check Word Count Lower','ed':'','g':'text','p':[{'n':'text','r':true,'t':'string','p':'sample text'},{'n':'count','r':true,'t':'string','p':'3'}]},{'k':'getZipcodeByIp','d':'Get Zipcode By IP','ed':'Discover the zipcode if you have an IP address','g':'geographic','p':[{'n':'ip','r':true,'t':'string','p':'95.23.100.79'}]},{'k':'getZipcodeByPrefix','d':'Get Zipcode By Prefix (ES)','ed':'Get first zipcode by prefix, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'checkZipcodeExist','d':'Check Zipcode By Prefix Exists (ES)','ed':'Discover if a zipcode number prefix exists, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'checkZipcodeFormat','d':'Check Zipcode Has Valid Format (ES)','ed':'Discover if a zipcode number has a valid format, only for Spain','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08012'}]},{'k':'getZipcodeListByPrefix','d':'Get Zipcodes By Prefix (ES)','ed':'Get multiple zipcodes by prefix, with worldwide coverage','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'080'}]},{'k':'getZipcodeNormalized','d':'Get Normalized Zipcode','ed':'Allow to normalize a zipcode, removing non allowed characters','g':'geographic','p':[{'n':'zipcode','r':true,'t':'string','p':'08i 12'}]}]}; \ No newline at end of file From be02fc87529ebac84ddd9fc6eca2490cb09c9a0c Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 25 Mar 2021 18:25:05 -0400 Subject: [PATCH 087/137] :bug: Fix issue with Dropbox App Folder type apps. (#1569) #1542 --- .../credentials/DropboxApi.credentials.ts | 16 ++++++++++++++ .../DropboxOAuth2Api.credentials.ts | 16 ++++++++++++++ .../nodes-base/nodes/Dropbox/Dropbox.node.ts | 22 ++++++++++++------- .../nodes/Dropbox/GenericFunctions.ts | 8 +++++++ 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/credentials/DropboxApi.credentials.ts b/packages/nodes-base/credentials/DropboxApi.credentials.ts index ff7ca863d2..e17de90fff 100644 --- a/packages/nodes-base/credentials/DropboxApi.credentials.ts +++ b/packages/nodes-base/credentials/DropboxApi.credentials.ts @@ -14,5 +14,21 @@ export class DropboxApi implements ICredentialType { type: 'string' as NodePropertyTypes, default: '', }, + { + displayName: 'APP Access Type', + name: 'accessType', + type: 'options' as NodePropertyTypes, + options: [ + { + name: 'App Folder', + value: 'folder', + }, + { + name: 'Full Dropbox', + value: 'full', + }, + ], + default: 'full', + }, ]; } diff --git a/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts b/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts index 81c84d92aa..c1515cd6f5 100644 --- a/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts +++ b/packages/nodes-base/credentials/DropboxOAuth2Api.credentials.ts @@ -50,5 +50,21 @@ export class DropboxOAuth2Api implements ICredentialType { type: 'hidden' as NodePropertyTypes, default: 'header', }, + { + displayName: 'APP Access Type', + name: 'accessType', + type: 'options' as NodePropertyTypes, + options: [ + { + name: 'App Folder', + value: 'folder', + }, + { + name: 'Full Dropbox', + value: 'full', + }, + ], + default: 'full', + }, ]; } diff --git a/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts b/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts index 5f4e219652..4421be2d4f 100644 --- a/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts +++ b/packages/nodes-base/nodes/Dropbox/Dropbox.node.ts @@ -13,6 +13,7 @@ import { import { dropboxApiRequest, dropboxpiRequestAllItems, + getCredentials, getRootDirectory, simplify, } from './GenericFunctions'; @@ -793,15 +794,20 @@ export class Dropbox implements INodeType { let headers: IDataObject = {}; let simple = false; - // get the root directory to set it as the default search folder - const { root_info: { root_namespace_id } } = await getRootDirectory.call(this); - headers = { - 'dropbox-api-path-root': JSON.stringify({ - '.tag': 'root', - 'root': root_namespace_id, - }), - }; + const { accessType } = getCredentials.call(this); + + if (accessType === 'full') { + // get the root directory to set it as the default for all operations + const { root_info: { root_namespace_id } } = await getRootDirectory.call(this); + + headers = { + 'dropbox-api-path-root': JSON.stringify({ + '.tag': 'root', + 'root': root_namespace_id, + }), + }; + } for (let i = 0; i < items.length; i++) { body = {}; diff --git a/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts b/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts index 66533c4c01..ca7e4829bb 100644 --- a/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Dropbox/GenericFunctions.ts @@ -114,4 +114,12 @@ export function simplify(data: IDataObject[]) { return results; } +export function getCredentials(this: IExecuteFunctions) { + const authenticationMethod = this.getNodeParameter('authentication', 0) as string; + if (authenticationMethod === 'accessToken') { + return this.getCredentials('dropboxApi') as IDataObject; + } else { + return this.getCredentials('dropboxOAuth2Api') as IDataObject; + } +} From d8883fbefe3544179307d7c93ee62e370a830587 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 25 Mar 2021 23:45:16 +0100 Subject: [PATCH 088/137] :zap: Some improvements --- .../credentials/UProcApi.credentials.ts | 2 +- .../nodes/UProc/GenericFunctions.ts | 4 +- .../nodes-base/nodes/UProc/ToolDescription.ts | 8 +- packages/nodes-base/nodes/UProc/UProc.node.ts | 233 +++++++++--------- 4 files changed, 122 insertions(+), 125 deletions(-) diff --git a/packages/nodes-base/credentials/UProcApi.credentials.ts b/packages/nodes-base/credentials/UProcApi.credentials.ts index 5428bc4edb..197e7140de 100644 --- a/packages/nodes-base/credentials/UProcApi.credentials.ts +++ b/packages/nodes-base/credentials/UProcApi.credentials.ts @@ -7,7 +7,7 @@ export class UProcApi implements ICredentialType { name = 'uprocApi'; displayName = 'uProc API'; properties = [ - { + { displayName: 'Email', name: 'email', type: 'string' as NodePropertyTypes, diff --git a/packages/nodes-base/nodes/UProc/GenericFunctions.ts b/packages/nodes-base/nodes/UProc/GenericFunctions.ts index 48629d0675..c322249ec2 100644 --- a/packages/nodes-base/nodes/UProc/GenericFunctions.ts +++ b/packages/nodes-base/nodes/UProc/GenericFunctions.ts @@ -22,13 +22,13 @@ export async function uprocApiRequest(this: IHookFunctions | IExecuteFunctions | const options: OptionsWithUri = { headers: { Authorization: `Basic ${token}`, - "User-agent": "n8n" + 'User-agent': 'n8n', }, method, qs, body, uri: uri || `https://api.uproc.io/api/v2/process`, - json: true + json: true, }; try { diff --git a/packages/nodes-base/nodes/UProc/ToolDescription.ts b/packages/nodes-base/nodes/UProc/ToolDescription.ts index 6fa7bf7d01..733a6d08fa 100644 --- a/packages/nodes-base/nodes/UProc/ToolDescription.ts +++ b/packages/nodes-base/nodes/UProc/ToolDescription.ts @@ -30,12 +30,12 @@ for (const group of (groups as IDataObject).groups as IDataObject[]) { displayOptions: { show: { group: [ - group.name + group.name, ], }, }, default: '', - options: [] + options: [], }; const options = []; @@ -45,7 +45,7 @@ for (const group of (groups as IDataObject).groups as IDataObject[]) { const option = { name: tool.d as string, value: tool.k, - description: (tool.ed as string) + ` Info` + description: (tool.ed as string) + ` Info`, }; options.push(option); } @@ -82,7 +82,7 @@ for (const tool of (tools as IDataObject).processors as IDataObject[]) { tool.g, ], tool: [ - tool.k + tool.k, ], }, }, diff --git a/packages/nodes-base/nodes/UProc/UProc.node.ts b/packages/nodes-base/nodes/UProc/UProc.node.ts index 21704b2f18..8721f9b166 100644 --- a/packages/nodes-base/nodes/UProc/UProc.node.ts +++ b/packages/nodes-base/nodes/UProc/UProc.node.ts @@ -1,145 +1,142 @@ import { - IExecuteFunctions, + IExecuteFunctions, } from 'n8n-core'; import { - IDataObject, - INodeExecutionData, - INodeType, - INodeTypeDescription, + IDataObject, + INodeExecutionData, + INodeType, + INodeTypeDescription, } from 'n8n-workflow'; import { - uprocApiRequest, + uprocApiRequest, } from './GenericFunctions'; import { - groupOptions, + groupOptions, } from './GroupDescription'; import { - toolOperations, - toolParameters, + toolOperations, + toolParameters, } from './ToolDescription'; export class UProc implements INodeType { - description: INodeTypeDescription = { - displayName: 'uProc', - name: 'uproc', - icon: 'file:uproc.png', - group: ['output'], - version: 1, - subtitle: '={{$parameter["tool"]}}', - description: 'Consume uProc API', - defaults: { - name: 'uProc', - color: '#219ef9', - }, - inputs: ['main'], - outputs: ['main'], - credentials: [ - { - name: 'uprocApi', - required: true, - }, - ], - properties: [ - ...groupOptions, - ...toolOperations, - ...toolParameters, - { - displayName: 'Additional Options', - name: 'additionalOptions', - type: 'collection', - placeholder: 'Add Option', - default: {}, - displayOptions: { - show: { - group: [ - 'audio', - 'communication', - 'company', - 'finance', - 'geographic', - 'image', - 'internet', - 'personal', - 'product', - 'security', - 'text', - ], - }, - }, - options: [ - { - displayName: 'Data Webhook', - name: 'dataWebhook', - type: 'string', - description: 'URL to send tool response when tool has resolved your request. You can create your own webhook at en Beeceptor, Integromat, Zapier or n8n', - default: '', - } - ] - } - ], - }; + description: INodeTypeDescription = { + displayName: 'uProc', + name: 'uproc', + icon: 'file:uproc.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["tool"]}}', + description: 'Consume uProc API', + defaults: { + name: 'uProc', + color: '#219ef9', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'uprocApi', + required: true, + }, + ], + properties: [ + ...groupOptions, + ...toolOperations, + ...toolParameters, + { + displayName: 'Additional Options', + name: 'additionalOptions', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + group: [ + 'audio', + 'communication', + 'company', + 'finance', + 'geographic', + 'image', + 'internet', + 'personal', + 'product', + 'security', + 'text', + ], + }, + }, + options: [ + { + displayName: 'Data Webhook', + name: 'dataWebhook', + type: 'string', + description: 'URL to send tool response when tool has resolved your request. You can create your own webhook at en Beeceptor, Integromat, Zapier or n8n', + default: '', + }, + ], + }, + ], + }; - async execute(this: IExecuteFunctions): Promise { - const items = this.getInputData(); - const returnData: IDataObject[] = []; - const length = items.length as unknown as number; - let responseData; - const group = this.getNodeParameter('group', 0) as string; - const tool = this.getNodeParameter('tool', 0) as string; - const additionalOptions = this.getNodeParameter('additionalOptions', 0) as IDataObject; + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + const length = items.length as unknown as number; + let responseData; + const group = this.getNodeParameter('group', 0) as string; + const tool = this.getNodeParameter('tool', 0) as string; + const additionalOptions = this.getNodeParameter('additionalOptions', 0) as IDataObject; + const dataWebhook = additionalOptions.dataWebhook as string; - const dataWebhook = additionalOptions.dataWebhook as string; + interface LooseObject { + [key: string]: any; // tslint:disable-line:no-any + } - interface LooseObject { - [key: string]: any; - } + const fields = toolParameters.filter((field) => { + return field && field.displayOptions && field.displayOptions.show && field.displayOptions.show.group && field.displayOptions.show.tool && + field.displayOptions.show.group.indexOf(group) !== -1 && field.displayOptions.show.tool.indexOf(tool) !== -1; + }).map((field) => { + return field.name; + }); - const fields = toolParameters.filter((field) => { - return field && field.displayOptions && field.displayOptions.show && field.displayOptions.show.group && field.displayOptions.show.tool && - field.displayOptions.show.group.indexOf(group) !== -1 && field.displayOptions.show.tool.indexOf(tool) !== -1; - }).map((field) => { - return field.name; - }); + const requestPromises = []; + for (let i = 0; i < length; i++) { + const toolKey = tool.replace(/([A-Z]+)/g, '-$1').toLowerCase(); + const body: LooseObject = { + processor: toolKey, + params: {}, + }; - const requestPromises = []; - for (let i = 0; i < length; i++) { - const toolKey = tool.replace(/([A-Z]+)/g, "-$1").toLowerCase(); - const body: LooseObject = { - processor: toolKey, - params: {} - }; + fields.forEach((field) => { + if (field && field.length) { + const data = this.getNodeParameter(field, i) as string; + body.params[field] = data + ''; + } + }); - //console.log(fields); - fields.forEach((field) => { - if (field && field.length) { - const data = this.getNodeParameter(field, i) as string; - //console.log(field, data); - body.params[field] = data + ""; - } - }); + if (dataWebhook && dataWebhook.length) { + body.callback = {}; + } - if (dataWebhook && dataWebhook.length) { - body.callback = {}; - } + if (dataWebhook && dataWebhook.length) { + body.callback.data = dataWebhook; + } - if (dataWebhook && dataWebhook.length) { - body.callback.data = dataWebhook; - } + //Change to multiple requests + responseData = await uprocApiRequest.call(this, 'POST', body); - //Change to multiple requests - responseData = await uprocApiRequest.call(this, 'POST', body); - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } - } - return [this.helpers.returnJsonArray(returnData)]; - } + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else { + returnData.push(responseData as IDataObject); + } + } + return [this.helpers.returnJsonArray(returnData)]; + } } From b60b66d0064394652fa35911a0187ce35f6a3d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Fri, 26 Mar 2021 08:48:52 +0100 Subject: [PATCH 089/137] :sparkles: Add mail-send operation to SendGrid node (#1526) * :zap: Add mail description * :zap: Add mail:send functionality * :hammer: Refactor sandbox into additional options * :hammer: Refactor MIME type as options * :zap: Implement send_at functionality * :zap: Add headers to additional options * :zap: Implement attachments * :fire: Remove logging * :zap: Improvements * :zap: Fix default operation * :hammer: Fix HTML option * :hammer: Fix subject in dynamic template email Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../nodes/SendGrid/GenericFunctions.ts | 8 +- .../nodes/SendGrid/MailDescription.ts | 381 ++++++++++++++++++ .../nodes/SendGrid/SendGrid.node.ts | 179 +++++++- 3 files changed, 550 insertions(+), 18 deletions(-) create mode 100644 packages/nodes-base/nodes/SendGrid/MailDescription.ts diff --git a/packages/nodes-base/nodes/SendGrid/GenericFunctions.ts b/packages/nodes-base/nodes/SendGrid/GenericFunctions.ts index 60612c7de8..0e4c81713e 100644 --- a/packages/nodes-base/nodes/SendGrid/GenericFunctions.ts +++ b/packages/nodes-base/nodes/SendGrid/GenericFunctions.ts @@ -13,7 +13,7 @@ import { IDataObject, } from 'n8n-workflow'; -export async function sendGridApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, endpoint: string, method: string, body: any = {}, qs: IDataObject = {}, uri?: string | undefined): Promise { // tslint:disable-line:no-any +export async function sendGridApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, endpoint: string, method: string, body: any = {}, qs: IDataObject = {}, option: IDataObject = {}): Promise { // tslint:disable-line:no-any const credentials = this.getCredentials('sendGridApi') as IDataObject; const host = 'api.sendgrid.com/v3'; @@ -25,7 +25,7 @@ export async function sendGridApiRequest(this: IHookFunctions | IExecuteFunction method, qs, body, - uri: uri || `https://${host}${endpoint}`, + uri: `https://${host}${endpoint}`, json: true, }; @@ -33,6 +33,10 @@ export async function sendGridApiRequest(this: IHookFunctions | IExecuteFunction delete options.body; } + if (Object.keys(option).length !== 0) { + Object.assign(options, option); + } + try { //@ts-ignore return await this.helpers.request!(options); diff --git a/packages/nodes-base/nodes/SendGrid/MailDescription.ts b/packages/nodes-base/nodes/SendGrid/MailDescription.ts new file mode 100644 index 0000000000..6ba317168f --- /dev/null +++ b/packages/nodes-base/nodes/SendGrid/MailDescription.ts @@ -0,0 +1,381 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const mailOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'mail', + ], + }, + }, + options: [ + { + name: 'Send', + value: 'send', + description: 'Send an email.', + }, + ], + default: 'send', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const mailFields = [ + /* -------------------------------------------------------------------------- */ + /* mail:send */ + /* -------------------------------------------------------------------------- */ + { + displayName: 'Sender Email', + name: 'fromEmail', + type: 'string', + default: '', + placeholder: 'sender@domain.com', + description: 'Email address of the sender of the email.', + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'Sender Name', + name: 'fromName', + type: 'string', + default: '', + placeholder: 'John Smith', + description: 'Name of the sender of the email.', + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'Recipient Email', + name: 'toEmail', + type: 'string', + default: '', + placeholder: 'recipient@domain.com', + description: 'Comma-separated list of recipient email addresses.', + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'Subject', + name: 'subject', + type: 'string', + default: '', + description: 'Subject of the email to send.', + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + dynamicTemplate: [ + false, + ], + }, + }, + }, + { + displayName: 'Dynamic Template', + name: 'dynamicTemplate', + type: 'boolean', + required: true, + default: false, + description: 'Whether this email will contain a dynamic template.', + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + }, + }, + }, + { + displayName: 'MIME type', + name: 'contentType', + type: 'options', + default: 'text/plain', + description: 'MIME type of the email to send.', + options: [ + { + name: 'Plain Text', + value: 'text/plain', + }, + { + name: 'HTML', + value: 'text/html', + }, + ], + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + dynamicTemplate: [ + false, + ], + }, + }, + }, + { + displayName: 'Message Body', + name: 'contentValue', + type: 'string', + default: '', + required: true, + description: 'Message body of the email to send.', + typeOptions: { + alwaysOpenEditWindow: true, + }, + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + dynamicTemplate: [ + false, + ], + }, + }, + }, + { + displayName: 'Template ID', + name: 'templateId', + type: 'options', + default: [], + typeOptions: { + loadOptionsMethod: 'getTemplateIds', + }, + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + dynamicTemplate: [ + true, + ], + }, + }, + }, + { + displayName: 'Dynamic Template Fields', + name: 'dynamicTemplateFields', + placeholder: 'Add Dynamic Template Fields', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + dynamicTemplate: [ + true, + ], + }, + }, + options: [ + { + displayName: 'Fields', + name: 'fields', + values: [ + { + displayName: 'Key', + name: 'key', + type: 'string', + default: '', + description: 'Key of the dynamic template field.', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Value for the field', + }, + ], + }, + ], + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'mail', + ], + operation: [ + 'send', + ], + }, + }, + options: [ + { + displayName: 'Attachments', + name: 'attachments', + type: 'string', + default: '', + description: 'Comma-separated list of binary properties', + }, + { + displayName: 'BCC Email', + name: 'bccEmail', + type: 'string', + default: '', + description: 'Comma-separated list of emails of the recipients
of a blind carbon copy of the email.', + }, + { + displayName: 'Categories', + name: 'categories', + type: 'string', + default: '', + description: 'Comma-separated list of categories. Each category name may not exceed 255 characters.', + }, + { + displayName: 'CC Email', + name: 'ccEmail', + type: 'string', + default: '', + description: 'Comma-separated list of emails of the recipients
of a carbon copy of the email.', + }, + { + displayName: 'Enable Sandbox', + name: 'enableSandbox', + type: 'boolean', + default: false, + description: 'Whether to use to the sandbox for testing out email-sending functionality.', + }, + { + displayName: 'IP Pool Name', + name: 'ipPoolName', + type: 'string', + default: '', + description: 'The IP Pool that you would like to send this email from.', + }, + { + displayName: 'Headers', + name: 'headers', + placeholder: 'Add Header', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + displayName: 'Details', + name: 'details', + values: [ + { + displayName: 'Key', + name: 'key', + type: 'string', + default: '', + description: 'Key to set in the header object.', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Value to set in the header object.', + }, + ], + }, + ], + }, + { + displayName: 'Send At', + name: 'sendAt', + type: 'dateTime', + default: '', + description: 'When to deliver the email. Scheduling more than 72 hours in advance is forbidden.', + }, + ], + }, +] as INodeProperties[]; + +export type SendMailBody = { + personalizations: Array<{ + to: EmailName[], + subject?: string, + cc?: EmailName[], + bcc?: EmailName[], + dynamic_template_data?: { [key: string]: string }, + send_at?: number, + }>, + ip_pool_name?: string; + from: EmailName, + template_id?: string, + content?: Array<{ + type: string, + value: string, + }>, + categories?: string[], + headers?: { [key: string]: string }, + attachments?: Array<{ + content: string, + filename: string, + type: string, + }>, + mail_settings: { + sandbox_mode: { + enable: boolean, + }, + }, +}; + +type EmailName = { + email: string, + name?: string, +}; diff --git a/packages/nodes-base/nodes/SendGrid/SendGrid.node.ts b/packages/nodes-base/nodes/SendGrid/SendGrid.node.ts index 6c4f33645d..8d8996255c 100644 --- a/packages/nodes-base/nodes/SendGrid/SendGrid.node.ts +++ b/packages/nodes-base/nodes/SendGrid/SendGrid.node.ts @@ -1,4 +1,5 @@ import { + BINARY_ENCODING, IExecuteFunctions, } from 'n8n-core'; @@ -21,11 +22,19 @@ import { contactOperations } from './ContactDescription'; +import { + mailFields, + mailOperations, + SendMailBody, +} from './MailDescription'; + import { sendGridApiRequest, sendGridApiRequestAllItems, } from './GenericFunctions'; +import * as moment from 'moment-timezone'; + export class SendGrid implements INodeType { description: INodeTypeDescription = { displayName: 'SendGrid', @@ -63,6 +72,10 @@ export class SendGrid implements INodeType { name: 'List', value: 'list', }, + { + name: 'Mail', + value: 'mail', + }, ], default: 'list', required: true, @@ -72,17 +85,19 @@ export class SendGrid implements INodeType { ...listFields, ...contactOperations, ...contactFields, + ...mailOperations, + ...mailFields, ], }; - methods ={ + methods = { loadOptions: { // Get custom fields to display to user so that they can select them easily - async getCustomFields(this: ILoadOptionsFunctions,):Promise{ + async getCustomFields(this: ILoadOptionsFunctions,): Promise { const returnData: INodePropertyOptions[] = []; const { custom_fields } = await sendGridApiRequest.call(this, '/marketing/field_definitions', 'GET', {}, {}); if (custom_fields !== undefined) { - for (const customField of custom_fields){ + for (const customField of custom_fields) { returnData.push({ name: customField.name, value: customField.id, @@ -103,6 +118,10 @@ export class SendGrid implements INodeType { } return returnData; }, + async getTemplateIds(this: ILoadOptionsFunctions): Promise { + const responseData = await sendGridApiRequest.call(this, '/templates', 'GET', {}, { generations: 'dynamic' }); + return responseData.templates.map(({ id, name }: { id: string, name: string }) => ({ name, value: id })); + }, }, }; @@ -111,6 +130,7 @@ export class SendGrid implements INodeType { const length = (items.length as unknown) as number; const qs: IDataObject = {}; let responseData; + const timezone = this.getTimezone(); const returnData: IDataObject[] = []; const resource = this.getNodeParameter('resource', 0) as string; const operation = this.getNodeParameter('operation', 0) as string; @@ -150,7 +170,7 @@ export class SendGrid implements INodeType { const email = this.getNodeParameter('email', i) as string; endpoint = '/marketing/contacts/search'; method = 'POST'; - Object.assign(body, { query: `email LIKE '${email}' `}); + Object.assign(body, { query: `email LIKE '${email}' ` }); } responseData = await sendGridApiRequest.call(this, endpoint, method, body, qs); responseData = responseData.result || responseData; @@ -163,7 +183,7 @@ export class SendGrid implements INodeType { if (operation === 'upsert') { const contacts = []; for (let i = 0; i < length; i++) { - const email = this.getNodeParameter('email',i) as string; + const email = this.getNodeParameter('email', i) as string; const additionalFields = this.getNodeParameter( 'additionalFields', i, @@ -175,7 +195,7 @@ export class SendGrid implements INodeType { const addressValues = (additionalFields.addressUi as IDataObject).addressValues as IDataObject; const addressLine1 = addressValues.address1 as string; const addressLine2 = addressValues.address2 as string; - if (addressLine2){ + if (addressLine2) { Object.assign(contact, { address_line_2: addressLine2 }); } Object.assign(contact, { address_line_1: addressLine1 }); @@ -194,7 +214,7 @@ export class SendGrid implements INodeType { } if (additionalFields.lastName) { const lastName = additionalFields.lastName as string; - Object.assign(contact, { last_name:lastName}); + Object.assign(contact, { last_name: lastName }); } if (additionalFields.postalCode) { const postalCode = additionalFields.postalCode as string; @@ -231,17 +251,17 @@ export class SendGrid implements INodeType { if (operation === 'delete') { for (let i = 0; i < length; i++) { const deleteAll = this.getNodeParameter('deleteAll', i) as boolean; - if(deleteAll === true) { + if (deleteAll === true) { qs.delete_all_contacts = 'true'; } - qs.ids = (this.getNodeParameter('ids',i) as string).replace(/\s/g, ''); + qs.ids = (this.getNodeParameter('ids', i) as string).replace(/\s/g, ''); responseData = await sendGridApiRequest.call(this, `/marketing/contacts`, 'DELETE', {}, qs); returnData.push(responseData); } } } if (resource === 'list') { - if (operation === 'getAll'){ + if (operation === 'getAll') { for (let i = 0; i < length; i++) { const returnAll = this.getNodeParameter('returnAll', i) as boolean; responseData = await sendGridApiRequestAllItems.call(this, `/marketing/lists`, 'GET', 'result', {}, qs); @@ -254,7 +274,7 @@ export class SendGrid implements INodeType { } if (operation === 'get') { for (let i = 0; i < length; i++) { - const listId = this.getNodeParameter('listId',i) as string; + const listId = this.getNodeParameter('listId', i) as string; qs.contact_sample = this.getNodeParameter('contactSample', i) as boolean; responseData = await sendGridApiRequest.call(this, `/marketing/lists/${listId}`, 'GET', {}, qs); returnData.push(responseData); @@ -262,29 +282,156 @@ export class SendGrid implements INodeType { } if (operation === 'create') { for (let i = 0; i < length; i++) { - const name = this.getNodeParameter('name',i) as string; + const name = this.getNodeParameter('name', i) as string; responseData = await sendGridApiRequest.call(this, '/marketing/lists', 'POST', { name }, qs); returnData.push(responseData); } } if (operation === 'delete') { for (let i = 0; i < length; i++) { - const listId = this.getNodeParameter('listId',i) as string; + const listId = this.getNodeParameter('listId', i) as string; qs.delete_contacts = this.getNodeParameter('deleteContacts', i) as boolean; responseData = await sendGridApiRequest.call(this, `/marketing/lists/${listId}`, 'DELETE', {}, qs); responseData = { success: true }; returnData.push(responseData); } } - if (operation=== 'update'){ + if (operation === 'update') { for (let i = 0; i < length; i++) { - const name = this.getNodeParameter('name',i) as string; - const listId = this.getNodeParameter('listId',i) as string; + const name = this.getNodeParameter('name', i) as string; + const listId = this.getNodeParameter('listId', i) as string; responseData = await sendGridApiRequest.call(this, `/marketing/lists/${listId}`, 'PATCH', { name }, qs); returnData.push(responseData); } } } + if (resource === 'mail') { + if (operation === 'send') { + for (let i = 0; i < length; i++) { + + const toEmail = this.getNodeParameter('toEmail', i) as string; + + const parsedToEmail = toEmail.includes(',') + ? toEmail.split(',').map((i) => ({ email: i.trim() })) + : [{ email: toEmail.trim() }]; + + const { + bccEmail, + ccEmail, + enableSandbox, + sendAt, + headers, + attachments, + categories, + ipPoolName, + } = this.getNodeParameter('additionalFields', i) as { + bccEmail: string; + ccEmail: string; + enableSandbox: boolean, + sendAt: string; + headers: { details: Array<{ key: string; value: string }> }; + attachments: string; + categories: string; + ipPoolName: string; + }; + + const body: SendMailBody = { + personalizations: [{ + to: parsedToEmail, + }], + from: { + email: (this.getNodeParameter('fromEmail', i) as string).trim(), + name: this.getNodeParameter('fromName', i) as string, + }, + mail_settings: { + sandbox_mode: { + enable: enableSandbox || false, + }, + }, + }; + + const dynamicTemplateEnabled = this.getNodeParameter('dynamicTemplate', i); + + // dynamic template + if (dynamicTemplateEnabled) { + body.template_id = this.getNodeParameter('templateId', i) as string; + + const { fields } = this.getNodeParameter('dynamicTemplateFields', i) as { + fields: Array<{ [key: string]: string }> + }; + + if (fields) { + fields.forEach(field => { + body.personalizations[0].dynamic_template_data = { + [field.key]: field.value, + }; + }); + } + + // message body + } else { + body.personalizations[0].subject = this.getNodeParameter('subject', i) as string; + body.content = [{ + type: this.getNodeParameter('contentType', i) as string, + value: this.getNodeParameter('contentValue', i) as string, + }]; + } + + if (attachments) { + const attachmentsToSend = []; + const binaryProperties = attachments.split(',').map((p) => p.trim()); + + for (const property of binaryProperties) { + if (!items[i].binary?.hasOwnProperty(property)) { + throw new Error(`The binary property ${property} does not exist`); + } + + const binaryProperty = items[i].binary![property]; + + attachmentsToSend.push({ + content: binaryProperty.data, + filename: binaryProperty.fileName || 'unknown', + type: binaryProperty.mimeType, + }); + } + + if (attachmentsToSend.length) { + body.attachments = attachmentsToSend; + } + } + + if (bccEmail) { + body.personalizations[0].bcc = bccEmail.split(',').map(i => ({ email: i.trim() })); + } + + if (ccEmail) { + body.personalizations[0].cc = ccEmail.split(',').map(i => ({ email: i.trim() })); + } + + if (headers?.details.length) { + const parsedHeaders: { [key: string]: string } = {}; + headers.details.forEach(obj => parsedHeaders[obj['key']] = obj['value']); + body.headers = parsedHeaders; + } + + if (categories) { + body.categories = categories.split(',') as string[]; + } + + if (ipPoolName) { + body.ip_pool_name = ipPoolName as string; + } + + if (sendAt) { + body.personalizations[0].send_at = moment.tz(sendAt, timezone).unix(); + } + + const data = await sendGridApiRequest.call(this, '/mail/send', 'POST', body, qs, { resolveWithFullResponse: true }); + + returnData.push({ messageId: data!.headers['x-message-id'] }); + } + } + } return [this.helpers.returnJsonArray(returnData)]; } } From 4276150ac19deec96d4538049d40c7af8ffb0694 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 09:06:26 +0100 Subject: [PATCH 090/137] :zap: Fix indentation in all package.json files --- packages/cli/package.json | 268 +++++++++++++++---------------- packages/core/package.json | 140 ++++++++-------- packages/editor-ui/.editorconfig | 7 + packages/node-dev/package.json | 136 ++++++++-------- packages/nodes-base/package.json | 2 +- packages/workflow/package.json | 110 ++++++------- 6 files changed, 335 insertions(+), 328 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 838fb44a3b..07bf405ffd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,138 +1,138 @@ { - "name": "n8n", - "version": "0.112.0", - "description": "n8n Workflow Automation Tool", - "license": "SEE LICENSE IN LICENSE.md", - "homepage": "https://n8n.io", - "author": { - "name": "Jan Oberhauser", - "email": "jan@n8n.io" + "name": "n8n", + "version": "0.112.0", + "description": "n8n Workflow Automation Tool", + "license": "SEE LICENSE IN LICENSE.md", + "homepage": "https://n8n.io", + "author": { + "name": "Jan Oberhauser", + "email": "jan@n8n.io" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/n8n-io/n8n.git" + }, + "main": "dist/index", + "types": "dist/src/index.d.ts", + "oclif": { + "commands": "./dist/commands", + "bin": "n8n" + }, + "scripts": { + "build": "tsc", + "dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon\"", + "postpack": "rm -f oclif.manifest.json", + "prepack": "echo \"Building project...\" && rm -rf dist && tsc -b && oclif-dev manifest", + "start": "run-script-os", + "start:default": "cd bin && ./n8n", + "start:windows": "cd bin && n8n", + "test": "jest", + "tslint": "tslint -p tsconfig.json -c tslint.json", + "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", + "watch": "tsc --watch", + "typeorm": "ts-node ./node_modules/typeorm/cli.js" + }, + "bin": { + "n8n": "./bin/n8n" + }, + "keywords": [ + "automate", + "automation", + "IaaS", + "iPaaS", + "n8n", + "workflow" + ], + "engines": { + "node": ">=12.0.0" + }, + "files": [ + "bin", + "templates", + "dist", + "oclif.manifest.json" + ], + "devDependencies": { + "@oclif/dev-cli": "^1.22.2", + "@types/basic-auth": "^1.1.2", + "@types/bcryptjs": "^2.4.1", + "@types/bull": "^3.3.10", + "@types/compression": "1.0.1", + "@types/connect-history-api-fallback": "^1.3.1", + "@types/convict": "^4.2.1", + "@types/dotenv": "^8.2.0", + "@types/express": "^4.17.6", + "@types/jest": "^26.0.13", + "@types/localtunnel": "^1.9.0", + "@types/lodash.get": "^4.4.6", + "@types/node": "14.0.27", + "@types/open": "^6.1.0", + "@types/parseurl": "^1.3.1", + "@types/request-promise-native": "~1.0.15", + "concurrently": "^5.1.0", + "jest": "^26.4.2", + "nodemon": "^2.0.2", + "p-cancelable": "^2.0.0", + "run-script-os": "^1.0.7", + "ts-jest": "^26.3.0", + "ts-node": "^8.9.1", + "tslint": "^6.1.2", + "typescript": "~3.9.7" + }, + "dependencies": { + "@oclif/command": "^1.5.18", + "@oclif/errors": "^1.2.2", + "@types/jsonwebtoken": "^8.3.4", + "basic-auth": "^2.0.1", + "bcryptjs": "^2.4.3", + "body-parser": "^1.18.3", + "body-parser-xml": "^1.1.0", + "bull": "^3.19.0", + "client-oauth2": "^4.2.5", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "convict": "^6.0.1", + "csrf": "^3.1.0", + "dotenv": "^8.0.0", + "express": "^4.16.4", + "flatted": "^2.0.0", + "glob-promise": "^3.4.0", + "google-timezones-json": "^1.0.2", + "inquirer": "^7.0.1", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "~1.12.1", + "localtunnel": "^2.0.0", + "lodash.get": "^4.4.2", + "mysql2": "~2.1.0", + "n8n-core": "~0.65.0", + "n8n-editor-ui": "~0.82.0", + "n8n-nodes-base": "~0.109.0", + "n8n-workflow": "~0.54.0", + "oauth-1.0a": "^2.2.6", + "open": "^7.0.0", + "pg": "^8.3.0", + "prom-client": "^13.1.0", + "request-promise-native": "^1.0.7", + "sqlite3": "^5.0.1", + "sse-channel": "^3.1.1", + "tslib": "1.11.2", + "typeorm": "^0.2.30" + }, + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest" }, - "repository": { - "type": "git", - "url": "git+https://github.com/n8n-io/n8n.git" - }, - "main": "dist/index", - "types": "dist/src/index.d.ts", - "oclif": { - "commands": "./dist/commands", - "bin": "n8n" - }, - "scripts": { - "build": "tsc", - "dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch\" \"nodemon\"", - "postpack": "rm -f oclif.manifest.json", - "prepack": "echo \"Building project...\" && rm -rf dist && tsc -b && oclif-dev manifest", - "start": "run-script-os", - "start:default": "cd bin && ./n8n", - "start:windows": "cd bin && n8n", - "test": "jest", - "tslint": "tslint -p tsconfig.json -c tslint.json", - "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", - "watch": "tsc --watch", - "typeorm": "ts-node ./node_modules/typeorm/cli.js" - }, - "bin": { - "n8n": "./bin/n8n" - }, - "keywords": [ - "automate", - "automation", - "IaaS", - "iPaaS", - "n8n", - "workflow" + "testURL": "http://localhost/", + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", + "testPathIgnorePatterns": [ + "/dist/", + "/node_modules/" ], - "engines": { - "node": ">=12.0.0" - }, - "files": [ - "bin", - "templates", - "dist", - "oclif.manifest.json" - ], - "devDependencies": { - "@oclif/dev-cli": "^1.22.2", - "@types/basic-auth": "^1.1.2", - "@types/bcryptjs": "^2.4.1", - "@types/bull": "^3.3.10", - "@types/compression": "1.0.1", - "@types/connect-history-api-fallback": "^1.3.1", - "@types/convict": "^4.2.1", - "@types/dotenv": "^8.2.0", - "@types/express": "^4.17.6", - "@types/jest": "^26.0.13", - "@types/localtunnel": "^1.9.0", - "@types/lodash.get": "^4.4.6", - "@types/node": "14.0.27", - "@types/open": "^6.1.0", - "@types/parseurl": "^1.3.1", - "@types/request-promise-native": "~1.0.15", - "concurrently": "^5.1.0", - "jest": "^26.4.2", - "nodemon": "^2.0.2", - "p-cancelable": "^2.0.0", - "run-script-os": "^1.0.7", - "ts-jest": "^26.3.0", - "ts-node": "^8.9.1", - "tslint": "^6.1.2", - "typescript": "~3.9.7" - }, - "dependencies": { - "@oclif/command": "^1.5.18", - "@oclif/errors": "^1.2.2", - "@types/jsonwebtoken": "^8.3.4", - "basic-auth": "^2.0.1", - "bcryptjs": "^2.4.3", - "body-parser": "^1.18.3", - "body-parser-xml": "^1.1.0", - "bull": "^3.19.0", - "client-oauth2": "^4.2.5", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "convict": "^6.0.1", - "csrf": "^3.1.0", - "dotenv": "^8.0.0", - "express": "^4.16.4", - "flatted": "^2.0.0", - "glob-promise": "^3.4.0", - "google-timezones-json": "^1.0.2", - "inquirer": "^7.0.1", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "~1.12.1", - "localtunnel": "^2.0.0", - "lodash.get": "^4.4.2", - "mysql2": "~2.1.0", - "n8n-core": "~0.65.0", - "n8n-editor-ui": "~0.82.0", - "n8n-nodes-base": "~0.109.0", - "n8n-workflow": "~0.54.0", - "oauth-1.0a": "^2.2.6", - "open": "^7.0.0", - "pg": "^8.3.0", - "prom-client": "^13.1.0", - "request-promise-native": "^1.0.7", - "sqlite3": "^5.0.1", - "sse-channel": "^3.1.1", - "tslib": "1.11.2", - "typeorm": "^0.2.30" - }, - "jest": { - "transform": { - "^.+\\.tsx?$": "ts-jest" - }, - "testURL": "http://localhost/", - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - "testPathIgnorePatterns": [ - "/dist/", - "/node_modules/" - ], - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "json" - ] - } + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json" + ] + } } diff --git a/packages/core/package.json b/packages/core/package.json index c7c2cfa639..6db61f6f67 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,74 +1,74 @@ { - "name": "n8n-core", - "version": "0.65.0", - "description": "Core functionality of n8n", - "license": "SEE LICENSE IN LICENSE.md", - "homepage": "https://n8n.io", - "author": { - "name": "Jan Oberhauser", - "email": "jan@n8n.io" + "name": "n8n-core", + "version": "0.65.0", + "description": "Core functionality of n8n", + "license": "SEE LICENSE IN LICENSE.md", + "homepage": "https://n8n.io", + "author": { + "name": "Jan Oberhauser", + "email": "jan@n8n.io" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/n8n-io/n8n.git" + }, + "main": "dist/src/index", + "types": "dist/src/index.d.ts", + "scripts": { + "build": "tsc", + "dev": "npm run watch", + "tslint": "tslint -p tsconfig.json -c tslint.json", + "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", + "watch": "tsc --watch", + "test": "jest" + }, + "files": [ + "dist" + ], + "devDependencies": { + "@types/cron": "^1.7.1", + "@types/crypto-js": "^4.0.1", + "@types/express": "^4.17.6", + "@types/jest": "^26.0.13", + "@types/lodash.get": "^4.4.6", + "@types/mime-types": "^2.1.0", + "@types/node": "14.0.27", + "@types/request-promise-native": "~1.0.15", + "jest": "^26.4.2", + "source-map-support": "^0.5.9", + "ts-jest": "^26.3.0", + "tslint": "^6.1.2", + "typescript": "~3.9.7" + }, + "dependencies": { + "client-oauth2": "^4.2.5", + "cron": "^1.7.2", + "crypto-js": "4.0.0", + "file-type": "^14.6.2", + "lodash.get": "^4.4.2", + "mime-types": "^2.1.27", + "n8n-workflow": "~0.54.0", + "oauth-1.0a": "^2.2.6", + "p-cancelable": "^2.0.0", + "request": "^2.88.2", + "request-promise-native": "^1.0.7" + }, + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest" }, - "repository": { - "type": "git", - "url": "git+https://github.com/n8n-io/n8n.git" - }, - "main": "dist/src/index", - "types": "dist/src/index.d.ts", - "scripts": { - "build": "tsc", - "dev": "npm run watch", - "tslint": "tslint -p tsconfig.json -c tslint.json", - "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", - "watch": "tsc --watch", - "test": "jest" - }, - "files": [ - "dist" + "testURL": "http://localhost/", + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", + "testPathIgnorePatterns": [ + "/dist/", + "/node_modules/" ], - "devDependencies": { - "@types/cron": "^1.7.1", - "@types/crypto-js": "^4.0.1", - "@types/express": "^4.17.6", - "@types/jest": "^26.0.13", - "@types/lodash.get": "^4.4.6", - "@types/mime-types": "^2.1.0", - "@types/node": "14.0.27", - "@types/request-promise-native": "~1.0.15", - "jest": "^26.4.2", - "source-map-support": "^0.5.9", - "ts-jest": "^26.3.0", - "tslint": "^6.1.2", - "typescript": "~3.9.7" - }, - "dependencies": { - "client-oauth2": "^4.2.5", - "cron": "^1.7.2", - "crypto-js": "4.0.0", - "file-type": "^14.6.2", - "lodash.get": "^4.4.2", - "mime-types": "^2.1.27", - "n8n-workflow": "~0.54.0", - "oauth-1.0a": "^2.2.6", - "p-cancelable": "^2.0.0", - "request": "^2.88.2", - "request-promise-native": "^1.0.7" - }, - "jest": { - "transform": { - "^.+\\.tsx?$": "ts-jest" - }, - "testURL": "http://localhost/", - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - "testPathIgnorePatterns": [ - "/dist/", - "/node_modules/" - ], - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "json", - "node" - ] - } + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json", + "node" + ] + } } diff --git a/packages/editor-ui/.editorconfig b/packages/editor-ui/.editorconfig index bec7553240..9e24325d41 100644 --- a/packages/editor-ui/.editorconfig +++ b/packages/editor-ui/.editorconfig @@ -6,3 +6,10 @@ indent_style = tab end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true + +[package.json] +indent_style = space +indent_size = 2 + +[*.ts] +quote_type = single diff --git a/packages/node-dev/package.json b/packages/node-dev/package.json index 9fa433df30..6ba68331a2 100644 --- a/packages/node-dev/package.json +++ b/packages/node-dev/package.json @@ -1,70 +1,70 @@ { - "name": "n8n-node-dev", - "version": "0.11.0", - "description": "CLI to simplify n8n credentials/node development", - "license": "SEE LICENSE IN LICENSE.md", - "homepage": "https://n8n.io", - "author": { - "name": "Jan Oberhauser", - "email": "jan@n8n.io" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/n8n-io/n8n.git" - }, - "main": "dist/src/index", - "types": "dist/src/index.d.ts", - "oclif": { - "commands": "./dist/commands", - "bin": "n8n-node-dev" - }, - "scripts": { - "dev": "npm run watch", - "build": "tsc", - "postpack": "rm -f oclif.manifest.json", - "prepack": "echo \"Building project...\" && rm -rf dist && tsc -b && oclif-dev manifest", - "tslint": "tslint -p tsconfig.json -c tslint.json", - "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", - "watch": "tsc --watch" - }, - "bin": { - "n8n-node-dev": "./bin/n8n-node-dev" - }, - "keywords": [ - "development", - "node", - "helper", - "n8n" - ], - "files": [ - "bin", - "dist", - "templates", - "oclif.manifest.json", - "src/tsconfig-build.json" - ], - "devDependencies": { - "@oclif/dev-cli": "^1.22.2", - "@types/copyfiles": "^2.1.1", - "@types/inquirer": "^6.5.0", - "@types/tmp": "^0.1.0", - "@types/vorpal": "^1.11.0", - "tslint": "^6.1.2" - }, - "dependencies": { - "@oclif/command": "^1.5.18", - "@oclif/errors": "^1.2.2", - "@types/express": "^4.17.6", - "@types/node": "14.0.27", - "change-case": "^4.1.1", - "copyfiles": "^2.1.1", - "inquirer": "^7.0.1", - "n8n-core": "^0.48.0", - "n8n-workflow": "^0.42.0", - "oauth-1.0a": "^2.2.6", - "replace-in-file": "^6.0.0", - "request": "^2.88.2", - "tmp-promise": "^2.0.2", - "typescript": "~3.9.7" - } + "name": "n8n-node-dev", + "version": "0.11.0", + "description": "CLI to simplify n8n credentials/node development", + "license": "SEE LICENSE IN LICENSE.md", + "homepage": "https://n8n.io", + "author": { + "name": "Jan Oberhauser", + "email": "jan@n8n.io" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/n8n-io/n8n.git" + }, + "main": "dist/src/index", + "types": "dist/src/index.d.ts", + "oclif": { + "commands": "./dist/commands", + "bin": "n8n-node-dev" + }, + "scripts": { + "dev": "npm run watch", + "build": "tsc", + "postpack": "rm -f oclif.manifest.json", + "prepack": "echo \"Building project...\" && rm -rf dist && tsc -b && oclif-dev manifest", + "tslint": "tslint -p tsconfig.json -c tslint.json", + "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", + "watch": "tsc --watch" + }, + "bin": { + "n8n-node-dev": "./bin/n8n-node-dev" + }, + "keywords": [ + "development", + "node", + "helper", + "n8n" + ], + "files": [ + "bin", + "dist", + "templates", + "oclif.manifest.json", + "src/tsconfig-build.json" + ], + "devDependencies": { + "@oclif/dev-cli": "^1.22.2", + "@types/copyfiles": "^2.1.1", + "@types/inquirer": "^6.5.0", + "@types/tmp": "^0.1.0", + "@types/vorpal": "^1.11.0", + "tslint": "^6.1.2" + }, + "dependencies": { + "@oclif/command": "^1.5.18", + "@oclif/errors": "^1.2.2", + "@types/express": "^4.17.6", + "@types/node": "14.0.27", + "change-case": "^4.1.1", + "copyfiles": "^2.1.1", + "inquirer": "^7.0.1", + "n8n-core": "^0.48.0", + "n8n-workflow": "^0.42.0", + "oauth-1.0a": "^2.2.6", + "replace-in-file": "^6.0.0", + "request": "^2.88.2", + "tmp-promise": "^2.0.2", + "typescript": "~3.9.7" + } } diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 2d97909a8c..cae916ebf8 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -640,4 +640,4 @@ "json" ] } -} \ No newline at end of file +} diff --git a/packages/workflow/package.json b/packages/workflow/package.json index b867b3f6b1..444630472d 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -1,59 +1,59 @@ { - "name": "n8n-workflow", - "version": "0.54.0", - "description": "Workflow base code of n8n", - "license": "SEE LICENSE IN LICENSE.md", - "homepage": "https://n8n.io", - "author": { - "name": "Jan Oberhauser", - "email": "jan@n8n.io" + "name": "n8n-workflow", + "version": "0.54.0", + "description": "Workflow base code of n8n", + "license": "SEE LICENSE IN LICENSE.md", + "homepage": "https://n8n.io", + "author": { + "name": "Jan Oberhauser", + "email": "jan@n8n.io" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/n8n-io/n8n.git" + }, + "main": "dist/src/index", + "types": "dist/src/index.d.ts", + "scripts": { + "dev": "npm run watch", + "build": "tsc", + "tslint": "tslint -p tsconfig.json -c tslint.json", + "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", + "watch": "tsc --watch", + "test": "jest" + }, + "files": [ + "dist" + ], + "devDependencies": { + "@types/express": "^4.17.6", + "@types/jest": "^26.0.13", + "@types/lodash.get": "^4.4.6", + "@types/node": "14.0.27", + "jest": "^26.4.2", + "ts-jest": "^26.3.0", + "tslint": "^6.1.2", + "typescript": "~3.9.7" + }, + "dependencies": { + "lodash.get": "^4.4.2", + "riot-tmpl": "^3.0.8" + }, + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest" }, - "repository": { - "type": "git", - "url": "git+https://github.com/n8n-io/n8n.git" - }, - "main": "dist/src/index", - "types": "dist/src/index.d.ts", - "scripts": { - "dev": "npm run watch", - "build": "tsc", - "tslint": "tslint -p tsconfig.json -c tslint.json", - "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json", - "watch": "tsc --watch", - "test": "jest" - }, - "files": [ - "dist" + "testURL": "http://localhost/", + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", + "testPathIgnorePatterns": [ + "/dist/", + "/node_modules/" ], - "devDependencies": { - "@types/express": "^4.17.6", - "@types/jest": "^26.0.13", - "@types/lodash.get": "^4.4.6", - "@types/node": "14.0.27", - "jest": "^26.4.2", - "ts-jest": "^26.3.0", - "tslint": "^6.1.2", - "typescript": "~3.9.7" - }, - "dependencies": { - "lodash.get": "^4.4.2", - "riot-tmpl": "^3.0.8" - }, - "jest": { - "transform": { - "^.+\\.tsx?$": "ts-jest" - }, - "testURL": "http://localhost/", - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - "testPathIgnorePatterns": [ - "/dist/", - "/node_modules/" - ], - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "json" - ] - } + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json" + ] + } } From 000226acfeb465b01a8c6133267580a21244557f Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:10:33 +0000 Subject: [PATCH 091/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-workflow@?= =?UTF-8?q?0.55.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/workflow/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/workflow/package.json b/packages/workflow/package.json index 444630472d..170f4c640e 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -1,6 +1,6 @@ { "name": "n8n-workflow", - "version": "0.54.0", + "version": "0.55.0", "description": "Workflow base code of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 571f815bf625e53004a054a2563f306bdfa15040 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:10:44 +0000 Subject: [PATCH 092/137] :arrow_up: Set n8n-workflow@0.55.0 on n8n-core --- packages/core/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 6db61f6f67..7bc114675e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -47,7 +47,7 @@ "file-type": "^14.6.2", "lodash.get": "^4.4.2", "mime-types": "^2.1.27", - "n8n-workflow": "~0.54.0", + "n8n-workflow": "~0.55.0", "oauth-1.0a": "^2.2.6", "p-cancelable": "^2.0.0", "request": "^2.88.2", @@ -70,5 +70,6 @@ "json", "node" ] - } + }, + "newDependencies": "n8n-workflow@0.55.0" } From a301c0d68b15dd371be24991dc1b0e9bb391aad5 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:10:44 +0000 Subject: [PATCH 093/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-core@0.66?= =?UTF-8?q?.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 7bc114675e..73f31c4b38 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "n8n-core", - "version": "0.65.0", + "version": "0.66.0", "description": "Core functionality of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 317e88363e477bcb23885ee08c98847cd1fda4d2 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:10:54 +0000 Subject: [PATCH 094/137] :arrow_up: Set n8n-core@0.66.0 and n8n-workflow@0.55.0 on n8n-nodes-base --- packages/nodes-base/package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index cae916ebf8..34cf7b91fe 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -568,7 +568,7 @@ "@types/xml2js": "^0.4.3", "gulp": "^4.0.0", "jest": "^26.4.2", - "n8n-workflow": "~0.54.0", + "n8n-workflow": "~0.55.0", "ts-jest": "^26.3.0", "tslint": "^6.1.2", "typescript": "~3.9.7" @@ -605,7 +605,7 @@ "mqtt": "4.2.1", "mssql": "^6.2.0", "mysql2": "~2.1.0", - "n8n-core": "~0.65.0", + "n8n-core": "~0.66.0", "nodemailer": "^6.4.6", "pdf-parse": "^1.1.1", "pg": "^8.3.0", @@ -639,5 +639,6 @@ "js", "json" ] - } + }, + "newDependencies": "n8n-workflow@0.55.0,n8n-core@0.66.0" } From 172104ab35bcffe4cf04203f7771535114bd9ad7 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:10:54 +0000 Subject: [PATCH 095/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-nodes-bas?= =?UTF-8?q?e@0.110.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 34cf7b91fe..327e9d095f 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "0.109.0", + "version": "0.110.0", "description": "Base nodes of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From bd378fa2bbccea33ae3ad6a0fdd6cb72104269d2 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:11:46 +0000 Subject: [PATCH 096/137] :arrow_up: Set n8n-workflow@0.55.0 on n8n-editor-ui --- packages/editor-ui/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 6bb68b5b68..4eb226fb65 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -65,7 +65,7 @@ "lodash.debounce": "^4.0.8", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", - "n8n-workflow": "~0.54.0", + "n8n-workflow": "~0.55.0", "node-sass": "^4.12.0", "normalize-wheel": "^1.0.1", "prismjs": "^1.17.1", @@ -86,5 +86,6 @@ "vue-typed-mixins": "^0.2.0", "vue2-touch-events": "^2.3.2", "vuex": "^3.1.1" - } + }, + "newDependencies": "n8n-workflow@0.55.0" } From 5b4a85d8e8aea0c45b9921845986a0bf714ebef3 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:11:46 +0000 Subject: [PATCH 097/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-editor-ui?= =?UTF-8?q?@0.83.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 4eb226fb65..22268e04d6 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "0.82.0", + "version": "0.83.0", "description": "Workflow Editor UI for n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 06c34e283d110cfb109051e0da097fea368778a6 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:12:50 +0000 Subject: [PATCH 098/137] :arrow_up: Set n8n-core@0.66.0, n8n-editor-ui@0.83.0, n8n-nodes-base@0.110.0 and n8n-workflow@0.55.0 on n8n --- packages/cli/package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 07bf405ffd..961e1ec11a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -104,10 +104,10 @@ "localtunnel": "^2.0.0", "lodash.get": "^4.4.2", "mysql2": "~2.1.0", - "n8n-core": "~0.65.0", - "n8n-editor-ui": "~0.82.0", - "n8n-nodes-base": "~0.109.0", - "n8n-workflow": "~0.54.0", + "n8n-core": "~0.66.0", + "n8n-editor-ui": "~0.83.0", + "n8n-nodes-base": "~0.110.0", + "n8n-workflow": "~0.55.0", "oauth-1.0a": "^2.2.6", "open": "^7.0.0", "pg": "^8.3.0", @@ -134,5 +134,6 @@ "js", "json" ] - } + }, + "newDependencies": "n8n-workflow@0.55.0,n8n-core@0.66.0,n8n-nodes-base@0.110.0,n8n-editor-ui@0.83.0" } From 91fbd01eae79bf6d502f7df6e15349fd9ed5063e Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 08:12:50 +0000 Subject: [PATCH 099/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n@0.113.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 961e1ec11a..ab9daf04ad 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "0.112.0", + "version": "0.113.0", "description": "n8n Workflow Automation Tool", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From f8a829b2ddf9067797609d477f1fce90178c8efe Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 26 Mar 2021 09:21:27 +0100 Subject: [PATCH 100/137] :zap: Clean up package.json files --- packages/cli/package.json | 3 +-- packages/core/package.json | 3 +-- packages/editor-ui/package.json | 3 +-- packages/nodes-base/package.json | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index ab9daf04ad..7c78b903ea 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -134,6 +134,5 @@ "js", "json" ] - }, - "newDependencies": "n8n-workflow@0.55.0,n8n-core@0.66.0,n8n-nodes-base@0.110.0,n8n-editor-ui@0.83.0" + } } diff --git a/packages/core/package.json b/packages/core/package.json index 73f31c4b38..f6414a7281 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -70,6 +70,5 @@ "json", "node" ] - }, - "newDependencies": "n8n-workflow@0.55.0" + } } diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 22268e04d6..e383f9d4fa 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -86,6 +86,5 @@ "vue-typed-mixins": "^0.2.0", "vue2-touch-events": "^2.3.2", "vuex": "^3.1.1" - }, - "newDependencies": "n8n-workflow@0.55.0" + } } diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 327e9d095f..ffeea6b355 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -639,6 +639,5 @@ "js", "json" ] - }, - "newDependencies": "n8n-workflow@0.55.0,n8n-core@0.66.0" + } } From fac0876f95d4891b90d2d925b14964a85875d542 Mon Sep 17 00:00:00 2001 From: Tanay Pant <7481165+tanay1337@users.noreply.github.com> Date: Fri, 26 Mar 2021 09:36:39 +0100 Subject: [PATCH 101/137] Add breaking change for 0.113.0 --- packages/cli/BREAKING-CHANGES.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/cli/BREAKING-CHANGES.md b/packages/cli/BREAKING-CHANGES.md index 4eca7f0cc0..aeb4f7e275 100644 --- a/packages/cli/BREAKING-CHANGES.md +++ b/packages/cli/BREAKING-CHANGES.md @@ -2,6 +2,19 @@ This list shows all the versions which include breaking changes and how to upgrade. +## 0.113.0 + +### What changed? +In the Dropbox node, both credential types (Access Token & OAuth2) have a new parameter called "APP Access Type". + +### When is action necessary? + +If you are using a Dropbox APP with permission type, "App Folder". + +### How to upgrade: + +Open your Dropbox node's credentials and set the "APP Access Type" parameter to "App Folder". + ## 0.111.0 ### What changed? From 2753566e0a5a1093e883ee14adf6632f618761f3 Mon Sep 17 00:00:00 2001 From: mjysci Date: Fri, 26 Mar 2021 19:16:53 +0800 Subject: [PATCH 102/137] :bug: Fix rpi docker image permission issue (#1587) --- docker/images/n8n-rpi/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/images/n8n-rpi/Dockerfile b/docker/images/n8n-rpi/Dockerfile index 674fff1d39..329b7e7dfe 100644 --- a/docker/images/n8n-rpi/Dockerfile +++ b/docker/images/n8n-rpi/Dockerfile @@ -15,5 +15,7 @@ ENV NODE_ENV production WORKDIR /data +USER root + CMD chown -R node:node /home/node/.n8n \ && gosu node n8n From 33c70153c8ab1a37b4c3e3cd903c40a956f54ce8 Mon Sep 17 00:00:00 2001 From: Allan Daemon Date: Fri, 26 Mar 2021 15:02:08 -0300 Subject: [PATCH 103/137] :bug: Close Redis connection (#1586) Do like in the info command, and after the execution of the other commands, close the connection, otherwise it will kept open and cause a connection and memory leak. Also, as to close in case of error, just in case. --- packages/nodes-base/nodes/Redis/Redis.node.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/nodes-base/nodes/Redis/Redis.node.ts b/packages/nodes-base/nodes/Redis/Redis.node.ts index 716a751d70..3d1aafa962 100644 --- a/packages/nodes-base/nodes/Redis/Redis.node.ts +++ b/packages/nodes-base/nodes/Redis/Redis.node.ts @@ -445,6 +445,7 @@ export class Redis implements INodeType { const operation = this.getNodeParameter('operation', 0) as string; client.on('error', (err: Error) => { + client.quit(); reject(err); }); @@ -518,6 +519,7 @@ export class Redis implements INodeType { } } + client.quit(); resolve(this.prepareOutputData(returnItems)); } }); From 2ee5853bd07a0a600e7c2d2bc99d3cf7226e4de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 29 Mar 2021 10:06:07 +0200 Subject: [PATCH 104/137] :bug: Fix update:group in Bitwarden node (#1580) * :zap: Fix default args for update:group * :zap: Add external IDs to resource loader --- .../nodes/Bitwarden/Bitwarden.node.ts | 33 ++++++++++++------- .../nodes/Bitwarden/GenericFunctions.ts | 4 +-- .../descriptions/GroupDescription.ts | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/nodes-base/nodes/Bitwarden/Bitwarden.node.ts b/packages/nodes-base/nodes/Bitwarden/Bitwarden.node.ts index 7b08eda740..4904329013 100644 --- a/packages/nodes-base/nodes/Bitwarden/Bitwarden.node.ts +++ b/packages/nodes-base/nodes/Bitwarden/Bitwarden.node.ts @@ -303,7 +303,7 @@ export class Bitwarden implements INodeType { // group: update // ---------------------------------- - const body = {} as IDataObject; + const groupId = this.getNodeParameter('groupId', i); const updateFields = this.getNodeParameter('updateFields', i) as GroupUpdateFields; @@ -311,7 +311,25 @@ export class Bitwarden implements INodeType { throw new Error(`Please enter at least one field to update for the ${resource}.`); } - const { name, collections, externalId, accessAll } = updateFields; + // set defaults for `name` and `accessAll`, required by Bitwarden but optional in n8n + + let { name, accessAll } = updateFields; + + if (name === undefined) { + responseData = await bitwardenApiRequest.call(this, 'GET', `/public/groups/${groupId}`, {}, {}) as { name: string }; + name = responseData.name; + } + + if (accessAll === undefined) { + accessAll = false; + } + + const body = { + name, + AccessAll: accessAll, + } as IDataObject; + + const { collections, externalId } = updateFields; if (collections) { body.collections = collections.map((collectionId) => ({ @@ -320,20 +338,11 @@ export class Bitwarden implements INodeType { })); } - if (name) { - body.name = name; - } - if (externalId) { body.externalId = externalId; } - if (accessAll !== undefined) { - body.AccessAll = accessAll; - } - - const id = this.getNodeParameter('groupId', i); - const endpoint = `/public/groups/${id}`; + const endpoint = `/public/groups/${groupId}`; responseData = await bitwardenApiRequest.call(this, 'PUT', endpoint, {}, body); } else if (operation === 'updateMembers') { diff --git a/packages/nodes-base/nodes/Bitwarden/GenericFunctions.ts b/packages/nodes-base/nodes/Bitwarden/GenericFunctions.ts index 5e1c3e90c6..a46df9d46f 100644 --- a/packages/nodes-base/nodes/Bitwarden/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Bitwarden/GenericFunctions.ts @@ -157,9 +157,9 @@ export async function loadResource( const { data } = await bitwardenApiRequest.call(this, 'GET', endpoint, {}, {}, token); - data.forEach(({ id, name }: { id: string, name: string }) => { + data.forEach(({ id, name, externalId }: { id: string, name: string, externalId?: string }) => { returnData.push({ - name: name || id, + name: externalId || name || id, value: id, }); }); diff --git a/packages/nodes-base/nodes/Bitwarden/descriptions/GroupDescription.ts b/packages/nodes-base/nodes/Bitwarden/descriptions/GroupDescription.ts index aa6b4f07b5..b947a2ad3a 100644 --- a/packages/nodes-base/nodes/Bitwarden/descriptions/GroupDescription.ts +++ b/packages/nodes-base/nodes/Bitwarden/descriptions/GroupDescription.ts @@ -203,12 +203,12 @@ export const groupFields = [ placeholder: 'Add Field', default: {}, options: [ - { displayName: 'Access All', name: 'accessAll', type: 'boolean', default: false, + description: 'Allow this group to access all collections within the organization, instead of only its associated collections.
If set to true, this option overrides any collection assignments.', }, { displayName: 'Collections', From ca50194d71aa1e832b4697de7add4f0563acbac5 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Mon, 29 Mar 2021 11:20:10 +0200 Subject: [PATCH 105/137] :zap: Cleanup & Fix lint issues --- packages/nodes-base/nodes/EditImage.node.ts | 8 ++++---- packages/nodes-base/nodes/EmailSend.node.ts | 10 +++++----- packages/nodes-base/nodes/FunctionItem.node.ts | 6 +++--- packages/nodes-base/nodes/Mailgun/Mailgun.node.ts | 8 ++++---- packages/nodes-base/nodes/ReadBinaryFile.node.ts | 6 +++--- packages/nodes-base/nodes/ReadPdf.node.ts | 4 ++-- packages/nodes-base/nodes/WriteBinaryFile.node.ts | 8 ++++---- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/nodes-base/nodes/EditImage.node.ts b/packages/nodes-base/nodes/EditImage.node.ts index 5472fdac2e..0c871e01e8 100644 --- a/packages/nodes-base/nodes/EditImage.node.ts +++ b/packages/nodes-base/nodes/EditImage.node.ts @@ -948,9 +948,9 @@ export class EditImage implements INodeType { }, }; - async execute(this: IExecuteFunctions): Promise { + async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - + const returnData: INodeExecutionData[] = []; const length = items.length as unknown as number; let item: INodeExecutionData; @@ -1069,7 +1069,7 @@ export class EditImage implements INodeType { if (operation === 'information') { // Just return the information const imageData = await new Promise((resolve, reject) => { - gmInstance = gmInstance.identify((error:any, imageData:any) => { + gmInstance = gmInstance.identify((error, imageData) => { if (error) { reject(error); return; @@ -1241,7 +1241,7 @@ export class EditImage implements INodeType { return resolve(newItem); }); }))); - + } return this.prepareOutputData(returnData); } diff --git a/packages/nodes-base/nodes/EmailSend.node.ts b/packages/nodes-base/nodes/EmailSend.node.ts index 2bdc29076f..6028d6c547 100644 --- a/packages/nodes-base/nodes/EmailSend.node.ts +++ b/packages/nodes-base/nodes/EmailSend.node.ts @@ -124,7 +124,7 @@ export class EmailSend implements INodeType { }; - async execute(this: IExecuteFunctions): Promise { + async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; @@ -132,7 +132,7 @@ export class EmailSend implements INodeType { let item: INodeExecutionData; for (let itemIndex = 0; itemIndex < length; itemIndex++) { - + item = items[itemIndex]; const fromEmail = this.getNodeParameter('fromEmail', itemIndex) as string; @@ -157,7 +157,7 @@ export class EmailSend implements INodeType { secure: credentials.secure as boolean, }; - if(credentials.user || credentials.password) { + if (credentials.user || credentials.password) { // @ts-ignore connectionOptions.auth = { user: credentials.user as string, @@ -208,10 +208,10 @@ export class EmailSend implements INodeType { // Send the email const info = await transporter.sendMail(mailOptions); - + returnData.push({ json: info }); } - + return this.prepareOutputData(returnData); } diff --git a/packages/nodes-base/nodes/FunctionItem.node.ts b/packages/nodes-base/nodes/FunctionItem.node.ts index d62e2e4a58..e7032e460e 100644 --- a/packages/nodes-base/nodes/FunctionItem.node.ts +++ b/packages/nodes-base/nodes/FunctionItem.node.ts @@ -40,7 +40,7 @@ export class FunctionItem implements INodeType { ], }; - async execute(this: IExecuteFunctions): Promise { + async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; @@ -115,9 +115,9 @@ export class FunctionItem implements INodeType { if (item.binary) { returnItem.binary = item.binary; } - + returnData.push(returnItem); - } + } return this.prepareOutputData(returnData); } } diff --git a/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts b/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts index fc2625d631..39eeffb8dd 100644 --- a/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts +++ b/packages/nodes-base/nodes/Mailgun/Mailgun.node.ts @@ -105,9 +105,9 @@ export class Mailgun implements INodeType { }; - async execute(this: IExecuteFunctions): Promise { + async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - + const returnData: INodeExecutionData[] = []; const length = items.length as unknown as number; let item: INodeExecutionData; @@ -187,7 +187,7 @@ export class Mailgun implements INodeType { returnData.push({ json: responseData, }); - } - return this.prepareOutputData(returnData) + } + return this.prepareOutputData(returnData); } } diff --git a/packages/nodes-base/nodes/ReadBinaryFile.node.ts b/packages/nodes-base/nodes/ReadBinaryFile.node.ts index e8be54cd4c..bfabc72ba3 100644 --- a/packages/nodes-base/nodes/ReadBinaryFile.node.ts +++ b/packages/nodes-base/nodes/ReadBinaryFile.node.ts @@ -49,7 +49,7 @@ export class ReadBinaryFile implements INodeType { }; - async execute(this: IExecuteFunctions): Promise { + async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; @@ -86,8 +86,8 @@ export class ReadBinaryFile implements INodeType { newItem.binary![dataPropertyName] = await this.helpers.prepareBinaryData(data, filePath); returnData.push(newItem); - } - + } + return this.prepareOutputData(returnData); } diff --git a/packages/nodes-base/nodes/ReadPdf.node.ts b/packages/nodes-base/nodes/ReadPdf.node.ts index 0213969adb..953f912c42 100644 --- a/packages/nodes-base/nodes/ReadPdf.node.ts +++ b/packages/nodes-base/nodes/ReadPdf.node.ts @@ -45,7 +45,7 @@ export class ReadPdf implements INodeType { let item: INodeExecutionData; for (let itemIndex = 0; itemIndex < length; itemIndex++) { - + item = items[itemIndex]; const binaryPropertyName = this.getNodeParameter('binaryPropertyName', itemIndex) as string; @@ -58,7 +58,7 @@ export class ReadPdf implements INodeType { binary: item.binary, json: await pdf(binaryData), }); - + } return this.prepareOutputData(returnData); } diff --git a/packages/nodes-base/nodes/WriteBinaryFile.node.ts b/packages/nodes-base/nodes/WriteBinaryFile.node.ts index f329f47093..9794283529 100644 --- a/packages/nodes-base/nodes/WriteBinaryFile.node.ts +++ b/packages/nodes-base/nodes/WriteBinaryFile.node.ts @@ -55,7 +55,7 @@ export class WriteBinaryFile implements INodeType { async execute(this: IExecuteFunctions): Promise { - + const items = this.getInputData(); const returnData: INodeExecutionData[] = []; @@ -65,9 +65,9 @@ export class WriteBinaryFile implements INodeType { for (let itemIndex = 0; itemIndex < length; itemIndex++) { const dataPropertyName = this.getNodeParameter('dataPropertyName', itemIndex) as string; - + const fileName = this.getNodeParameter('fileName', itemIndex) as string; - + item = items[itemIndex]; if (item.binary === undefined) { @@ -95,7 +95,7 @@ export class WriteBinaryFile implements INodeType { } // Add the file name to data - + (newItem.json as IDataObject).fileName = fileName; returnData.push(newItem); From ee0d6f8d9a01e640eb0643a7bada55ab4b324850 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 2 Apr 2021 14:17:34 +0200 Subject: [PATCH 106/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/MySql/MySql.node.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/MySql/MySql.node.ts b/packages/nodes-base/nodes/MySql/MySql.node.ts index 43974e766d..5e6a18752e 100644 --- a/packages/nodes-base/nodes/MySql/MySql.node.ts +++ b/packages/nodes-base/nodes/MySql/MySql.node.ts @@ -190,9 +190,8 @@ export class MySql implements INodeType { return connection.query(rawQuery); }); - let queryResult = await Promise.all(queryQueue); - queryResult = queryResult.reduce((collection, result) => { + const queryResult = (await Promise.all(queryQueue) as mysql2.OkPacket[][]).reduce((collection, result) => { const [rows, fields] = result; if (Array.isArray(rows)) { @@ -204,7 +203,7 @@ export class MySql implements INodeType { return collection; }, []); - returnItems = this.helpers.returnJsonArray(queryResult as IDataObject[]); + returnItems = this.helpers.returnJsonArray(queryResult as unknown as IDataObject[]); } else if (operation === 'insert') { // ---------------------------------- @@ -220,7 +219,7 @@ export class MySql implements INodeType { const queryItems = insertItems.reduce((collection, item) => collection.concat(Object.values(item as any)), []); // tslint:disable-line:no-any const queryResult = await connection.query(insertSQL, queryItems); - returnItems = this.helpers.returnJsonArray(queryResult[0] as IDataObject); + returnItems = this.helpers.returnJsonArray(queryResult[0] as unknown as IDataObject); } else if (operation === 'update') { // ---------------------------------- @@ -240,9 +239,7 @@ export class MySql implements INodeType { const updateSQL = `UPDATE ${table} SET ${columns.map(column => `${column} = ?`).join(',')} WHERE ${updateKey} = ?;`; const queryQueue = updateItems.map((item) => connection.query(updateSQL, Object.values(item).concat(item[updateKey]))); let queryResult = await Promise.all(queryQueue); - - queryResult = queryResult.map(result => result[0]); - returnItems = this.helpers.returnJsonArray(queryResult as IDataObject[]); + returnItems = this.helpers.returnJsonArray(queryResult.map(result => result[0]) as unknown as IDataObject[]); } else { await connection.end(); From 7ce2de0e7c141b62a2c3e40529371ab391936d53 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 2 Apr 2021 08:31:44 -0400 Subject: [PATCH 107/137] :bug: Fix issue sending the parameter project incorrectly (Invoiceninja) (#1619) When creating a task, the project parameter was being send 'project' but it must be 'project_id' --- .../nodes/InvoiceNinja/GenericFunctions.ts | 8 ++- .../nodes/InvoiceNinja/InvoiceNinja.node.ts | 57 +++++++++++------- .../nodes/InvoiceNinja/TaskInterface.ts | 2 +- .../nodes/InvoiceNinja/invoiceNinja.png | Bin 1109 -> 0 bytes .../nodes/InvoiceNinja/invoiceNinja.svg | 1 + 5 files changed, 44 insertions(+), 24 deletions(-) delete mode 100644 packages/nodes-base/nodes/InvoiceNinja/invoiceNinja.png create mode 100644 packages/nodes-base/nodes/InvoiceNinja/invoiceNinja.svg diff --git a/packages/nodes-base/nodes/InvoiceNinja/GenericFunctions.ts b/packages/nodes-base/nodes/InvoiceNinja/GenericFunctions.ts index dc9fabeb0e..947be4d0c3 100644 --- a/packages/nodes-base/nodes/InvoiceNinja/GenericFunctions.ts +++ b/packages/nodes-base/nodes/InvoiceNinja/GenericFunctions.ts @@ -1,4 +1,6 @@ -import { OptionsWithUri } from 'request'; +import { + OptionsWithUri, +} from 'request'; import { IExecuteFunctions, @@ -11,7 +13,9 @@ import { IDataObject, } from 'n8n-workflow'; -import { get } from 'lodash'; +import { + get, +} from 'lodash'; export async function invoiceNinjaApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, method: string, endpoint: string, body: any = {}, query?: IDataObject, uri?: string): Promise { // tslint:disable-line:no-any const credentials = this.getCredentials('invoiceNinjaApi'); diff --git a/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinja.node.ts b/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinja.node.ts index 3979e165cb..3327997f7f 100644 --- a/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinja.node.ts +++ b/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinja.node.ts @@ -1,6 +1,7 @@ import { IExecuteFunctions, } from 'n8n-core'; + import { IDataObject, ILoadOptionsFunctions, @@ -9,63 +10,77 @@ import { INodeType, INodeTypeDescription, } from 'n8n-workflow'; + import { invoiceNinjaApiRequest, invoiceNinjaApiRequestAllItems, } from './GenericFunctions'; + import { clientFields, clientOperations, } from './ClientDescription'; + import { invoiceFields, invoiceOperations, } from './InvoiceDescription'; + import { IClient, IContact, } from './ClientInterface'; + import { countryCodes, - } from './ISOCountryCodes'; +} from './ISOCountryCodes'; + import { IInvoice, IItem, - } from './invoiceInterface'; +} from './invoiceInterface'; + import { taskFields, taskOperations, - } from './TaskDescription'; - import { +} from './TaskDescription'; + +import { ITask, - } from './TaskInterface'; - import { +} from './TaskInterface'; + +import { paymentFields, paymentOperations, - } from './PaymentDescription'; - import { +} from './PaymentDescription'; + +import { IPayment, - } from './PaymentInterface'; - import { +} from './PaymentInterface'; + +import { expenseFields, expenseOperations, - } from './ExpenseDescription'; - import { +} from './ExpenseDescription'; + +import { IExpense, - } from './ExpenseInterface'; - import { +} from './ExpenseInterface'; + +import { quoteFields, quoteOperations, - } from './QuoteDescription'; - import { +} from './QuoteDescription'; + +import { IQuote, - } from './QuoteInterface'; +} from './QuoteInterface'; export class InvoiceNinja implements INodeType { description: INodeTypeDescription = { displayName: 'Invoice Ninja', name: 'invoiceNinja', - icon: 'file:invoiceNinja.png', + icon: 'file:invoiceNinja.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', @@ -462,7 +477,7 @@ export class InvoiceNinja implements INodeType { body.client_id = additionalFields.client as number; } if (additionalFields.project) { - body.project = additionalFields.project as number; + body.project_id = additionalFields.project as number; } if (additionalFields.customValue1) { body.custom_value1 = additionalFields.customValue1 as string; @@ -479,10 +494,10 @@ export class InvoiceNinja implements INodeType { for (const logValue of timeLogsValues) { let from = 0, to; if (logValue.startDate) { - from = new Date(logValue.startDate as string).getTime()/1000 as number; + from = new Date(logValue.startDate as string).getTime() / 1000 as number; } if (logValue.endDate) { - to = new Date(logValue.endDate as string).getTime()/1000 as number; + to = new Date(logValue.endDate as string).getTime() / 1000 as number; } if (logValue.duration) { to = from + (logValue.duration as number * 3600); diff --git a/packages/nodes-base/nodes/InvoiceNinja/TaskInterface.ts b/packages/nodes-base/nodes/InvoiceNinja/TaskInterface.ts index 383bed5d94..62ef311a61 100644 --- a/packages/nodes-base/nodes/InvoiceNinja/TaskInterface.ts +++ b/packages/nodes-base/nodes/InvoiceNinja/TaskInterface.ts @@ -3,6 +3,6 @@ export interface ITask { custom_value1?: string; custom_value2?: string; description?: string; - project?: number; + project_id?: number; time_log?: string; } diff --git a/packages/nodes-base/nodes/InvoiceNinja/invoiceNinja.png b/packages/nodes-base/nodes/InvoiceNinja/invoiceNinja.png deleted file mode 100644 index 50c5ac69ca294601d53c210b16683f5f1ed8c08b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1109 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$%n0xaaRqX@n3(Y(PG%N7vQ(G) z|NlSGNtVVYJsq8_3=ASXd=Kv5XJ=qswS4*eckdQ2Txe!!_~ZNc-8*+qoisT#D9F;( zjE9}$?wz~m&YoSnYSpai(D$ScT7N=l1MhzSS^^74NE z{Q3H|YexIEHu}e|s&p__l$>fx>nv zttGxQCmHdm=;rM;Fy5Bmv4Hao?d+T-{&-)U8z&E zyml`(+!H!WJndkyu(#OKnpHRD*w-8To?cS5)`NZ4oyp1HeHw1O(7L_qID_t0tHbM< zI-gxrSu5tT%}_b9oMEx=uGsmkYp#UsVVR+sar+*tQIrDz>>|02j~(+Ej-1$>Cb*ts zWrWI`&Kqo96^G_cI^W^myW@+Pfb(0gk1|45+|#3N4ozOBD7)1u#vjc1Is(uUl?95 zaK3R=nZ@S%(H#L&oHZ;?cM7MuYm~9XZ)j?8|7EacdcZT0GA-qJMyJd*FB0eMo}~56 z)@-}-#6RzvEN*H)PU1+7V)A-8KceEXDc{dOSDRj|NSsg0DN~DkaagbY@{614AJVlWCUj{?arvDzw3Tdi|rvL1>%V*EmP?eKny0@vZ zInvoice Ninja icon \ No newline at end of file From 3b620f8da1faba973dd12ccffc64e2109dec8258 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 2 Apr 2021 14:37:13 +0200 Subject: [PATCH 108/137] :bug: Fix InvoiceNinja Trigger icon --- .../nodes-base/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.ts b/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.ts index 3833dddcfd..b8fbe79a38 100644 --- a/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.ts +++ b/packages/nodes-base/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.ts @@ -17,7 +17,7 @@ export class InvoiceNinjaTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'Invoice Ninja Trigger', name: 'invoiceNinjaTrigger', - icon: 'file:invoiceNinja.png', + icon: 'file:invoiceNinja.svg', group: ['trigger'], version: 1, description: 'Starts the workflow when Invoice Ninja events occure.', From 9865dcdb0a09f7c343fd87d4a9c05914ef37ef2a Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 2 Apr 2021 09:26:33 -0400 Subject: [PATCH 109/137] :bug: Fix issue with Cortex Node (#1606) Cortex node it's iterating over all items, but it's not accumulating the results. Hence just the last item is returned. --- packages/nodes-base/nodes/Cortex/Cortex.node.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/nodes/Cortex/Cortex.node.ts b/packages/nodes-base/nodes/Cortex/Cortex.node.ts index eb20b23f2a..27a2d2c9e1 100644 --- a/packages/nodes-base/nodes/Cortex/Cortex.node.ts +++ b/packages/nodes-base/nodes/Cortex/Cortex.node.ts @@ -456,11 +456,12 @@ export class Cortex implements INodeType { ) as IJob; } } - } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); + + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else if (responseData !== undefined) { + returnData.push(responseData as IDataObject); + } } return [this.helpers.returnJsonArray(returnData)]; } From 0cfcd1170f52af99426f7a7990d910b3089e6196 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 2 Apr 2021 09:31:25 -0400 Subject: [PATCH 110/137] :zap: Add reporter field to resource issue (Jira) (#1592) --- .../nodes-base/nodes/Jira/IssueDescription.ts | 20 +++++++++++++++++++ .../nodes-base/nodes/Jira/IssueInterface.ts | 1 + packages/nodes-base/nodes/Jira/Jira.node.ts | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/packages/nodes-base/nodes/Jira/IssueDescription.ts b/packages/nodes-base/nodes/Jira/IssueDescription.ts index f67375477f..84ee2dae48 100644 --- a/packages/nodes-base/nodes/Jira/IssueDescription.ts +++ b/packages/nodes-base/nodes/Jira/IssueDescription.ts @@ -253,6 +253,16 @@ export const issueFields = [ default: '', description: 'Priority', }, + { + displayName: 'Reporter', + name: 'reporter', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getUsers', + }, + default: '', + description: 'Reporter', + }, { displayName: 'Update History', name: 'updateHistory', @@ -418,6 +428,16 @@ export const issueFields = [ default: '', description: 'Priority', }, + { + displayName: 'Reporter', + name: 'reporter', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getUsers', + }, + default: '', + description: 'Reporter', + }, { displayName: 'Summary', name: 'summary', diff --git a/packages/nodes-base/nodes/Jira/IssueInterface.ts b/packages/nodes-base/nodes/Jira/IssueInterface.ts index a3a75f2d59..bef90057a9 100644 --- a/packages/nodes-base/nodes/Jira/IssueInterface.ts +++ b/packages/nodes-base/nodes/Jira/IssueInterface.ts @@ -11,6 +11,7 @@ export interface IFields { priority?: IDataObject; project?: IDataObject; summary?: string; + reporter?: IDataObject; } export interface IIssue { diff --git a/packages/nodes-base/nodes/Jira/Jira.node.ts b/packages/nodes-base/nodes/Jira/Jira.node.ts index 868dcff9ba..eeb9d7c69d 100644 --- a/packages/nodes-base/nodes/Jira/Jira.node.ts +++ b/packages/nodes-base/nodes/Jira/Jira.node.ts @@ -448,6 +448,11 @@ export class Jira implements INodeType { }; } } + if (additionalFields.reporter) { + fields.reporter = { + id: additionalFields.reporter as string, + }; + } if (additionalFields.description) { fields.description = additionalFields.description as string; } @@ -520,6 +525,11 @@ export class Jira implements INodeType { }; } } + if (updateFields.reporter) { + fields.reporter = { + id: updateFields.reporter as string, + }; + } if (updateFields.description) { fields.description = updateFields.description as string; } From c89cef163c955c86bc8014dfbe96c87a1927d185 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 2 Apr 2021 15:37:10 +0200 Subject: [PATCH 111/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/MySql/MySql.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/MySql/MySql.node.ts b/packages/nodes-base/nodes/MySql/MySql.node.ts index 5e6a18752e..5015954d98 100644 --- a/packages/nodes-base/nodes/MySql/MySql.node.ts +++ b/packages/nodes-base/nodes/MySql/MySql.node.ts @@ -238,7 +238,7 @@ export class MySql implements INodeType { const updateItems = copyInputItems(items, columns); const updateSQL = `UPDATE ${table} SET ${columns.map(column => `${column} = ?`).join(',')} WHERE ${updateKey} = ?;`; const queryQueue = updateItems.map((item) => connection.query(updateSQL, Object.values(item).concat(item[updateKey]))); - let queryResult = await Promise.all(queryQueue); + const queryResult = await Promise.all(queryQueue); returnItems = this.helpers.returnJsonArray(queryResult.map(result => result[0]) as unknown as IDataObject[]); } else { From aab6946e9e4b3231941a858cc1d9a0c12530b82b Mon Sep 17 00:00:00 2001 From: Craig McElroy Date: Fri, 2 Apr 2021 10:46:33 -0500 Subject: [PATCH 112/137] :bug: Salesforce Get All : Handle string and array options.fields (#1590) --- packages/nodes-base/nodes/Salesforce/GenericFunctions.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts index 54b7b319d3..037b94afc1 100644 --- a/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Salesforce/GenericFunctions.ts @@ -163,7 +163,12 @@ export function getDefaultFields(sobject: string) { export function getQuery(options: IDataObject, sobject: string, returnAll: boolean, limit = 0) { const fields: string[] = []; if (options.fields) { - fields.push.apply(fields, options.fields as string[]); + // options.fields is comma separated in standard Salesforce objects and array in custom Salesforce objects -- handle both cases + if (typeof options.fields === 'string') { + fields.push.apply(fields, options.fields.split(',')); + } else { + fields.push.apply(fields, options.fields as string[]); + } } else { fields.push.apply(fields, (getDefaultFields(sobject) as string || 'id').split(',')); } From 7995bd610d63f5e54b363b24f3510ce2f2aaf816 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 2 Apr 2021 11:56:45 -0400 Subject: [PATCH 113/137] :sparkles: Add Harvest update task operations (#1603) * Add create/update task in Harvest node * :zap: Small improvements Co-authored-by: dali --- .../nodes/Harvest/ClientDescription.ts | 18 ++++--- .../nodes/Harvest/CompanyDescription.ts | 8 +++- .../nodes/Harvest/ContactDescription.ts | 18 ++++--- .../nodes/Harvest/EstimateDescription.ts | 18 ++++--- .../nodes/Harvest/ExpenseDescription.ts | 18 ++++--- .../nodes-base/nodes/Harvest/Harvest.node.ts | 32 +++++++++++++ .../nodes/Harvest/InvoiceDescription.ts | 18 ++++--- .../nodes/Harvest/ProjectDescription.ts | 18 ++++--- .../nodes/Harvest/TaskDescription.ts | 48 ++++++++++++++----- .../nodes/Harvest/TimeEntryDescription.ts | 10 +++- .../nodes/Harvest/UserDescription.ts | 18 ++++--- 11 files changed, 158 insertions(+), 66 deletions(-) diff --git a/packages/nodes-base/nodes/Harvest/ClientDescription.ts b/packages/nodes-base/nodes/Harvest/ClientDescription.ts index 482f04d4d3..61ae3f514e 100644 --- a/packages/nodes-base/nodes/Harvest/ClientDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ClientDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['client']; +const resource = [ + 'client', +]; export const clientOperations = [ { @@ -49,7 +53,7 @@ export const clientOperations = [ export const clientFields = [ /* -------------------------------------------------------------------------- */ - /* client:getAll */ + /* client:getAll */ /* -------------------------------------------------------------------------- */ { @@ -122,7 +126,7 @@ export const clientFields = [ }, /* -------------------------------------------------------------------------- */ - /* client:get */ + /* client:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Client Id', @@ -142,7 +146,7 @@ export const clientFields = [ }, /* -------------------------------------------------------------------------- */ - /* client:delete */ + /* client:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Client Id', @@ -162,7 +166,7 @@ export const clientFields = [ }, /* -------------------------------------------------------------------------- */ - /* client:create */ + /* client:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Name', @@ -220,7 +224,7 @@ export const clientFields = [ }, /* -------------------------------------------------------------------------- */ - /* client:update */ + /* client:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Client Id', diff --git a/packages/nodes-base/nodes/Harvest/CompanyDescription.ts b/packages/nodes-base/nodes/Harvest/CompanyDescription.ts index 917b29deb6..34300dbf99 100644 --- a/packages/nodes-base/nodes/Harvest/CompanyDescription.ts +++ b/packages/nodes-base/nodes/Harvest/CompanyDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['company']; +const resource = [ + 'company', +]; export const companyOperations = [ { diff --git a/packages/nodes-base/nodes/Harvest/ContactDescription.ts b/packages/nodes-base/nodes/Harvest/ContactDescription.ts index 3c17745e31..5c71f7092c 100644 --- a/packages/nodes-base/nodes/Harvest/ContactDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ContactDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['contact']; +const resource = [ + 'contact', +]; export const contactOperations = [ { @@ -48,7 +52,7 @@ export const contactOperations = [ export const contactFields = [ /* -------------------------------------------------------------------------- */ - /* contact:getAll */ + /* contact:getAll */ /* -------------------------------------------------------------------------- */ { @@ -121,7 +125,7 @@ export const contactFields = [ }, /* -------------------------------------------------------------------------- */ - /* contact:get */ + /* contact:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Contact Id', @@ -141,7 +145,7 @@ export const contactFields = [ }, /* -------------------------------------------------------------------------- */ - /* contact:delete */ + /* contact:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Contact Id', @@ -161,7 +165,7 @@ export const contactFields = [ }, /* -------------------------------------------------------------------------- */ - /* contact:create */ + /* contact:create */ /* -------------------------------------------------------------------------- */ { displayName: 'First Name', @@ -256,7 +260,7 @@ export const contactFields = [ }, /* -------------------------------------------------------------------------- */ - /* contact:update */ + /* contact:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Contact Id', diff --git a/packages/nodes-base/nodes/Harvest/EstimateDescription.ts b/packages/nodes-base/nodes/Harvest/EstimateDescription.ts index f827a27d8b..a898738cba 100644 --- a/packages/nodes-base/nodes/Harvest/EstimateDescription.ts +++ b/packages/nodes-base/nodes/Harvest/EstimateDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['estimate']; +const resource = [ + 'estimate', +]; export const estimateOperations = [ { @@ -48,7 +52,7 @@ export const estimateOperations = [ export const estimateFields = [ /* -------------------------------------------------------------------------- */ - /* estimate:getAll */ + /* estimate:getAll */ /* -------------------------------------------------------------------------- */ { @@ -152,7 +156,7 @@ export const estimateFields = [ }, /* -------------------------------------------------------------------------- */ - /* estimate:get */ + /* estimate:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Estimate Id', @@ -172,7 +176,7 @@ export const estimateFields = [ }, /* -------------------------------------------------------------------------- */ - /* estimate:delete */ + /* estimate:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Estimate Id', @@ -192,7 +196,7 @@ export const estimateFields = [ }, /* -------------------------------------------------------------------------- */ - /* estimate:create */ + /* estimate:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Client Id', @@ -292,7 +296,7 @@ export const estimateFields = [ }, /* -------------------------------------------------------------------------- */ - /* estimate:update */ + /* estimate:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Invoice Id', diff --git a/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts b/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts index a32e836c4b..d9b21bec35 100644 --- a/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['expense']; +const resource = [ + 'expense', +]; export const expenseOperations = [ { @@ -48,7 +52,7 @@ export const expenseOperations = [ export const expenseFields = [ /* -------------------------------------------------------------------------- */ - /* expense:getAll */ + /* expense:getAll */ /* -------------------------------------------------------------------------- */ { @@ -166,7 +170,7 @@ export const expenseFields = [ }, /* -------------------------------------------------------------------------- */ - /* expense:get */ + /* expense:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Expense Id', @@ -186,7 +190,7 @@ export const expenseFields = [ }, /* -------------------------------------------------------------------------- */ - /* expense:delete */ + /* expense:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Expense Id', @@ -206,7 +210,7 @@ export const expenseFields = [ }, /* -------------------------------------------------------------------------- */ - /* expense:create */ + /* expense:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Project Id', @@ -310,7 +314,7 @@ export const expenseFields = [ }, /* -------------------------------------------------------------------------- */ - /* invoice:update */ + /* invoice:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Invoice Id', diff --git a/packages/nodes-base/nodes/Harvest/Harvest.node.ts b/packages/nodes-base/nodes/Harvest/Harvest.node.ts index b7edc1a7d5..52f9a9b6cb 100644 --- a/packages/nodes-base/nodes/Harvest/Harvest.node.ts +++ b/packages/nodes-base/nodes/Harvest/Harvest.node.ts @@ -54,6 +54,7 @@ import { taskFields, taskOperations, } from './TaskDescription'; + import { timeEntryFields, timeEntryOperations, @@ -693,6 +694,37 @@ export class Harvest implements INodeType { const responseData: IDataObject[] = await getAllResource.call(this, 'tasks', i); returnData.push.apply(returnData, responseData); + } else if (operation === 'create') { + // ---------------------------------- + // create + // ---------------------------------- + + requestMethod = 'POST'; + endpoint = 'tasks'; + + body.name = this.getNodeParameter('name', i) as string; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + Object.assign(body, additionalFields); + + const responseData = await harvestApiRequest.call(this, requestMethod, qs, endpoint, body); + returnData.push(responseData); + + } else if (operation === 'update') { + // ---------------------------------- + // update + // ---------------------------------- + + requestMethod = 'PATCH'; + const id = this.getNodeParameter('id', i) as string; + endpoint = `tasks/${id}`; + + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + Object.assign(qs, updateFields); + + const responseData = await harvestApiRequest.call(this, requestMethod, qs, endpoint, body); + returnData.push(responseData); + } else if (operation === 'delete') { // ---------------------------------- // delete diff --git a/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts b/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts index 4778507a1a..8d2822878d 100644 --- a/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts +++ b/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['invoice']; +const resource = [ + 'invoice', +]; export const invoiceOperations = [ { @@ -48,7 +52,7 @@ export const invoiceOperations = [ export const invoiceFields = [ /* -------------------------------------------------------------------------- */ - /* invoice:getAll */ + /* invoice:getAll */ /* -------------------------------------------------------------------------- */ { @@ -177,7 +181,7 @@ export const invoiceFields = [ }, /* -------------------------------------------------------------------------- */ - /* invoice:get */ + /* invoice:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Invoice Id', @@ -197,7 +201,7 @@ export const invoiceFields = [ }, /* -------------------------------------------------------------------------- */ - /* invoice:delete */ + /* invoice:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Invoice Id', @@ -217,7 +221,7 @@ export const invoiceFields = [ }, /* -------------------------------------------------------------------------- */ - /* invoice:create */ + /* invoice:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Client Id', @@ -345,7 +349,7 @@ export const invoiceFields = [ }, /* -------------------------------------------------------------------------- */ - /* invoice:update */ + /* invoice:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Invoice Id', diff --git a/packages/nodes-base/nodes/Harvest/ProjectDescription.ts b/packages/nodes-base/nodes/Harvest/ProjectDescription.ts index 6a4b0d4202..3f7a40dd08 100644 --- a/packages/nodes-base/nodes/Harvest/ProjectDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ProjectDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['project']; +const resource = [ + 'project', +]; export const projectOperations = [ { @@ -48,7 +52,7 @@ export const projectOperations = [ export const projectFields = [ /* -------------------------------------------------------------------------- */ - /* projects:getAll */ + /* projects:getAll */ /* -------------------------------------------------------------------------- */ { @@ -138,7 +142,7 @@ export const projectFields = [ }, /* -------------------------------------------------------------------------- */ - /* project:get */ + /* project:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Project Id', @@ -158,7 +162,7 @@ export const projectFields = [ }, /* -------------------------------------------------------------------------- */ - /* project:delete */ + /* project:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Project Id', @@ -178,7 +182,7 @@ export const projectFields = [ }, /* -------------------------------------------------------------------------- */ - /* project:create */ + /* project:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Name', @@ -399,7 +403,7 @@ export const projectFields = [ }, /* -------------------------------------------------------------------------- */ - /* project:update */ + /* project:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Project Id', diff --git a/packages/nodes-base/nodes/Harvest/TaskDescription.ts b/packages/nodes-base/nodes/Harvest/TaskDescription.ts index a4926d70d1..90fc8d9c66 100644 --- a/packages/nodes-base/nodes/Harvest/TaskDescription.ts +++ b/packages/nodes-base/nodes/Harvest/TaskDescription.ts @@ -1,5 +1,11 @@ -import { INodeProperties } from 'n8n-workflow'; -const resource = ['task']; +import { + INodeProperties +} from 'n8n-workflow'; + +const resource = [ + 'task', +]; + export const taskOperations = [ { displayName: 'Operation', @@ -46,7 +52,7 @@ export const taskOperations = [ export const taskFields = [ /* -------------------------------------------------------------------------- */ - /* task:getAll */ + /* task:getAll */ /* -------------------------------------------------------------------------- */ { displayName: 'Return All', @@ -128,7 +134,7 @@ export const taskFields = [ }, /* -------------------------------------------------------------------------- */ - /* task:get */ + /* task:get */ /* -------------------------------------------------------------------------- */ { displayName: 'Task Id', @@ -148,7 +154,7 @@ export const taskFields = [ }, /* -------------------------------------------------------------------------- */ - /* task:delete */ + /* task:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'Task Id', @@ -164,11 +170,11 @@ export const taskFields = [ resource, }, }, - description: 'The ID of the task you wan to delete.', + description: 'The ID of the task you want to delete.', }, /* -------------------------------------------------------------------------- */ - /* task:create */ + /* task:create */ /* -------------------------------------------------------------------------- */ { displayName: 'Name', @@ -205,14 +211,14 @@ export const taskFields = [ displayName: 'Billable By Default', name: 'billable_by_default', type: 'boolean', - default: '', + default: true, description: 'Used in determining whether default tasks should be marked billable when creating a new project. Defaults to true.', }, { displayName: 'Default Hourly Rate', name: 'default_hourly_rate', - type: 'string', - default: '0', + type: 'number', + default: 0, description: 'The default hourly rate to use for this task when it is added to a project. Defaults to 0.', }, { @@ -232,8 +238,24 @@ export const taskFields = [ ], }, /* -------------------------------------------------------------------------- */ - /* task:update */ + /* task:update */ /* -------------------------------------------------------------------------- */ + { + displayName: 'Task ID', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource, + }, + }, + description: 'The ID of the task you want to update.', + }, { displayName: 'Update Fields', name: 'updateFields', @@ -260,8 +282,8 @@ export const taskFields = [ { displayName: 'Default Hourly Rate', name: 'default_hourly_rate', - type: 'string', - default: '0', + type: 'number', + default: 0, description: 'The default hourly rate to use for this task when it is added to a project. Defaults to 0.', }, { diff --git a/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts b/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts index b4c40e8ce9..10bcca58fc 100644 --- a/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts +++ b/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts @@ -1,5 +1,11 @@ -import { INodeProperties } from 'n8n-workflow'; -export const resource = ['timeEntry']; +import { + INodeProperties, +} from 'n8n-workflow'; + +export const resource = [ + 'timeEntry', +]; + export const timeEntryOperations = [ { displayName: 'Operation', diff --git a/packages/nodes-base/nodes/Harvest/UserDescription.ts b/packages/nodes-base/nodes/Harvest/UserDescription.ts index 0254825b14..9e58123b34 100644 --- a/packages/nodes-base/nodes/Harvest/UserDescription.ts +++ b/packages/nodes-base/nodes/Harvest/UserDescription.ts @@ -1,6 +1,10 @@ -import { INodeProperties } from 'n8n-workflow'; +import { + INodeProperties, +} from 'n8n-workflow'; -const resource = ['user']; +const resource = [ + 'user', +]; export const userOperations = [ { @@ -54,7 +58,7 @@ export const userOperations = [ export const userFields = [ /* -------------------------------------------------------------------------- */ - /* user:getAll */ + /* user:getAll */ /* -------------------------------------------------------------------------- */ { @@ -137,7 +141,7 @@ export const userFields = [ }, /* -------------------------------------------------------------------------- */ - /* user:get */ + /* user:get */ /* -------------------------------------------------------------------------- */ { displayName: 'User Id', @@ -157,7 +161,7 @@ export const userFields = [ }, /* -------------------------------------------------------------------------- */ - /* user:delete */ + /* user:delete */ /* -------------------------------------------------------------------------- */ { displayName: 'User Id', @@ -177,7 +181,7 @@ export const userFields = [ }, /* -------------------------------------------------------------------------- */ - /* user:create */ + /* user:create */ /* -------------------------------------------------------------------------- */ { displayName: 'First Name', @@ -344,7 +348,7 @@ export const userFields = [ /* -------------------------------------------------------------------------- */ - /* user:update */ + /* user:update */ /* -------------------------------------------------------------------------- */ { displayName: 'Time Entry Id', From b406d4b60b4afd4f66b999a68c6006f1749d4920 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 2 Apr 2021 18:10:22 +0200 Subject: [PATCH 114/137] :zap: Fix display issue with AccountID before Operation & other small fixes --- .../nodes/Harvest/ClientDescription.ts | 16 ++-- .../nodes/Harvest/CompanyDescription.ts | 2 +- .../nodes/Harvest/ContactDescription.ts | 81 ++++++++++--------- .../nodes/Harvest/EstimateDescription.ts | 2 +- .../nodes/Harvest/ExpenseDescription.ts | 2 +- .../nodes-base/nodes/Harvest/Harvest.node.ts | 22 ++--- .../nodes/Harvest/InvoiceDescription.ts | 55 ++++++------- .../nodes/Harvest/ProjectDescription.ts | 3 +- .../nodes/Harvest/TaskDescription.ts | 15 ++-- .../nodes/Harvest/TimeEntryDescription.ts | 22 ++--- .../nodes/Harvest/UserDescription.ts | 31 ++++--- 11 files changed, 126 insertions(+), 125 deletions(-) diff --git a/packages/nodes-base/nodes/Harvest/ClientDescription.ts b/packages/nodes-base/nodes/Harvest/ClientDescription.ts index 61ae3f514e..fef5a88f93 100644 --- a/packages/nodes-base/nodes/Harvest/ClientDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ClientDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; @@ -199,13 +199,6 @@ export const clientFields = [ }, default: {}, options: [ - { - displayName: 'Is Active', - name: 'is_active', - type: 'string', - default: '', - description: 'Whether the client is active, or archived. Defaults to true.', - }, { displayName: 'Address', name: 'address', @@ -220,6 +213,13 @@ export const clientFields = [ default: '', description: 'The currency used by the estimate. If not provided, the client’s currency will be used. See a list of supported currencies', }, + { + displayName: 'Is Active', + name: 'is_active', + type: 'string', + default: '', + description: 'Whether the client is active, or archived. Defaults to true.', + }, ], }, diff --git a/packages/nodes-base/nodes/Harvest/CompanyDescription.ts b/packages/nodes-base/nodes/Harvest/CompanyDescription.ts index 34300dbf99..64948b0a15 100644 --- a/packages/nodes-base/nodes/Harvest/CompanyDescription.ts +++ b/packages/nodes-base/nodes/Harvest/CompanyDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; diff --git a/packages/nodes-base/nodes/Harvest/ContactDescription.ts b/packages/nodes-base/nodes/Harvest/ContactDescription.ts index 5c71f7092c..ac38607256 100644 --- a/packages/nodes-base/nodes/Harvest/ContactDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ContactDescription.ts @@ -214,20 +214,6 @@ export const contactFields = [ }, default: {}, options: [ - { - displayName: 'Last Name', - name: 'last_name', - type: 'string', - default: '', - description: 'The last name of the contact.', - }, - { - displayName: 'Title', - name: 'title', - type: 'string', - default: '', - description: 'The title of the contact.', - }, { displayName: 'Email', name: 'email', @@ -236,11 +222,18 @@ export const contactFields = [ description: 'The contact’s email address.', }, { - displayName: 'Phone Office', - name: 'phone_office', + displayName: 'Fax', + name: 'fax', type: 'string', default: '', - description: 'The contact’s office phone number.', + description: 'The contact’s fax number.', + }, + { + displayName: 'Last Name', + name: 'last_name', + type: 'string', + default: '', + description: 'The last name of the contact.', }, { displayName: 'Phone Mobile', @@ -250,11 +243,19 @@ export const contactFields = [ description: 'The contact’s mobile phone number.', }, { - displayName: 'Fax', - name: 'fax', + displayName: 'Phone Office', + name: 'phone_office', type: 'string', default: '', - description: 'The contact’s fax number.', + description: 'The contact’s office phone number.', + }, + + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'The title of the contact.', }, ], }, @@ -300,6 +301,20 @@ export const contactFields = [ default: '', description: 'The ID of the client associated with this contact.', }, + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + description: 'The contact’s email address.', + }, + { + displayName: 'Fax', + name: 'fax', + type: 'string', + default: '', + description: 'The contact’s fax number.', + }, { displayName: 'First Name', name: 'first_name', @@ -315,18 +330,11 @@ export const contactFields = [ description: 'The last name of the contact.', }, { - displayName: 'Title', - name: 'title', + displayName: 'Phone Mobile', + name: 'phone_mobile', type: 'string', default: '', - description: 'The title of the contact.', - }, - { - displayName: 'Email', - name: 'email', - type: 'string', - default: '', - description: 'The contact’s email address.', + description: 'The contact’s mobile phone number.', }, { displayName: 'Phone Office', @@ -336,18 +344,11 @@ export const contactFields = [ description: 'The contact’s office phone number.', }, { - displayName: 'Phone Mobile', - name: 'phone_mobile', + displayName: 'Title', + name: 'title', type: 'string', default: '', - description: 'The contact’s mobile phone number.', - }, - { - displayName: 'Fax', - name: 'fax', - type: 'string', - default: '', - description: 'The contact’s fax number.', + description: 'The title of the contact.', }, ], }, diff --git a/packages/nodes-base/nodes/Harvest/EstimateDescription.ts b/packages/nodes-base/nodes/Harvest/EstimateDescription.ts index a898738cba..dbf918ba1c 100644 --- a/packages/nodes-base/nodes/Harvest/EstimateDescription.ts +++ b/packages/nodes-base/nodes/Harvest/EstimateDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; diff --git a/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts b/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts index d9b21bec35..024fa25059 100644 --- a/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ExpenseDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; diff --git a/packages/nodes-base/nodes/Harvest/Harvest.node.ts b/packages/nodes-base/nodes/Harvest/Harvest.node.ts index 52f9a9b6cb..5874355607 100644 --- a/packages/nodes-base/nodes/Harvest/Harvest.node.ts +++ b/packages/nodes-base/nodes/Harvest/Harvest.node.ts @@ -175,17 +175,6 @@ export class Harvest implements INodeType { description: 'The resource to operate on.', }, - { - displayName: 'Account ID', - name: 'accountId', - type: 'options', - required: true, - typeOptions: { - loadOptionsMethod: 'getAccounts', - }, - default: '', - }, - // operations ...clientOperations, ...companyOperations, @@ -198,6 +187,17 @@ export class Harvest implements INodeType { ...timeEntryOperations, ...userOperations, + { + displayName: 'Account ID', + name: 'accountId', + type: 'options', + required: true, + typeOptions: { + loadOptionsMethod: 'getAccounts', + }, + default: '', + }, + // fields ...clientFields, ...contactFields, diff --git a/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts b/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts index 8d2822878d..263636b08d 100644 --- a/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts +++ b/packages/nodes-base/nodes/Harvest/InvoiceDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; @@ -114,20 +114,6 @@ export const invoiceFields = [ default: '', description: 'Only return time entries belonging to the client with the given ID.', }, - { - displayName: 'Project ID', - name: 'project_id', - type: 'string', - default: '', - description: 'Only return time entries belonging to the client with the given ID.', - }, - { - displayName: 'Updated Since', - name: 'updated_since', - type: 'dateTime', - default: '', - description: 'Only return time entries that have been updated since the given date and time.', - }, { displayName: 'From', name: 'from', @@ -136,11 +122,21 @@ export const invoiceFields = [ description: 'Only return time entries with a spent_date on or after the given date.', }, { - displayName: 'To', - name: 'to', - type: 'dateTime', + displayName: 'Page', + name: 'page', + type: 'number', + typeOptions: { + minValue: 1, + }, + default: 1, + description: 'The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)', + }, + { + displayName: 'Project ID', + name: 'project_id', + type: 'string', default: '', - description: 'Only return time entries with a spent_date on or before the given date.', + description: 'Only return time entries belonging to the client with the given ID.', }, { displayName: 'State', @@ -168,14 +164,19 @@ export const invoiceFields = [ description: 'Only return invoices with a state matching the value provided. Options: draft, open, paid, or closed.', }, { - displayName: 'Page', - name: 'page', - type: 'number', - typeOptions: { - minValue: 1, - }, - default: 1, - description: 'The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)', + displayName: 'To', + name: 'to', + type: 'dateTime', + default: '', + description: 'Only return time entries with a spent_date on or before the given date.', + }, + + { + displayName: 'Updated Since', + name: 'updated_since', + type: 'dateTime', + default: '', + description: 'Only return time entries that have been updated since the given date and time.', }, ], }, diff --git a/packages/nodes-base/nodes/Harvest/ProjectDescription.ts b/packages/nodes-base/nodes/Harvest/ProjectDescription.ts index 3f7a40dd08..067d94f111 100644 --- a/packages/nodes-base/nodes/Harvest/ProjectDescription.ts +++ b/packages/nodes-base/nodes/Harvest/ProjectDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; @@ -580,7 +580,6 @@ export const projectFields = [ default: false, description: 'Option to show project budget to all employees. Does not apply to Total Project Fee projects. Defaults to false.', }, - { displayName: 'Starts On', name: 'starts_on', diff --git a/packages/nodes-base/nodes/Harvest/TaskDescription.ts b/packages/nodes-base/nodes/Harvest/TaskDescription.ts index 90fc8d9c66..c5b89773b1 100644 --- a/packages/nodes-base/nodes/Harvest/TaskDescription.ts +++ b/packages/nodes-base/nodes/Harvest/TaskDescription.ts @@ -221,13 +221,6 @@ export const taskFields = [ default: 0, description: 'The default hourly rate to use for this task when it is added to a project. Defaults to 0.', }, - { - displayName: 'Is Default', - name: 'is_default', - type: 'boolean', - default: false, - description: 'Whether this task should be automatically added to future projects. Defaults to false.', - }, { displayName: 'Is Active', name: 'is_active', @@ -235,8 +228,16 @@ export const taskFields = [ default: true, description: 'Whether this task is active or archived. Defaults to true', }, + { + displayName: 'Is Default', + name: 'is_default', + type: 'boolean', + default: false, + description: 'Whether this task should be automatically added to future projects. Defaults to false.', + }, ], }, + /* -------------------------------------------------------------------------- */ /* task:update */ /* -------------------------------------------------------------------------- */ diff --git a/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts b/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts index 10bcca58fc..58ed292ace 100644 --- a/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts +++ b/packages/nodes-base/nodes/Harvest/TimeEntryDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; @@ -153,6 +153,16 @@ export const timeEntryFields = [ default: true, description: 'Pass true to only return running time entries and false to return non-running time entries.', }, + { + displayName: 'Page', + name: 'page', + type: 'number', + typeOptions: { + minValue: 1, + }, + default: 1, + description: 'The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)', + }, { displayName: 'To', name: 'to', @@ -167,16 +177,6 @@ export const timeEntryFields = [ default: '', description: 'Only return time entries that have been updated since the given date and time.', }, - { - displayName: 'Page', - name: 'page', - type: 'number', - typeOptions: { - minValue: 1, - }, - default: 1, - description: 'The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)', - }, { displayName: 'User ID', name: 'user_id', diff --git a/packages/nodes-base/nodes/Harvest/UserDescription.ts b/packages/nodes-base/nodes/Harvest/UserDescription.ts index 9e58123b34..d3e2640cf5 100644 --- a/packages/nodes-base/nodes/Harvest/UserDescription.ts +++ b/packages/nodes-base/nodes/Harvest/UserDescription.ts @@ -1,4 +1,4 @@ -import { +import { INodeProperties, } from 'n8n-workflow'; @@ -246,13 +246,6 @@ export const userFields = [ }, default: {}, options: [ - { - displayName: 'Can Create Projects', - name: 'can_create_projects', - type: 'boolean', - default: false, - description: 'Whether the user can create projects. Only applicable to Project Managers.', - }, { displayName: 'Can Create Invoices', name: 'can_create_invoices', @@ -260,6 +253,13 @@ export const userFields = [ default: false, description: 'Whether the user can create invoices. Only applicable to Project Managers.', }, + { + displayName: 'Can Create Projects', + name: 'can_create_projects', + type: 'boolean', + default: false, + description: 'Whether the user can create projects. Only applicable to Project Managers.', + }, { displayName: 'Can See Rates', name: 'can_see_rates', @@ -346,7 +346,6 @@ export const userFields = [ ], }, - /* -------------------------------------------------------------------------- */ /* user:update */ /* -------------------------------------------------------------------------- */ @@ -381,13 +380,6 @@ export const userFields = [ }, default: {}, options: [ - { - displayName: 'Can Create Projects', - name: 'can_create_projects', - type: 'boolean', - default: false, - description: 'Whether the user can create projects. Only applicable to Project Managers.', - }, { displayName: 'Can Create Invoices', name: 'can_create_invoices', @@ -395,6 +387,13 @@ export const userFields = [ default: false, description: 'Whether the user can create invoices. Only applicable to Project Managers.', }, + { + displayName: 'Can Create Projects', + name: 'can_create_projects', + type: 'boolean', + default: false, + description: 'Whether the user can create projects. Only applicable to Project Managers.', + }, { displayName: 'Can See Rates', name: 'can_see_rates', From 499fa48784c3fe30cc6fc7d8a857874ea1209a92 Mon Sep 17 00:00:00 2001 From: Agata M Date: Fri, 2 Apr 2021 18:14:39 +0200 Subject: [PATCH 115/137] :zap: Google Drive: Add support for creating folders & copying files for shared drives (#1436) * Google Drive: Add support for creating folders for shared drives * Google Drive: set supportAllDrives parameter to true * fix(GoogleDrive): added supportAllDrives parameter for copy files --- packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts index 01200aef01..8488bd4fb5 100644 --- a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts +++ b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts @@ -1996,7 +1996,11 @@ export class GoogleDrive implements INodeType { } } - const response = await googleApiRequest.call(this, 'POST', `/drive/v3/files/${fileId}/copy`, body); + const qs = { + supportsAllDrives: true + } + + const response = await googleApiRequest.call(this, 'POST', `/drive/v3/files/${fileId}/copy`, body, qs); returnData.push(response as IDataObject); @@ -2243,6 +2247,7 @@ export class GoogleDrive implements INodeType { const qs = { fields: queryFields, + supportsAllDrives: true, }; const response = await googleApiRequest.call(this, 'POST', '/drive/v3/files', body, qs); From bbf875cd080fa39680617e748bdb4e288815e32a Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 2 Apr 2021 18:18:43 +0200 Subject: [PATCH 116/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts index 8488bd4fb5..3e776a1fe7 100644 --- a/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts +++ b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts @@ -1997,8 +1997,8 @@ export class GoogleDrive implements INodeType { } const qs = { - supportsAllDrives: true - } + supportsAllDrives: true, + }; const response = await googleApiRequest.call(this, 'POST', `/drive/v3/files/${fileId}/copy`, body, qs); From 45c0d6598f5b71094b1228b83f3137b8221d397b Mon Sep 17 00:00:00 2001 From: Tanay Pant <7481165+tanay1337@users.noreply.github.com> Date: Fri, 2 Apr 2021 18:29:20 +0200 Subject: [PATCH 117/137] :sparkles: Add Oura node (#1609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Add Oura node * :hammer: Make it work * :zap: Improvements * :zap: Improvements * :art: Fix SVG size and position * :zap: Fix parameter error & other improvements Co-authored-by: Iván Ovejero Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../credentials/OuraApi.credentials.ts | 18 ++ .../nodes-base/nodes/Oura/GenericFunctions.ts | 63 +++++++ packages/nodes-base/nodes/Oura/Oura.node.ts | 178 ++++++++++++++++++ .../nodes/Oura/ProfileDescription.ts | 27 +++ .../nodes/Oura/SummaryDescription.ts | 105 +++++++++++ packages/nodes-base/nodes/Oura/oura.svg | 16 ++ packages/nodes-base/package.json | 2 + 7 files changed, 409 insertions(+) create mode 100644 packages/nodes-base/credentials/OuraApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Oura/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Oura/Oura.node.ts create mode 100644 packages/nodes-base/nodes/Oura/ProfileDescription.ts create mode 100644 packages/nodes-base/nodes/Oura/SummaryDescription.ts create mode 100644 packages/nodes-base/nodes/Oura/oura.svg diff --git a/packages/nodes-base/credentials/OuraApi.credentials.ts b/packages/nodes-base/credentials/OuraApi.credentials.ts new file mode 100644 index 0000000000..1f1ec00e3d --- /dev/null +++ b/packages/nodes-base/credentials/OuraApi.credentials.ts @@ -0,0 +1,18 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class OuraApi implements ICredentialType { + name = 'ouraApi'; + displayName = 'Oura API'; + documentationUrl = 'oura'; + properties = [ + { + displayName: 'Personal Access Token', + name: 'accessToken', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Oura/GenericFunctions.ts b/packages/nodes-base/nodes/Oura/GenericFunctions.ts new file mode 100644 index 0000000000..cd52b4bb4d --- /dev/null +++ b/packages/nodes-base/nodes/Oura/GenericFunctions.ts @@ -0,0 +1,63 @@ +import { + OptionsWithUri, +} from 'request'; + +import { + IExecuteFunctions, + IExecuteSingleFunctions, + IHookFunctions, + ILoadOptionsFunctions, +} from 'n8n-core'; + +import { + IDataObject, +} from 'n8n-workflow'; + +export async function ouraApiRequest( + this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, + method: string, + resource: string, + body: IDataObject = {}, + qs: IDataObject = {}, + uri?: string, + option: IDataObject = {}, +) { + + const credentials = this.getCredentials('ouraApi'); + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + let options: OptionsWithUri = { + headers: { + Authorization: `Bearer ${credentials.accessToken}`, + }, + method, + qs, + body, + uri: uri || `https://api.ouraring.com/v1${resource}`, + json: true, + }; + + if (!Object.keys(body).length) { + delete options.body; + } + + if (!Object.keys(qs).length) { + delete options.qs; + } + + options = Object.assign({}, options, option); + + try { + return await this.helpers.request!(options); + } catch (error) { + + const errorMessage = error?.response?.body?.message; + + if (errorMessage) { + throw new Error(`Oura error response [${error.statusCode}]: ${errorMessage}`); + } + + throw error; + } +} diff --git a/packages/nodes-base/nodes/Oura/Oura.node.ts b/packages/nodes-base/nodes/Oura/Oura.node.ts new file mode 100644 index 0000000000..58dfeb8890 --- /dev/null +++ b/packages/nodes-base/nodes/Oura/Oura.node.ts @@ -0,0 +1,178 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + INodeExecutionData, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + ouraApiRequest, +} from './GenericFunctions'; + +import { + profileOperations, +} from './ProfileDescription'; + +import { + summaryFields, + summaryOperations, +} from './SummaryDescription'; + +import * as moment from 'moment'; + +export class Oura implements INodeType { + description: INodeTypeDescription = { + displayName: 'Oura', + name: 'oura', + icon: 'file:oura.svg', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Oura API', + defaults: { + name: 'Oura', + color: '#2f4a73', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'ouraApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Profile', + value: 'profile', + }, + { + name: 'Summary', + value: 'summary', + }, + ], + default: 'summary', + description: 'Resource to consume.', + }, + ...profileOperations, + ...summaryOperations, + ...summaryFields, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const length = items.length; + + let responseData; + const returnData: IDataObject[] = []; + + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + + for (let i = 0; i < length; i++) { + + if (resource === 'profile') { + + // ********************************************************************* + // profile + // ********************************************************************* + + // https://cloud.ouraring.com/docs/personal-info + + if (operation === 'get') { + + // ---------------------------------- + // profile: get + // ---------------------------------- + + responseData = await ouraApiRequest.call(this, 'GET', '/userinfo'); + + } + + } else if (resource === 'summary') { + + // ********************************************************************* + // summary + // ********************************************************************* + + // https://cloud.ouraring.com/docs/daily-summaries + + const qs: IDataObject = {}; + + const { start, end } = this.getNodeParameter('filters', i) as { start: string; end: string; }; + + const returnAll = this.getNodeParameter('returnAll', 0) as boolean; + + if (start) { + qs.start = moment(start).format('YYYY-MM-DD'); + } + + if (end) { + qs.end = moment(end).format('YYYY-MM-DD'); + } + + if (operation === 'getActivity') { + + // ---------------------------------- + // profile: getActivity + // ---------------------------------- + + responseData = await ouraApiRequest.call(this, 'GET', '/activity', {}, qs); + responseData = responseData.activity; + + if (returnAll === false) { + const limit = this.getNodeParameter('limit', 0) as number; + responseData = responseData.splice(0, limit); + } + + } else if (operation === 'getReadiness') { + + // ---------------------------------- + // profile: getReadiness + // ---------------------------------- + + responseData = await ouraApiRequest.call(this, 'GET', '/readiness', {}, qs); + responseData = responseData.readiness; + + if (returnAll === false) { + const limit = this.getNodeParameter('limit', 0) as number; + responseData = responseData.splice(0, limit); + } + + } else if (operation === 'getSleep') { + + // ---------------------------------- + // profile: getSleep + // ---------------------------------- + + responseData = await ouraApiRequest.call(this, 'GET', '/sleep', {}, qs); + responseData = responseData.sleep; + + if (returnAll === false) { + const limit = this.getNodeParameter('limit', 0) as number; + responseData = responseData.splice(0, limit); + } + + } + + } + + Array.isArray(responseData) + ? returnData.push(...responseData) + : returnData.push(responseData); + + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Oura/ProfileDescription.ts b/packages/nodes-base/nodes/Oura/ProfileDescription.ts new file mode 100644 index 0000000000..b3e028c8a8 --- /dev/null +++ b/packages/nodes-base/nodes/Oura/ProfileDescription.ts @@ -0,0 +1,27 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const profileOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'profile', + ], + }, + }, + options: [ + { + name: 'Get', + value: 'get', + description: 'Get the user\'s personal information.', + }, + ], + default: 'get', + description: 'Operation to perform.', + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Oura/SummaryDescription.ts b/packages/nodes-base/nodes/Oura/SummaryDescription.ts new file mode 100644 index 0000000000..0512eb1e22 --- /dev/null +++ b/packages/nodes-base/nodes/Oura/SummaryDescription.ts @@ -0,0 +1,105 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const summaryOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'summary', + ], + }, + }, + options: [ + { + name: 'Get Activity Summary', + value: 'getActivity', + description: 'Get the user\'s activity summary.', + }, + { + name: 'Get Readiness Summary', + value: 'getReadiness', + description: 'Get the user\'s readiness summary.', + }, + { + name: 'Get Sleep Periods', + value: 'getSleep', + description: 'Get the user\'s sleep summary.', + }, + ], + default: 'getSleep', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const summaryFields = [ + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'summary', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'summary', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 10, + }, + default: 5, + description: 'How many results to return.', + }, + { + displayName: 'Filters', + name: 'filters', + type: 'collection', + placeholder: 'Add Filter', + displayOptions: { + show: { + resource: [ + 'summary', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'End Date', + name: 'end', + type: 'dateTime', + default: '', + description: 'End date for the summary retrieval. If omitted, it defaults to the current day.', + }, + { + displayName: 'Start Date', + name: 'start', + type: 'dateTime', + default: '', + description: 'Start date for the summary retrieval. If omitted, it defaults to a week ago.', + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Oura/oura.svg b/packages/nodes-base/nodes/Oura/oura.svg new file mode 100644 index 0000000000..4d4a1adc66 --- /dev/null +++ b/packages/nodes-base/nodes/Oura/oura.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index ffeea6b355..556d7cfc1b 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -169,6 +169,7 @@ "dist/credentials/OAuth2Api.credentials.js", "dist/credentials/OpenWeatherMapApi.credentials.js", "dist/credentials/OrbitApi.credentials.js", + "dist/credentials/OuraApi.credentials.js", "dist/credentials/PaddleApi.credentials.js", "dist/credentials/PagerDutyApi.credentials.js", "dist/credentials/PagerDutyOAuth2Api.credentials.js", @@ -436,6 +437,7 @@ "dist/nodes/OpenThesaurus/OpenThesaurus.node.js", "dist/nodes/OpenWeatherMap.node.js", "dist/nodes/Orbit/Orbit.node.js", + "dist/nodes/Oura/Oura.node.js", "dist/nodes/Paddle/Paddle.node.js", "dist/nodes/PagerDuty/PagerDuty.node.js", "dist/nodes/PayPal/PayPal.node.js", From dd6d523b85ed14ed200d91b02e7525e03652b36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Fri, 2 Apr 2021 19:12:19 +0200 Subject: [PATCH 118/137] :sparkles: Add Copper node (#1571) * :tada: Register regular node * :art: Replace PNG with SVG icon * :sparkles: Add Copper regular node * :zap: Add user and customer sources * :shirt: Appease linter * :zap: Handle listings in getAll operations * :zap: Implement continueOnFail * :zap: Simplify pagination * :hammer: Fix fields adjustments for person * zap: Improvements * :zap: Minor fixes * :zap: Fix Lead Email update & Minor improvements Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../nodes-base/nodes/Copper/Copper.node.ts | 704 ++++++++++++ .../nodes/Copper/CopperTrigger.node.ts | 4 +- .../nodes/Copper/GenericFunctions.ts | 169 ++- packages/nodes-base/nodes/Copper/copper.png | Bin 2145 -> 0 bytes packages/nodes-base/nodes/Copper/copper.svg | 25 + .../Copper/descriptions/CompanyDescription.ts | 289 +++++ .../descriptions/CustomerSourceDescription.ts | 73 ++ .../Copper/descriptions/LeadDescription.ts | 274 +++++ .../descriptions/OpportunityDescription.ts | 284 +++++ .../Copper/descriptions/PersonDescription.ts | 286 +++++ .../Copper/descriptions/ProjectDescription.ts | 308 +++++ .../Copper/descriptions/TaskDescription.ts | 346 ++++++ .../Copper/descriptions/UserDescription.ts | 73 ++ .../nodes/Copper/descriptions/index.ts | 8 + .../nodes/Copper/utils/isoCountryCodes.ts | 1000 +++++++++++++++++ .../nodes/Copper/utils/sharedFields.ts | 140 +++ .../nodes-base/nodes/Copper/utils/types.d.ts | 23 + packages/nodes-base/package.json | 1 + 18 files changed, 3995 insertions(+), 12 deletions(-) create mode 100644 packages/nodes-base/nodes/Copper/Copper.node.ts delete mode 100644 packages/nodes-base/nodes/Copper/copper.png create mode 100644 packages/nodes-base/nodes/Copper/copper.svg create mode 100644 packages/nodes-base/nodes/Copper/descriptions/CompanyDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/CustomerSourceDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/LeadDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/OpportunityDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/PersonDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/ProjectDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/TaskDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/UserDescription.ts create mode 100644 packages/nodes-base/nodes/Copper/descriptions/index.ts create mode 100644 packages/nodes-base/nodes/Copper/utils/isoCountryCodes.ts create mode 100644 packages/nodes-base/nodes/Copper/utils/sharedFields.ts create mode 100644 packages/nodes-base/nodes/Copper/utils/types.d.ts diff --git a/packages/nodes-base/nodes/Copper/Copper.node.ts b/packages/nodes-base/nodes/Copper/Copper.node.ts new file mode 100644 index 0000000000..b0361dcd0c --- /dev/null +++ b/packages/nodes-base/nodes/Copper/Copper.node.ts @@ -0,0 +1,704 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + INodeExecutionData, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + adjustCompanyFields, + adjustLeadFields, + adjustPersonFields, + adjustTaskFields, + copperApiRequest, + handleListing, +} from './GenericFunctions'; + +import { + companyFields, + companyOperations, + customerSourceFields, + customerSourceOperations, + leadFields, + leadOperations, + opportunityFields, + opportunityOperations, + personFields, + personOperations, + projectFields, + projectOperations, + taskFields, + taskOperations, + userFields, + userOperations, +} from './descriptions'; + +export class Copper implements INodeType { + description: INodeTypeDescription = { + displayName: 'Copper', + name: 'copper', + icon: 'file:copper.svg', + group: ['transform'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume the Copper API', + defaults: { + name: 'Copper', + color: '#ff2564', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'copperApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Company', + value: 'company', + }, + { + name: 'Customer Source', + value: 'customerSource', + }, + { + name: 'Lead', + value: 'lead', + }, + { + name: 'Opportunity', + value: 'opportunity', + }, + { + name: 'Person', + value: 'person', + }, + { + name: 'Project', + value: 'project', + }, + { + name: 'Task', + value: 'task', + }, + { + name: 'User', + value: 'user', + }, + ], + default: 'company', + description: 'Resource to consume', + }, + ...companyOperations, + ...companyFields, + ...customerSourceOperations, + ...customerSourceFields, + ...leadOperations, + ...leadFields, + ...opportunityOperations, + ...opportunityFields, + ...personOperations, + ...personFields, + ...projectOperations, + ...projectFields, + ...taskOperations, + ...taskFields, + ...userOperations, + ...userFields, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + + let responseData; + + for (let i = 0; i < items.length; i++) { + + try { + + if (resource === 'company') { + + // ********************************************************************** + // company + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // company: create + // ---------------------------------------- + + // https://developer.copper.com/companies/create-a-new-company.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + }; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, adjustCompanyFields(additionalFields)); + } + + responseData = await copperApiRequest.call(this, 'POST', '/companies', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // company: delete + // ---------------------------------------- + + // https://developer.copper.com/companies/delete-a-company.html + + const companyId = this.getNodeParameter('companyId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/companies/${companyId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // company: get + // ---------------------------------------- + + // https://developer.copper.com/companies/fetch-a-company-by-id.html + + const companyId = this.getNodeParameter('companyId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/companies/${companyId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // company: getAll + // ---------------------------------------- + + // https://developer.copper.com/companies/list-companies-search.html + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, filterFields); + } + + responseData = await handleListing.call(this, 'POST', '/companies/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // company: update + // ---------------------------------------- + + // https://developer.copper.com/companies/update-a-company.html + + const companyId = this.getNodeParameter('companyId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, adjustCompanyFields(updateFields)); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/companies/${companyId}`, body); + + } + + } else if (resource === 'customerSource') { + + // ********************************************************************** + // customerSource + // ********************************************************************** + + if (operation === 'getAll') { + + // ---------------------------------------- + // customerSource: getAll + // ---------------------------------------- + + responseData = await handleListing.call(this, 'GET', '/customer_sources'); + + } + + } else if (resource === 'lead') { + + // ********************************************************************** + // lead + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // lead: create + // ---------------------------------------- + + // https://developer.copper.com/leads/create-a-new-lead.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + }; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, adjustLeadFields(additionalFields)); + } + + responseData = await copperApiRequest.call(this, 'POST', '/leads', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // lead: delete + // ---------------------------------------- + + // https://developer.copper.com/leads/delete-a-lead.html + + const leadId = this.getNodeParameter('leadId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/leads/${leadId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // lead: get + // ---------------------------------------- + + // https://developer.copper.com/leads/fetch-a-lead-by-id.html + + const leadId = this.getNodeParameter('leadId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/leads/${leadId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // lead: getAll + // ---------------------------------------- + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, filterFields); + } + + responseData = await handleListing.call(this, 'POST', '/leads/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // lead: update + // ---------------------------------------- + + // https://developer.copper.com/leads/update-a-lead.html + + const leadId = this.getNodeParameter('leadId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, adjustLeadFields(updateFields)); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/leads/${leadId}`, body); + + } + + } else if (resource === 'opportunity') { + + // ********************************************************************** + // opportunity + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // opportunity: create + // ---------------------------------------- + + // https://developer.copper.com/opportunities/create-a-new-opportunity.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + customer_source_id: this.getNodeParameter('customerSourceId', i), + primary_contact_id: this.getNodeParameter('primaryContactId', i), + }; + + responseData = await copperApiRequest.call(this, 'POST', '/opportunities', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // opportunity: delete + // ---------------------------------------- + + // https://developer.copper.com/opportunities/delete-an-opportunity.html + + const opportunityId = this.getNodeParameter('opportunityId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/opportunities/${opportunityId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // opportunity: get + // ---------------------------------------- + + // https://developer.copper.com/opportunities/fetch-an-opportunity-by-id.html + + const opportunityId = this.getNodeParameter('opportunityId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/opportunities/${opportunityId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // opportunity: getAll + // ---------------------------------------- + + // https://developer.copper.com/opportunities/list-opportunities-search.html + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, filterFields); + } + + responseData = await handleListing.call(this, 'POST', '/opportunities/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // opportunity: update + // ---------------------------------------- + + // https://developer.copper.com/opportunities/update-an-opportunity.html + + const opportunityId = this.getNodeParameter('opportunityId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, updateFields); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/opportunities/${opportunityId}`, body); + + } + + } else if (resource === 'person') { + + // ********************************************************************** + // person + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // person: create + // ---------------------------------------- + + // https://developer.copper.com/people/create-a-new-person.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + }; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, adjustPersonFields(additionalFields)); + } + + responseData = await copperApiRequest.call(this, 'POST', '/people', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // person: delete + // ---------------------------------------- + + // https://developer.copper.com/people/delete-a-person.html + + const personId = this.getNodeParameter('personId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/people/${personId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // person: get + // ---------------------------------------- + + // https://developer.copper.com/people/fetch-a-person-by-id.html + + const personId = this.getNodeParameter('personId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/people/${personId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // person: getAll + // ---------------------------------------- + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, filterFields); + } + + responseData = await handleListing.call(this, 'POST', '/people/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // person: update + // ---------------------------------------- + + // https://developer.copper.com/people/update-a-person.html + + const personId = this.getNodeParameter('personId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, adjustPersonFields(updateFields)); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/people/${personId}`, body); + + } + + } else if (resource === 'project') { + + // ********************************************************************** + // project + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // project: create + // ---------------------------------------- + + // https://developer.copper.com/projects/create-a-new-project.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + }; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, additionalFields); + } + + responseData = await copperApiRequest.call(this, 'POST', '/projects', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // project: delete + // ---------------------------------------- + + // https://developer.copper.com/projects/delete-a-project.html + + const projectId = this.getNodeParameter('projectId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/projects/${projectId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // project: get + // ---------------------------------------- + + // https://developer.copper.com/projects/fetch-a-project-by-id.html + + const projectId = this.getNodeParameter('projectId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/projects/${projectId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // project: getAll + // ---------------------------------------- + + // https://developer.copper.com/projects/list-projects-search.html + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, filterFields); + } + + responseData = await handleListing.call(this, 'POST', '/projects/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // project: update + // ---------------------------------------- + + // https://developer.copper.com/projects/update-a-project.html + + const projectId = this.getNodeParameter('projectId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, updateFields); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/projects/${projectId}`, body); + + } + + } else if (resource === 'task') { + + // ********************************************************************** + // task + // ********************************************************************** + + if (operation === 'create') { + + // ---------------------------------------- + // task: create + // ---------------------------------------- + + // https://developer.copper.com/tasks/create-a-new-task.html + + const body: IDataObject = { + name: this.getNodeParameter('name', i), + }; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + + if (Object.keys(additionalFields).length) { + Object.assign(body, additionalFields); + } + + responseData = await copperApiRequest.call(this, 'POST', '/tasks', body); + + } else if (operation === 'delete') { + + // ---------------------------------------- + // task: delete + // ---------------------------------------- + + // https://developer.copper.com/tasks/delete-a-task.html + + const taskId = this.getNodeParameter('taskId', i); + + responseData = await copperApiRequest.call(this, 'DELETE', `/tasks/${taskId}`); + + } else if (operation === 'get') { + + // ---------------------------------------- + // task: get + // ---------------------------------------- + + // https://developer.copper.com/tasks/fetch-a-task-by-id.html + + const taskId = this.getNodeParameter('taskId', i); + + responseData = await copperApiRequest.call(this, 'GET', `/tasks/${taskId}`); + + } else if (operation === 'getAll') { + + // ---------------------------------------- + // task: getAll + // ---------------------------------------- + + // https://developer.copper.com/tasks/list-tasks-search.html + + const body: IDataObject = {}; + const filterFields = this.getNodeParameter('filterFields', i) as IDataObject; + + if (Object.keys(filterFields).length) { + Object.assign(body, adjustTaskFields(filterFields)); + } + + responseData = await handleListing.call(this, 'POST', '/tasks/search', body); + + } else if (operation === 'update') { + + // ---------------------------------------- + // task: update + // ---------------------------------------- + + // https://developer.copper.com/tasks/update-a-task.html + + const taskId = this.getNodeParameter('taskId', i); + + const body: IDataObject = {}; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + + if (Object.keys(updateFields).length) { + Object.assign(body, updateFields); + } + + responseData = await copperApiRequest.call(this, 'PUT', `/tasks/${taskId}`, body); + } + + } else if (resource === 'user') { + + // ********************************************************************** + // user + // ********************************************************************** + + if (operation === 'getAll') { + + // ---------------------------------------- + // user: getAll + // ---------------------------------------- + + responseData = await handleListing.call(this, 'POST', '/users/search'); + + } + } + + } catch (error) { + if (this.continueOnFail()) { + returnData.push({ error: error.toString() }); + continue; + } + + throw error; + } + + Array.isArray(responseData) + ? returnData.push(...responseData) + : returnData.push(responseData); + + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Copper/CopperTrigger.node.ts b/packages/nodes-base/nodes/Copper/CopperTrigger.node.ts index 36ab84d6da..cfaf575f38 100644 --- a/packages/nodes-base/nodes/Copper/CopperTrigger.node.ts +++ b/packages/nodes-base/nodes/Copper/CopperTrigger.node.ts @@ -19,7 +19,7 @@ export class CopperTrigger implements INodeType { description: INodeTypeDescription = { displayName: 'Copper Trigger', name: 'copperTrigger', - icon: 'file:copper.png', + icon: 'file:copper.svg', group: ['trigger'], version: 1, description: 'Handle Copper events via webhooks', @@ -147,7 +147,7 @@ export class CopperTrigger implements INodeType { const endpoint = `/webhooks/${webhookData.webhookId}`; try { await copperApiRequest.call(this, 'DELETE', endpoint); - } catch(error) { + } catch (error) { return false; } delete webhookData.webhookId; diff --git a/packages/nodes-base/nodes/Copper/GenericFunctions.ts b/packages/nodes-base/nodes/Copper/GenericFunctions.ts index 9fc46f9d96..2fbf4f315d 100644 --- a/packages/nodes-base/nodes/Copper/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Copper/GenericFunctions.ts @@ -1,5 +1,10 @@ -import { createHash } from 'crypto'; -import { OptionsWithUri } from 'request'; +import { + createHash, +} from 'crypto'; + +import { + OptionsWithUri, +} from 'request'; import { IExecuteFunctions, @@ -8,16 +13,37 @@ import { ILoadOptionsFunctions, IWebhookFunctions, } from 'n8n-core'; + import { ICredentialDataDecryptedObject, IDataObject, } from 'n8n-workflow'; -export async function copperApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions | IWebhookFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise { // tslint:disable-line:no-any - const credentials = this.getCredentials('copperApi'); - if (credentials === undefined) { - throw new Error('No credentials got returned!'); - } +import { + flow, + omit, +} from 'lodash'; + +import { + AddressFixedCollection, + EmailFixedCollection, + EmailsFixedCollection, + PhoneNumbersFixedCollection, +} from './utils/types'; + +/** + * Make an authenticated API request to Copper. + */ +export async function copperApiRequest( + this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions | IWebhookFunctions, + method: string, + resource: string, + body: IDataObject = {}, + qs: IDataObject = {}, + uri = '', + option: IDataObject = {}, +) { + const credentials = this.getCredentials('copperApi') as { apiKey: string, email: string }; let options: OptionsWithUri = { headers: { @@ -29,10 +55,16 @@ export async function copperApiRequest(this: IHookFunctions | IExecuteFunctions method, qs, body, - uri: uri ||`https://api.prosperworks.com/developer_api/v1${resource}`, + uri: uri || `https://api.prosperworks.com/developer_api/v1${resource}`, json: true, }; + options = Object.assign({}, options, option); + + if (!Object.keys(qs).length) { + delete options.qs; + } + if (Object.keys(options.body).length === 0) { delete options.body; } @@ -41,11 +73,11 @@ export async function copperApiRequest(this: IHookFunctions | IExecuteFunctions return await this.helpers.request!(options); } catch (error) { let errorMessage = error.message; - if (error.response.body && error.response.body.message) { + if (error.response.body?.message) { errorMessage = error.response.body.message; } - throw new Error('Copper Error: ' + errorMessage); + throw new Error(`Copper error response [${error.statusCode}]: ${errorMessage}`); } } @@ -61,3 +93,120 @@ export function getAutomaticSecret(credentials: ICredentialDataDecryptedObject) const data = `${credentials.email},${credentials.apiKey}`; return createHash('md5').update(data).digest('hex'); } + +export function adjustAddress(fixedCollection: AddressFixedCollection) { + if (!fixedCollection.address) return fixedCollection; + + const adjusted: { address?: object } = omit(fixedCollection, ['address']); + + if (fixedCollection.address) { + adjusted.address = fixedCollection.address.addressFields; + } + + return adjusted; +} + +export function adjustPhoneNumbers(fixedCollection: PhoneNumbersFixedCollection) { + if (!fixedCollection.phone_numbers) return fixedCollection; + + const adjusted: { phone_numbers?: object } = omit(fixedCollection, ['phone_numbers']); + + if (fixedCollection.phone_numbers) { + adjusted.phone_numbers = fixedCollection.phone_numbers.phoneFields; + } + + return adjusted; +} + +export function adjustEmails(fixedCollection: EmailsFixedCollection) { + if (!fixedCollection.emails) return fixedCollection; + + const adjusted: { emails?: object } = omit(fixedCollection, ['emails']); + + if (fixedCollection.emails) { + adjusted.emails = fixedCollection.emails.emailFields; + } + + return adjusted; +} + +export function adjustProjectIds(fields: { project_ids?: string }) { + if (!fields.project_ids) return fields; + + const adjusted: { project_ids?: string[] } = omit(fields, ['project_ids']); + + adjusted.project_ids = fields.project_ids.includes(',') + ? fields.project_ids.split(',') + : [fields.project_ids]; + + return adjusted; +} + +export function adjustEmail(fixedCollection: EmailFixedCollection) { + if (!fixedCollection.email) return fixedCollection; + + const adjusted: { email?: object } = omit(fixedCollection, ['email']); + + if (fixedCollection.email) { + adjusted.email = fixedCollection.email.emailFields; + } + + return adjusted; +} + +export const adjustCompanyFields = flow(adjustAddress, adjustPhoneNumbers); +export const adjustLeadFields = flow(adjustCompanyFields, adjustEmail); +export const adjustPersonFields = flow(adjustCompanyFields, adjustEmails); +export const adjustTaskFields = flow(adjustLeadFields, adjustProjectIds); + +/** + * Handle a Copper listing by returning all items or up to a limit. + */ +export async function handleListing( + this: IExecuteFunctions, + method: string, + endpoint: string, + qs: IDataObject = {}, + body: IDataObject = {}, + uri = '', +) { + let responseData; + + const returnAll = this.getNodeParameter('returnAll', 0); + + const option = { resolveWithFullResponse: true }; + + if (returnAll) { + return await copperApiRequestAllItems.call(this, method, endpoint, body, qs, uri, option); + } + + const limit = this.getNodeParameter('limit', 0) as number; + responseData = await copperApiRequestAllItems.call(this, method, endpoint, body, qs, uri, option); + return responseData.slice(0, limit); +} + +/** + * Make an authenticated API request to Copper and return all items. + */ +export async function copperApiRequestAllItems( + this: IHookFunctions | ILoadOptionsFunctions | IExecuteFunctions, + method: string, + resource: string, + body: IDataObject = {}, + qs: IDataObject = {}, + uri = '', + option: IDataObject = {}, +) { + let responseData; + qs.page_size = 200; + let totalItems = 0; + const returnData: IDataObject[] = []; + + do { + responseData = await copperApiRequest.call(this, method, resource, body, qs, uri, option); + totalItems = responseData.headers['x-pw-total']; + returnData.push(...responseData.body); + } while (totalItems > returnData.length); + + return returnData; +} diff --git a/packages/nodes-base/nodes/Copper/copper.png b/packages/nodes-base/nodes/Copper/copper.png deleted file mode 100644 index 0ef15b8c66610dee3d45ee5317e1177bcd319fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145 zcmW-ic|6oz7r;kkSG?)T_DGiOWtkz7B?iOT*X-L^vW=x^Dr<Y`^o2zMpeH_uPB#Ip^MU|2Xl+hB|D_Jj^H*iVdf$WlEh@4hJLc;f|oV zItoQIVT?D&QkNj_3bKYE?*=+ihdNa-Zcsl6oqZtX3}`pN5a5D4h}(cH)#?VrQwYWd zLUKWm2+E!ikpbubcu`L(5dK7PgQ_M_atDkD>;p7+?>a>T6{=Oj5s2}K4GAQiASx3` zDUeeRSU*trK6K0|g*(}ZQy7HaM~Z5Y`vnN`E@*fo_&_B03E~@vl+=M!I7DVadI>yl z1Dl(0*_V1HB)JHQ&ja+I?8F4n@&k-3Qc@2oC6G`6Yn%J^?R)w`Ff@e>O&mUfikvGP z9KaPdxC3CkLEIc9TtU(qSl0`0A)X9;sXqhK|sP`#l(yt{~4qdL2M4<6NA{@gmbR2zKJX? zBOg8@@28-p8+q~q9+W~@8vOVP!2SD(V3v;1)_2iI9j0ot4Xk_p&9Ccc9(8%XOE6{Z^&eS zZ+E~*;Ml>z{w}4pp*A)OFCidsf_;B~XXiJCGEZe_Xz1MlmHyV&hKAajVk)s=VPOOU z!ORdZDJei8h)kLhP^hC6oR)^UZf{H$gXXv~d&CKs3OP6ul|Zkg5OLYi$JRSM&y{aRU@-#u9d>;>R3u^TEpsoGs-=?$`gMPviXZazt4H+6B=12MW4oy@yx5lOSImpQo;+jOG;FtBD}CyxB|k;lpNpI~ zeQIPa!1L{QRURF8?zX6PhAJV8V7BQ%)|nmw!)x~uIZ`y!&x_{=A5LGYyn~!ns+4H- z(z|MHxs*RT#hrnnUrcn#9IemS^E@f^<65VoXKF?z>05LUC8CK&?Jl#_5K&k%zMBYf z1r^^5>PG*`K|bl?Erqij97CC$&00ndXcl-g^U?Hr_Qhhuw?4d(nUhYiFI|i`pD9)B zZ48be(=Al96coBC%kA;^8Iyk1IM3yNkdDfTJ(2iV|!y0)ptvI=6gZjkL7{`Y=AP-4eD)i|R)4M}EAi zSrl__r|O>Asy$77NUMoY!`vue`I*>;WH-iN2TVCnCElKzu>G!ml(kq*X-u*VTdYK< z`oD(lbNf$=O)pqw`7$(#f9J_ek9HB$`uR#nnD1_`L~wj4>o2oKe9V)}1H*yyZ)YP| zp4G{^)2Wo4p~X7u=6o)xY;C6v9MVtgt=0YX(k8njH7r;ofvl|Vwm9wX$8ZOK6w4R9 zq=-6SmtSDiEV7X6wK8jGT_^uo-&q8c=u#FRk@ENEmFdFPP~$TkBdNi%*}o4g@o~he z^f{d#|3}M>^r7WVf@GA^h7N<}JE^DB0{924?$)zDe4pnFLG=Kf)!udw(|y!j0Z03_?s%1jS%{{nboaVx%Kw5 z{tv&-26yJ*@W$DeA(L=Qn&`d5i?Pu1|NHCMl?l>p7GFbB@8F=A(3L5kRTwQheUL$hdzB_8$*nXE?Somnoqj|iEYfyga4OJF z6m4c|&aH)gmd50g+-RKHrpnJS$K|1tCc$}2wQ-IqdsN!MBvRB%i1&oTTb9uu(uoAL zo3wz;0L%C#ypDh1q}0%?=9$$WIERir+WwVs-qTJ!1kWd#|C0EKCAL^WbhUr@F&oM7 z!nMljYYt00Ju)LKY1Px~bPp!gl6V@A76j}T8 zJDF%b7aVfx;j(4#=%k{;n&-2{foPv9|GCjxjvEb}2Mm@;nT + + + + + + + diff --git a/packages/nodes-base/nodes/Copper/descriptions/CompanyDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/CompanyDescription.ts new file mode 100644 index 0000000000..99f1c6df73 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/CompanyDescription.ts @@ -0,0 +1,289 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +import { + isoCountryCodes, +} from '../utils/isoCountryCodes'; + +import { + addressFixedCollection, + phoneNumbersFixedCollection, +} from '../utils/sharedFields'; + +export const companyOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'company', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const companyFields = [ + // ---------------------------------------- + // company: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + description: 'Name of the company to create.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + addressFixedCollection, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description of the company to create.', + }, + { + displayName: 'Email Domain', + name: 'email_domain', + type: 'string', + default: '', + }, + phoneNumbersFixedCollection, + ], + }, + + // ---------------------------------------- + // company: delete + // ---------------------------------------- + { + displayName: 'Company ID', + name: 'companyId', + description: 'ID of the company to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // company: get + // ---------------------------------------- + { + displayName: 'Company ID', + name: 'companyId', + description: 'ID of the company to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // company: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Country', + name: 'country', + type: 'options', + options: isoCountryCodes.map(({ name, alpha2 }) => ({ name, value: alpha2 })), + default: '', + description: 'Country of the company to filter by.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the company to filter by.', + }, + ], + }, + + // ---------------------------------------- + // company: update + // ---------------------------------------- + { + displayName: 'Company ID', + name: 'companyId', + description: 'ID of the company to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'company', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + addressFixedCollection, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the company.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the company.', + }, + phoneNumbersFixedCollection, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/CustomerSourceDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/CustomerSourceDescription.ts new file mode 100644 index 0000000000..d9d706beba --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/CustomerSourceDescription.ts @@ -0,0 +1,73 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const customerSourceOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'customerSource', + ], + }, + }, + options: [ + { + name: 'Get All', + value: 'getAll', + }, + ], + default: 'getAll', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const customerSourceFields = [ + // ---------------------------------------- + // customerSource: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'customerSource', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'customerSource', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/LeadDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/LeadDescription.ts new file mode 100644 index 0000000000..be2b567d59 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/LeadDescription.ts @@ -0,0 +1,274 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +import { + addressFixedCollection, + emailFixedCollection, + phoneNumbersFixedCollection, +} from '../utils/sharedFields'; + +export const leadOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'lead', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const leadFields = [ + // ---------------------------------------- + // lead: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + description: 'Name of the lead to create.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + default: {}, + placeholder: 'Add Field', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + addressFixedCollection, + emailFixedCollection, + phoneNumbersFixedCollection, + ], + }, + + // ---------------------------------------- + // lead: delete + // ---------------------------------------- + { + displayName: 'Lead ID', + name: 'leadId', + description: 'ID of the lead to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // lead: get + // ---------------------------------------- + { + displayName: 'Lead ID', + name: 'leadId', + description: 'ID of the lead to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // lead: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Country', + name: 'country', + type: 'string', + default: '', + description: 'Name of the country to filter by.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the lead to filter by.', + }, + ], + }, + + // ---------------------------------------- + // lead: update + // ---------------------------------------- + { + displayName: 'Lead ID', + name: 'leadId', + description: 'ID of the lead to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + addressFixedCollection, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the lead.', + }, + emailFixedCollection, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the lead.', + }, + phoneNumbersFixedCollection, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/OpportunityDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/OpportunityDescription.ts new file mode 100644 index 0000000000..0117672e05 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/OpportunityDescription.ts @@ -0,0 +1,284 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const opportunityOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const opportunityFields = [ + // ---------------------------------------- + // opportunity: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + description: 'Name of the opportunity to create.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Customer Source ID', + name: 'customerSourceId', + type: 'string', + default: '', + description: 'ID of the customer source that generated this opportunity.', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Primary Contact ID', + name: 'primaryContactId', + type: 'string', + default: '', + description: 'ID of the primary company associated with this opportunity.', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'create', + ], + }, + }, + }, + + // ---------------------------------------- + // opportunity: delete + // ---------------------------------------- + { + displayName: 'Opportunity ID', + name: 'opportunityId', + description: 'ID of the opportunity to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // opportunity: get + // ---------------------------------------- + { + displayName: 'Opportunity ID', + name: 'opportunityId', + description: 'ID of the opportunity to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // opportunity: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Company IDs', + name: 'company_ids', + type: 'string', + default: '', + description: 'Comma-separated IDs of the primary companies to filter by.', + }, + { + displayName: 'Customer Source IDs', + name: 'customer_source_ids', + type: 'string', + default: '', + description: 'Comma-separated IDs of the customer sources to filter by.', + }, + ], + }, + + // ---------------------------------------- + // opportunity: update + // ---------------------------------------- + { + displayName: 'Opportunity ID', + name: 'opportunityId', + description: 'ID of the opportunity to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'opportunity', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + { + displayName: 'Customer Source ID', + name: 'customer_source_id', + type: 'string', + default: '', + description: 'ID of the primary company associated with this opportunity.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the opportunity.', + }, + { + displayName: 'Primary Contact ID', + name: 'primary_contact_id', + type: 'string', + default: '', + description: 'ID of the customer source that generated this opportunity.', + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/PersonDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/PersonDescription.ts new file mode 100644 index 0000000000..7ffa3b4da3 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/PersonDescription.ts @@ -0,0 +1,286 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +import { + addressFixedCollection, + emailsFixedCollection, + phoneNumbersFixedCollection, +} from '../utils/sharedFields'; + +export const personOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'person', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const personFields = [ + // ---------------------------------------- + // person: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + description: 'Name of the person to create.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + addressFixedCollection, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the person.', + }, + { + displayName: 'Email Domain', + name: 'email_domain', + type: 'string', + default: '', + }, + emailsFixedCollection, + phoneNumbersFixedCollection, + ], + }, + + // ---------------------------------------- + // person: delete + // ---------------------------------------- + { + displayName: 'Person ID', + name: 'personId', + description: 'ID of the person to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // person: get + // ---------------------------------------- + { + displayName: 'Person ID', + name: 'personId', + description: 'ID of the person to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // person: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the person to filter by.', + }, + ], + }, + + // ---------------------------------------- + // person: update + // ---------------------------------------- + { + displayName: 'Person ID', + name: 'personId', + description: 'ID of the person to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'person', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + addressFixedCollection, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the person.', + }, + { + displayName: 'Email Domain', + name: 'email_domain', + type: 'string', + default: '', + }, + emailsFixedCollection, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the person.', + }, + phoneNumbersFixedCollection, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/ProjectDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/ProjectDescription.ts new file mode 100644 index 0000000000..0a07010aee --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/ProjectDescription.ts @@ -0,0 +1,308 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const projectOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'project', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const projectFields = [ + // ---------------------------------------- + // project: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + description: 'Name of the project to create.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Assignee ID', + name: 'assignee_id', + type: 'string', + default: '', + description: 'ID of the user who will own the project to create.', + }, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description of the project to create.', + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + default: 'Open', + options: [ + { + name: 'Completed', + value: 'Completed', + }, + { + name: 'Open', + value: 'Open', + }, + ], + }, + ], + }, + + // ---------------------------------------- + // project: delete + // ---------------------------------------- + { + displayName: 'Project ID', + name: 'projectId', + description: 'ID of the project to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // project: get + // ---------------------------------------- + { + displayName: 'Project ID', + name: 'projectId', + description: 'ID of the project to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // project: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + default: {}, + placeholder: 'Add Filter', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the project to filter by.', + }, + ], + }, + + // ---------------------------------------- + // project: update + // ---------------------------------------- + { + displayName: 'Project ID', + name: 'projectId', + description: 'ID of the project to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'project', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + { + displayName: 'Assignee ID', + name: 'assignee_id', + type: 'string', + default: '', + description: 'ID of the user who will own the project.', + }, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the project.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the project.', + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + default: 'Open', + options: [ + { + name: 'Completed', + value: 'Completed', + }, + { + name: 'Open', + value: 'Open', + }, + ], + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/TaskDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/TaskDescription.ts new file mode 100644 index 0000000000..39af835c08 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/TaskDescription.ts @@ -0,0 +1,346 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const taskOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'task', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + }, + { + name: 'Delete', + value: 'delete', + }, + { + name: 'Get', + value: 'get', + }, + { + name: 'Get All', + value: 'getAll', + }, + { + name: 'Update', + value: 'update', + }, + ], + default: 'create', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const taskFields = [ + // ---------------------------------------- + // task: create + // ---------------------------------------- + { + displayName: 'Name', + name: 'name', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Assignee ID', + name: 'assignee_id', + type: 'string', + default: '', + description: 'ID of the user who will own the task to create.', + }, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description of the task to create.', + }, + { + displayName: 'Priority', + name: 'priority', + type: 'options', + default: 'High', + options: [ + { + name: 'High', + value: 'High', + }, + { + name: 'None', + value: 'None', + }, + ], + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + default: 'Open', + options: [ + { + name: 'Completed', + value: 'Completed', + }, + { + name: 'Open', + value: 'Open', + }, + ], + }, + ], + }, + + // ---------------------------------------- + // task: delete + // ---------------------------------------- + { + displayName: 'Task ID', + name: 'taskId', + description: 'ID of the task to delete.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'delete', + ], + }, + }, + }, + + // ---------------------------------------- + // task: get + // ---------------------------------------- + { + displayName: 'Task ID', + name: 'taskId', + description: 'ID of the task to retrieve.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'get', + ], + }, + }, + }, + + // ---------------------------------------- + // task: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Filters', + name: 'filterFields', + type: 'collection', + placeholder: 'Add Filter', + default: {}, + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Assignee IDs', + name: 'assignee_ids', + type: 'string', + default: '', + description: 'Comma-separated IDs of assignee IDs to filter by.', + }, + { + displayName: 'Project IDs', + name: 'project_ids', + type: 'string', + default: '', + description: 'Comma-separated IDs of project IDs to filter by.', + }, + ], + }, + + // ---------------------------------------- + // task: update + // ---------------------------------------- + { + displayName: 'Task ID', + name: 'taskId', + description: 'ID of the task to update.', + type: 'string', + required: true, + default: '', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'update', + ], + }, + }, + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + { + displayName: 'Assignee ID', + name: 'assignee_id', + type: 'string', + default: '', + description: 'ID of the user who will own the task.', + }, + { + displayName: 'Details', + name: 'details', + type: 'string', + default: '', + description: 'Description to set for the task.', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name to set for the task.', + }, + { + displayName: 'Priority', + name: 'priority', + type: 'options', + default: 'High', + options: [ + { + name: 'High', + value: 'High', + }, + { + name: 'None', + value: 'None', + }, + ], + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + default: 'Open', + options: [ + { + name: 'Completed', + value: 'Completed', + }, + { + name: 'Open', + value: 'Open', + }, + ], + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/UserDescription.ts b/packages/nodes-base/nodes/Copper/descriptions/UserDescription.ts new file mode 100644 index 0000000000..52c45db9f8 --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/UserDescription.ts @@ -0,0 +1,73 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const userOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'user', + ], + }, + }, + options: [ + { + name: 'Get All', + value: 'getAll', + }, + ], + default: 'getAll', + description: 'Operation to perform', + }, +] as INodeProperties[]; + +export const userFields = [ + // ---------------------------------------- + // user: getAll + // ---------------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all results.', + displayOptions: { + show: { + resource: [ + 'user', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 5, + description: 'The number of results to return.', + typeOptions: { + minValue: 1, + maxValue: 1000, + }, + displayOptions: { + show: { + resource: [ + 'user', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Copper/descriptions/index.ts b/packages/nodes-base/nodes/Copper/descriptions/index.ts new file mode 100644 index 0000000000..13b61b5aaa --- /dev/null +++ b/packages/nodes-base/nodes/Copper/descriptions/index.ts @@ -0,0 +1,8 @@ +export * from './CompanyDescription'; +export * from './CustomerSourceDescription'; +export * from './LeadDescription'; +export * from './OpportunityDescription'; +export * from './PersonDescription'; +export * from './ProjectDescription'; +export * from './TaskDescription'; +export * from './UserDescription'; diff --git a/packages/nodes-base/nodes/Copper/utils/isoCountryCodes.ts b/packages/nodes-base/nodes/Copper/utils/isoCountryCodes.ts new file mode 100644 index 0000000000..dd5bce6f4c --- /dev/null +++ b/packages/nodes-base/nodes/Copper/utils/isoCountryCodes.ts @@ -0,0 +1,1000 @@ +// ISO 3166 alpha-2 country code + +export const isoCountryCodes = [ + { + name: 'Afghanistan', + alpha2: 'AF', + }, + { + name: 'Åland Islands', + alpha2: 'AX', + }, + { + name: 'Albania', + alpha2: 'AL', + }, + { + name: 'Algeria', + alpha2: 'DZ', + }, + { + name: 'American Samoa', + alpha2: 'AS', + }, + { + name: 'Andorra', + alpha2: 'AD', + }, + { + name: 'Angola', + alpha2: 'AO', + }, + { + name: 'Anguilla', + alpha2: 'AI', + }, + { + name: 'Antarctica', + alpha2: 'AQ', + }, + { + name: 'Antigua and Barbuda', + alpha2: 'AG', + }, + { + name: 'Argentina', + alpha2: 'AR', + }, + { + name: 'Armenia', + alpha2: 'AM', + }, + { + name: 'Aruba', + alpha2: 'AW', + }, + { + name: 'Australia', + alpha2: 'AU', + }, + { + name: 'Austria', + alpha2: 'AT', + }, + { + name: 'Azerbaijan', + alpha2: 'AZ', + }, + { + name: 'Bahamas (the)', + alpha2: 'BS', + }, + { + name: 'Bahrain', + alpha2: 'BH', + }, + { + name: 'Bangladesh', + alpha2: 'BD', + }, + { + name: 'Barbados', + alpha2: 'BB', + }, + { + name: 'Belarus', + alpha2: 'BY', + }, + { + name: 'Belgium', + alpha2: 'BE', + }, + { + name: 'Belize', + alpha2: 'BZ', + }, + { + name: 'Benin', + alpha2: 'BJ', + }, + { + name: 'Bermuda', + alpha2: 'BM', + }, + { + name: 'Bhutan', + alpha2: 'BT', + }, + { + name: 'Bolivia (Plurinational State of)', + alpha2: 'BO', + }, + { + name: 'Bonaire, Sint Eustatius and Saba', + alpha2: 'BQ', + }, + { + name: 'Bosnia and Herzegovina', + alpha2: 'BA', + }, + { + name: 'Botswana', + alpha2: 'BW', + }, + { + name: 'Bouvet Island', + alpha2: 'BV', + }, + { + name: 'Brazil', + alpha2: 'BR', + }, + { + name: 'British Indian Ocean Territory (the)', + alpha2: 'IO', + }, + { + name: 'Brunei Darussalam', + alpha2: 'BN', + }, + { + name: 'Bulgaria', + alpha2: 'BG', + }, + { + name: 'Burkina Faso', + alpha2: 'BF', + }, + { + name: 'Burundi', + alpha2: 'BI', + }, + { + name: 'Cabo Verde', + alpha2: 'CV', + }, + { + name: 'Cambodia', + alpha2: 'KH', + }, + { + name: 'Cameroon', + alpha2: 'CM', + }, + { + name: 'Canada', + alpha2: 'CA', + }, + { + name: 'Cayman Islands (the)', + alpha2: 'KY', + }, + { + name: 'Central African Republic (the)', + alpha2: 'CF', + }, + { + name: 'Chad', + alpha2: 'TD', + }, + { + name: 'Chile', + alpha2: 'CL', + }, + { + name: 'China', + alpha2: 'CN', + }, + { + name: 'Christmas Island', + alpha2: 'CX', + }, + { + name: 'Cocos (Keeling) Islands (the)', + alpha2: 'CC', + }, + { + name: 'Colombia', + alpha2: 'CO', + }, + { + name: 'Comoros (the)', + alpha2: 'KM', + }, + { + name: 'Congo (the Democratic Republic of the)', + alpha2: 'CD', + }, + { + name: 'Congo (the)', + alpha2: 'CG', + }, + { + name: 'Cook Islands (the)', + alpha2: 'CK', + }, + { + name: 'Costa Rica', + alpha2: 'CR', + }, + { + name: 'Côte d\'Ivoire', + alpha2: 'CI', + }, + { + name: 'Croatia', + alpha2: 'HR', + }, + { + name: 'Cuba', + alpha2: 'CU', + }, + { + name: 'Curaçao', + alpha2: 'CW', + }, + { + name: 'Cyprus', + alpha2: 'CY', + }, + { + name: 'Czechia', + alpha2: 'CZ', + }, + { + name: 'Denmark', + alpha2: 'DK', + }, + { + name: 'Djibouti', + alpha2: 'DJ', + }, + { + name: 'Dominica', + alpha2: 'DM', + }, + { + name: 'Dominican Republic (the)', + alpha2: 'DO', + }, + { + name: 'Ecuador', + alpha2: 'EC', + }, + { + name: 'Egypt', + alpha2: 'EG', + }, + { + name: 'El Salvador', + alpha2: 'SV', + }, + { + name: 'Equatorial Guinea', + alpha2: 'GQ', + }, + { + name: 'Eritrea', + alpha2: 'ER', + }, + { + name: 'Estonia', + alpha2: 'EE', + }, + { + name: 'Ethiopia', + alpha2: 'ET', + }, + { + name: 'Falkland Islands (the) [Malvinas]', + alpha2: 'FK', + }, + { + name: 'Faroe Islands (the)', + alpha2: 'FO', + }, + { + name: 'Fiji', + alpha2: 'FJ', + }, + { + name: 'Finland', + alpha2: 'FI', + }, + { + name: 'France', + alpha2: 'FR', + }, + { + name: 'French Guiana', + alpha2: 'GF', + }, + { + name: 'French Polynesia', + alpha2: 'PF', + }, + { + name: 'French Southern Territories (the)', + alpha2: 'TF', + }, + { + name: 'Gabon', + alpha2: 'GA', + }, + { + name: 'Gambia (the)', + alpha2: 'GM', + }, + { + name: 'Georgia', + alpha2: 'GE', + }, + { + name: 'Germany', + alpha2: 'DE', + }, + { + name: 'Ghana', + alpha2: 'GH', + }, + { + name: 'Gibraltar', + alpha2: 'GI', + }, + { + name: 'Greece', + alpha2: 'GR', + }, + { + name: 'Greenland', + alpha2: 'GL', + }, + { + name: 'Grenada', + alpha2: 'GD', + }, + { + name: 'Guadeloupe', + alpha2: 'GP', + }, + { + name: 'Guam', + alpha2: 'GU', + }, + { + name: 'Guatemala', + alpha2: 'GT', + }, + { + name: 'Guernsey', + alpha2: 'GG', + }, + { + name: 'Guinea', + alpha2: 'GN', + }, + { + name: 'Guinea-Bissau', + alpha2: 'GW', + }, + { + name: 'Guyana', + alpha2: 'GY', + }, + { + name: 'Haiti', + alpha2: 'HT', + }, + { + name: 'Heard Island and McDonald Islands', + alpha2: 'HM', + }, + { + name: 'Holy See (the)', + alpha2: 'VA', + }, + { + name: 'Honduras', + alpha2: 'HN', + }, + { + name: 'Hong Kong', + alpha2: 'HK', + }, + { + name: 'Hungary', + alpha2: 'HU', + }, + { + name: 'Iceland', + alpha2: 'IS', + }, + { + name: 'India', + alpha2: 'IN', + }, + { + name: 'Indonesia', + alpha2: 'ID', + }, + { + name: 'Iran (Islamic Republic of)', + alpha2: 'IR', + }, + { + name: 'Iraq', + alpha2: 'IQ', + }, + { + name: 'Ireland', + alpha2: 'IE', + }, + { + name: 'Isle of Man', + alpha2: 'IM', + }, + { + name: 'Israel', + alpha2: 'IL', + }, + { + name: 'Italy', + alpha2: 'IT', + }, + { + name: 'Jamaica', + alpha2: 'JM', + }, + { + name: 'Japan', + alpha2: 'JP', + }, + { + name: 'Jersey', + alpha2: 'JE', + }, + { + name: 'Jordan', + alpha2: 'JO', + }, + { + name: 'Kazakhstan', + alpha2: 'KZ', + }, + { + name: 'Kenya', + alpha2: 'KE', + }, + { + name: 'Kiribati', + alpha2: 'KI', + }, + { + name: 'Korea (the Democratic People\'s Republic of)', + alpha2: 'KP', + }, + { + name: 'Korea (the Republic of)', + alpha2: 'KR', + }, + { + name: 'Kuwait', + alpha2: 'KW', + }, + { + name: 'Kyrgyzstan', + alpha2: 'KG', + }, + { + name: 'Lao People\'s Democratic Republic (the)', + alpha2: 'LA', + }, + { + name: 'Latvia', + alpha2: 'LV', + }, + { + name: 'Lebanon', + alpha2: 'LB', + }, + { + name: 'Lesotho', + alpha2: 'LS', + }, + { + name: 'Liberia', + alpha2: 'LR', + }, + { + name: 'Libya', + alpha2: 'LY', + }, + { + name: 'Liechtenstein', + alpha2: 'LI', + }, + { + name: 'Lithuania', + alpha2: 'LT', + }, + { + name: 'Luxembourg', + alpha2: 'LU', + }, + { + name: 'Macao', + alpha2: 'MO', + }, + { + name: 'Macedonia (the former Yugoslav Republic of)', + alpha2: 'MK', + }, + { + name: 'Madagascar', + alpha2: 'MG', + }, + { + name: 'Malawi', + alpha2: 'MW', + }, + { + name: 'Malaysia', + alpha2: 'MY', + }, + { + name: 'Maldives', + alpha2: 'MV', + }, + { + name: 'Mali', + alpha2: 'ML', + }, + { + name: 'Malta', + alpha2: 'MT', + }, + { + name: 'Marshall Islands (the)', + alpha2: 'MH', + }, + { + name: 'Martinique', + alpha2: 'MQ', + }, + { + name: 'Mauritania', + alpha2: 'MR', + }, + { + name: 'Mauritius', + alpha2: 'MU', + }, + { + name: 'Mayotte', + alpha2: 'YT', + }, + { + name: 'Mexico', + alpha2: 'MX', + }, + { + name: 'Micronesia (Federated States of)', + alpha2: 'FM', + }, + { + name: 'Moldova (the Republic of)', + alpha2: 'MD', + }, + { + name: 'Monaco', + alpha2: 'MC', + }, + { + name: 'Mongolia', + alpha2: 'MN', + }, + { + name: 'Montenegro', + alpha2: 'ME', + }, + { + name: 'Montserrat', + alpha2: 'MS', + }, + { + name: 'Morocco', + alpha2: 'MA', + }, + { + name: 'Mozambique', + alpha2: 'MZ', + }, + { + name: 'Myanmar', + alpha2: 'MM', + }, + { + name: 'Namibia', + alpha2: 'NA', + }, + { + name: 'Nauru', + alpha2: 'NR', + }, + { + name: 'Nepal', + alpha2: 'NP', + }, + { + name: 'Netherlands (the)', + alpha2: 'NL', + }, + { + name: 'New Caledonia', + alpha2: 'NC', + }, + { + name: 'New Zealand', + alpha2: 'NZ', + }, + { + name: 'Nicaragua', + alpha2: 'NI', + }, + { + name: 'Niger (the)', + alpha2: 'NE', + }, + { + name: 'Nigeria', + alpha2: 'NG', + }, + { + name: 'Niue', + alpha2: 'NU', + }, + { + name: 'Norfolk Island', + alpha2: 'NF', + }, + { + name: 'Northern Mariana Islands (the)', + alpha2: 'MP', + }, + { + name: 'Norway', + alpha2: 'NO', + }, + { + name: 'Oman', + alpha2: 'OM', + }, + { + name: 'Pakistan', + alpha2: 'PK', + }, + { + name: 'Palau', + alpha2: 'PW', + }, + { + name: 'Palestine, State of', + alpha2: 'PS', + }, + { + name: 'Panama', + alpha2: 'PA', + }, + { + name: 'Papua New Guinea', + alpha2: 'PG', + }, + { + name: 'Paraguay', + alpha2: 'PY', + }, + { + name: 'Peru', + alpha2: 'PE', + }, + { + name: 'Philippines (the)', + alpha2: 'PH', + }, + { + name: 'Pitcairn', + alpha2: 'PN', + }, + { + name: 'Poland', + alpha2: 'PL', + }, + { + name: 'Portugal', + alpha2: 'PT', + }, + { + name: 'Puerto Rico', + alpha2: 'PR', + }, + { + name: 'Qatar', + alpha2: 'QA', + }, + { + name: 'Réunion', + alpha2: 'RE', + }, + { + name: 'Romania', + alpha2: 'RO', + }, + { + name: 'Russian Federation (the)', + alpha2: 'RU', + }, + { + name: 'Rwanda', + alpha2: 'RW', + }, + { + name: 'Saint Barthélemy', + alpha2: 'BL', + }, + { + name: 'Saint Helena, Ascension and Tristan da Cunha', + alpha2: 'SH', + }, + { + name: 'Saint Kitts and Nevis', + alpha2: 'KN', + }, + { + name: 'Saint Lucia', + alpha2: 'LC', + }, + { + name: 'Saint Martin (French part)', + alpha2: 'MF', + }, + { + name: 'Saint Pierre and Miquelon', + alpha2: 'PM', + }, + { + name: 'Saint Vincent and the Grenadines', + alpha2: 'VC', + }, + { + name: 'Samoa', + alpha2: 'WS', + }, + { + name: 'San Marino', + alpha2: 'SM', + }, + { + name: 'Sao Tome and Principe', + alpha2: 'ST', + }, + { + name: 'Saudi Arabia', + alpha2: 'SA', + }, + { + name: 'Senegal', + alpha2: 'SN', + }, + { + name: 'Serbia', + alpha2: 'RS', + }, + { + name: 'Seychelles', + alpha2: 'SC', + }, + { + name: 'Sierra Leone', + alpha2: 'SL', + }, + { + name: 'Singapore', + alpha2: 'SG', + }, + { + name: 'Sint Maarten (Dutch part)', + alpha2: 'SX', + }, + { + name: 'Slovakia', + alpha2: 'SK', + }, + { + name: 'Slovenia', + alpha2: 'SI', + }, + { + name: 'Solomon Islands', + alpha2: 'SB', + }, + { + name: 'Somalia', + alpha2: 'SO', + }, + { + name: 'South Africa', + alpha2: 'ZA', + }, + { + name: 'South Georgia and the South Sandwich Islands', + alpha2: 'GS', + }, + { + name: 'South Sudan', + alpha2: 'SS', + }, + { + name: 'Spain', + alpha2: 'ES', + }, + { + name: 'Sri Lanka', + alpha2: 'LK', + }, + { + name: 'Sudan (the)', + alpha2: 'SD', + }, + { + name: 'Suriname', + alpha2: 'SR', + }, + { + name: 'Svalbard and Jan Mayen', + alpha2: 'SJ', + }, + { + name: 'Swaziland', + alpha2: 'SZ', + }, + { + name: 'Sweden', + alpha2: 'SE', + }, + { + name: 'Switzerland', + alpha2: 'CH', + }, + { + name: 'Syrian Arab Republic', + alpha2: 'SY', + }, + { + name: 'Taiwan (Province of China)', + alpha2: 'TW', + }, + { + name: 'Tajikistan', + alpha2: 'TJ', + }, + { + name: 'Tanzania, United Republic of', + alpha2: 'TZ', + }, + { + name: 'Thailand', + alpha2: 'TH', + }, + { + name: 'Timor-Leste', + alpha2: 'TL', + }, + { + name: 'Togo', + alpha2: 'TG', + }, + { + name: 'Tokelau', + alpha2: 'TK', + }, + { + name: 'Tonga', + alpha2: 'TO', + }, + { + name: 'Trinidad and Tobago', + alpha2: 'TT', + }, + { + name: 'Tunisia', + alpha2: 'TN', + }, + { + name: 'Turkey', + alpha2: 'TR', + }, + { + name: 'Turkmenistan', + alpha2: 'TM', + }, + { + name: 'Turks and Caicos Islands (the)', + alpha2: 'TC', + }, + { + name: 'Tuvalu', + alpha2: 'TV', + }, + { + name: 'Uganda', + alpha2: 'UG', + }, + { + name: 'Ukraine', + alpha2: 'UA', + }, + { + name: 'United Arab Emirates (the)', + alpha2: 'AE', + }, + { + name: 'United Kingdom of Great Britain and Northern Ireland (the)', + alpha2: 'GB', + }, + { + name: 'United States Minor Outlying Islands (the)', + alpha2: 'UM', + }, + { + name: 'United States of America (the)', + alpha2: 'US', + }, + { + name: 'Uruguay', + alpha2: 'UY', + }, + { + name: 'Uzbekistan', + alpha2: 'UZ', + }, + { + name: 'Vanuatu', + alpha2: 'VU', + }, + { + name: 'Venezuela (Bolivarian Republic of)', + alpha2: 'VE', + }, + { + name: 'Viet Nam', + alpha2: 'VN', + }, + { + name: 'Virgin Islands (British)', + alpha2: 'VG', + }, + { + name: 'Virgin Islands (U.S.)', + alpha2: 'VI', + }, + { + name: 'Wallis and Futuna', + alpha2: 'WF', + }, + { + name: 'Western Sahara', + alpha2: 'EH', + }, + { + name: 'Yemen', + alpha2: 'YE', + }, + { + name: 'Zambia', + alpha2: 'ZM', + }, + { + name: 'Zimbabwe', + alpha2: 'ZW', + }, +]; diff --git a/packages/nodes-base/nodes/Copper/utils/sharedFields.ts b/packages/nodes-base/nodes/Copper/utils/sharedFields.ts new file mode 100644 index 0000000000..2e76bd24ba --- /dev/null +++ b/packages/nodes-base/nodes/Copper/utils/sharedFields.ts @@ -0,0 +1,140 @@ +// for companies, leads, persons +export const addressFixedCollection = { + displayName: 'Address', + name: 'address', + placeholder: 'Add Address Fields', + type: 'fixedCollection', + default: {}, + options: [ + { + displayName: 'Address Fields', + name: 'addressFields', + values: [ + { + displayName: 'Street', + name: 'street', + type: 'string', + default: '', + }, + { + displayName: 'City', + name: 'city', + type: 'string', + default: '', + }, + { + displayName: 'State', + name: 'state', + type: 'string', + default: '', + }, + { + displayName: 'Postal Code', + name: 'postal_code', + type: 'string', + default: '', + }, + { + displayName: 'Country', + name: 'country', + type: 'string', + default: '', + description: 'ISO 3166 alpha-2 country code.', + }, + ], + }, + ], +}; + +// for companies, leads, persons +export const phoneNumbersFixedCollection = { + displayName: 'Phone Numbers', + name: 'phone_numbers', + placeholder: 'Add Phone Number', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + displayName: 'Phone Fields', + name: 'phoneFields', + values: [ + { + displayName: 'Number', + name: 'number', + type: 'string', + default: '', + }, + { + displayName: 'Category', + name: 'category', + type: 'string', + default: '', + }, + ], + }, + ], +}; + +// for persons, multiple emails +export const emailsFixedCollection = { + displayName: 'Emails', + name: 'emails', + placeholder: 'Add Email', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + displayName: 'Email Fields', + name: 'emailFields', + values: [ + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + }, + { + displayName: 'Category', + name: 'category', + type: 'string', + default: '', + }, + ], + }, + ], +}; + +// for leads, single email +export const emailFixedCollection = { + displayName: 'Email', + name: 'email', + placeholder: 'Add Email', + type: 'fixedCollection', + default: {}, + options: [ + { + displayName: 'Email Fields', + name: 'emailFields', + values: [ + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + }, + { + displayName: 'Category', + name: 'category', + type: 'string', + default: '', + }, + ], + }, + ], +}; diff --git a/packages/nodes-base/nodes/Copper/utils/types.d.ts b/packages/nodes-base/nodes/Copper/utils/types.d.ts new file mode 100644 index 0000000000..0c71e916cd --- /dev/null +++ b/packages/nodes-base/nodes/Copper/utils/types.d.ts @@ -0,0 +1,23 @@ +export type EmailFixedCollection = { + email?: { + emailFields: Array<{ email: string, category: string }> + } +}; + +export type EmailsFixedCollection = { + emails?: { + emailFields: Array<{ email: string, category: string }> + } +}; + +export type PhoneNumbersFixedCollection = { + phone_numbers?: { + phoneFields: object, + } +}; + +export type AddressFixedCollection = { + address?: { + addressFields: object + } +} diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 556d7cfc1b..d3d39335f6 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -315,6 +315,7 @@ "dist/nodes/Contentful/Contentful.node.js", "dist/nodes/ConvertKit/ConvertKit.node.js", "dist/nodes/ConvertKit/ConvertKitTrigger.node.js", + "dist/nodes/Copper/Copper.node.js", "dist/nodes/Copper/CopperTrigger.node.js", "dist/nodes/Cortex/Cortex.node.js", "dist/nodes/CrateDb/CrateDb.node.js", From 99bb6e40c157928dd8a2261ebc03523856eab378 Mon Sep 17 00:00:00 2001 From: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> Date: Fri, 2 Apr 2021 20:48:22 +0300 Subject: [PATCH 119/137] :sparkles: Add AWS SQS node (#1530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * implement sqs node to send message * remove console logs * update node to use url as value * add message attributes * tslint --fix * fix comment * address comments, fix subtitle bug, fix style issues * add comma * update pathname handling * fix spacing * fix queue loading for no queues and more than 1 * change logo to svg, support sending input as json * add binary data property support * fix node read to depend on item * :art: Fix SVG size to prevent cropping * :zap: Ajust imports and display names per codebase * :pencil2: Edit parameter descriptions * address comments * tslint fixes * update subtitle to operation * update fifo handling * :zap: Improvements * :zap: Minor fix Co-authored-by: Iván Ovejero Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../nodes-base/credentials/Aws.credentials.ts | 15 + .../nodes-base/nodes/Aws/GenericFunctions.ts | 2 + .../nodes-base/nodes/Aws/SQS/AwsSqs.node.json | 21 + .../nodes-base/nodes/Aws/SQS/AwsSqs.node.ts | 387 ++++++++++++++++++ packages/nodes-base/nodes/Aws/SQS/sqs.svg | 1 + packages/nodes-base/package.json | 1 + 6 files changed, 427 insertions(+) create mode 100644 packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.json create mode 100644 packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.ts create mode 100644 packages/nodes-base/nodes/Aws/SQS/sqs.svg diff --git a/packages/nodes-base/credentials/Aws.credentials.ts b/packages/nodes-base/credentials/Aws.credentials.ts index 69fe9f1a47..732817d4b8 100644 --- a/packages/nodes-base/credentials/Aws.credentials.ts +++ b/packages/nodes-base/credentials/Aws.credentials.ts @@ -96,6 +96,21 @@ export class Aws implements ICredentialType { default: '', placeholder: 'https://email.{region}.amazonaws.com', }, + { + displayName: 'SQS Endpoint', + name: 'sqsEndpoint', + description: 'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SQS using a VPC endpoint. Leave blank to use the default endpoint.', + type: 'string' as NodePropertyTypes, + displayOptions: { + show: { + customEndpoints: [ + true, + ], + }, + }, + default: '', + placeholder: 'https://sqs.{region}.amazonaws.com', + }, { displayName: 'S3 Endpoint', name: 's3Endpoint', diff --git a/packages/nodes-base/nodes/Aws/GenericFunctions.ts b/packages/nodes-base/nodes/Aws/GenericFunctions.ts index 9bccee16c3..edc733af64 100644 --- a/packages/nodes-base/nodes/Aws/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Aws/GenericFunctions.ts @@ -20,6 +20,8 @@ function getEndpointForService(service: string, credentials: ICredentialDataDecr endpoint = credentials.lambdaEndpoint; } else if (service === 'sns' && credentials.snsEndpoint) { endpoint = credentials.snsEndpoint; + } else if (service === 'sqs' && credentials.sqsEndpoint) { + endpoint = credentials.sqsEndpoint; } else { endpoint = `https://${service}.${credentials.region}.amazonaws.com`; } diff --git a/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.json b/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.json new file mode 100644 index 0000000000..ec0fa1cc0b --- /dev/null +++ b/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.json @@ -0,0 +1,21 @@ +{ + "node": "n8n-nodes-base.awsSqs", + "nodeVersion": "1.0", + "codexVersion": "1.0", + "categories": [ + "Development", + "Communication" + ], + "resources": { + "credentialDocumentation": [ + { + "url": "https://docs.n8n.io/credentials/aws" + } + ], + "primaryDocumentation": [ + { + "url": "https://docs.n8n.io/nodes/n8n-nodes-base.awsSqs/" + } + ] + } +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.ts b/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.ts new file mode 100644 index 0000000000..fb58bd7139 --- /dev/null +++ b/packages/nodes-base/nodes/Aws/SQS/AwsSqs.node.ts @@ -0,0 +1,387 @@ +import { + BINARY_ENCODING, + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeExecutionData, + INodeParameters, + INodePropertyOptions, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + URL, +} from 'url'; + +import { + awsApiRequestSOAP, +} from '../GenericFunctions'; + +export class AwsSqs implements INodeType { + description: INodeTypeDescription = { + displayName: 'AWS SQS', + name: 'awsSqs', + icon: 'file:sqs.svg', + group: ['output'], + version: 1, + subtitle: `={{$parameter["operation"]}}`, + description: 'Sends messages to AWS SQS', + defaults: { + name: 'AWS SQS', + color: '#FF9900', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'aws', + required: true, + }, + ], + properties: [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + options: [ + { + name: 'Send message', + value: 'sendMessage', + description: 'Send a message to a queue.', + }, + ], + default: 'sendMessage', + description: 'The operation to perform.', + }, + { + displayName: 'Queue', + name: 'queue', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getQueues', + }, + displayOptions: { + show: { + operation: [ + 'sendMessage', + ], + }, + }, + options: [], + default: '', + required: true, + description: 'Queue to send a message to.', + }, + { + displayName: 'Queue Type', + name: 'queueType', + type: 'options', + options: [ + { + name: 'FIFO', + value: 'fifo', + description: 'FIFO SQS queue.', + }, + { + name: 'Standard', + value: 'standard', + description: 'Standard SQS queue.', + }, + ], + default: 'standard', + description: 'The operation to perform.', + }, + { + displayName: 'Send Input Data', + name: 'sendInputData', + type: 'boolean', + default: true, + description: 'Send the data the node receives as JSON to SQS.', + }, + { + displayName: 'Message', + name: 'message', + type: 'string', + displayOptions: { + show: { + operation: [ + 'sendMessage', + ], + sendInputData: [ + false, + ], + }, + }, + required: true, + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Message to send to the queue.', + }, + { + displayName: 'Message Group ID', + name: 'messageGroupId', + type: 'string', + default: '', + description: 'Tag that specifies that a message belongs to a specific message group. Applies only to FIFO (first-in-first-out) queues.', + displayOptions: { + show: { + queueType: [ + 'fifo', + ], + }, + }, + required: true, + }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + displayOptions: { + show: { + operation: [ + 'sendMessage', + ], + }, + }, + default: {}, + placeholder: 'Add Option', + options: [ + { + displayName: 'Delay Seconds', + name: 'delaySeconds', + type: 'number', + displayOptions: { + show: { + '/queueType': [ + 'standard', + ], + }, + }, + description: 'How long, in seconds, to delay a message for.', + default: 0, + typeOptions: { + minValue: 0, + maxValue: 900, + }, + }, + { + displayName: 'Message Attributes', + name: 'messageAttributes', + placeholder: 'Add Attribute', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + description: 'Attributes to set.', + default: {}, + options: [ + { + name: 'binary', + displayName: 'Binary', + values: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the attribute.', + }, + { + displayName: 'Property Name', + name: 'dataPropertyName', + type: 'string', + default: 'data', + description: 'Name of the binary property which contains the data for the message attribute.', + }, + ], + }, + { + name: 'number', + displayName: 'Number', + values: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the attribute.', + }, + { + displayName: 'Value', + name: 'value', + type: 'number', + default: 0, + description: 'Number value of the attribute.', + }, + ], + }, + { + name: 'string', + displayName: 'String', + values: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the attribute.', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'String value of attribute.', + }, + ], + }, + ], + }, + { + displayName: 'Message Deduplication ID', + name: 'messageDeduplicationId', + type: 'string', + default: '', + description: 'Token used for deduplication of sent messages. Applies only to FIFO (first-in-first-out) queues.', + displayOptions: { + show: { + '/queueType': [ + 'fifo', + ], + }, + }, + }, + ], + }, + ], + }; + + methods = { + loadOptions: { + // Get all the available queues to display them to user so that it can be selected easily + async getQueues(this: ILoadOptionsFunctions): Promise { + let data; + try { + // loads first 1000 queues from SQS + data = await awsApiRequestSOAP.call(this, 'sqs', 'GET', `?Action=ListQueues`); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + + let queues = data.ListQueuesResponse.ListQueuesResult.QueueUrl; + if (!queues) { + return []; + } + + if (!Array.isArray(queues)) { + // If user has only a single queue no array get returned so we make + // one manually to be able to process everything identically + queues = [queues]; + } + + return queues.map((queueUrl: string) => { + const urlParts = queueUrl.split('/'); + const name = urlParts[urlParts.length - 1]; + + return { + name, + value: queueUrl, + }; + }); + }, + }, + }; + + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + const operation = this.getNodeParameter('operation', 0) as string; + + for (let i = 0; i < items.length; i++) { + const queueUrl = this.getNodeParameter('queue', i) as string; + const queuePath = new URL(queueUrl).pathname; + const params = []; + + const options = this.getNodeParameter('options', i, {}) as IDataObject; + const sendInputData = this.getNodeParameter('sendInputData', i) as boolean; + + const message = sendInputData ? JSON.stringify(items[i].json) : this.getNodeParameter('message', i) as string; + params.push(`MessageBody=${message}`); + + if (options.delaySeconds) { + params.push(`DelaySeconds=${options.delaySeconds}`); + } + + const queueType = this.getNodeParameter('queueType', i, {}) as string; + if (queueType === 'fifo') { + const messageDeduplicationId = this.getNodeParameter('options.messageDeduplicationId', i, '') as string; + if (messageDeduplicationId) { + params.push(`MessageDeduplicationId=${messageDeduplicationId}`); + } + + const messageGroupId = this.getNodeParameter('messageGroupId', i) as string; + if (messageGroupId) { + params.push(`MessageGroupId=${messageGroupId}`); + } + } + + let attributeCount = 0; + // Add string values + (this.getNodeParameter('options.messageAttributes.string', i, []) as INodeParameters[]).forEach((attribute) => { + attributeCount++; + params.push(`MessageAttribute.${attributeCount}.Name=${attribute.name}`); + params.push(`MessageAttribute.${attributeCount}.Value.StringValue=${attribute.value}`); + params.push(`MessageAttribute.${attributeCount}.Value.DataType=String`); + }); + + // Add binary values + (this.getNodeParameter('options.messageAttributes.binary', i, []) as INodeParameters[]).forEach((attribute) => { + attributeCount++; + const dataPropertyName = attribute.dataPropertyName as string; + const item = items[i]; + + if (item.binary === undefined) { + throw new Error('No binary data set. So message attribute cannot be added!'); + } + + if (item.binary[dataPropertyName] === undefined) { + throw new Error(`The binary property "${dataPropertyName}" does not exist. So message attribute cannot be added!`); + } + + const binaryData = item.binary[dataPropertyName].data; + + params.push(`MessageAttribute.${attributeCount}.Name=${attribute.name}`); + params.push(`MessageAttribute.${attributeCount}.Value.BinaryValue=${binaryData}`); + params.push(`MessageAttribute.${attributeCount}.Value.DataType=Binary`); + }); + + // Add number values + (this.getNodeParameter('options.messageAttributes.number', i, []) as INodeParameters[]).forEach((attribute) => { + attributeCount++; + params.push(`MessageAttribute.${attributeCount}.Name=${attribute.name}`); + params.push(`MessageAttribute.${attributeCount}.Value.StringValue=${attribute.value}`); + params.push(`MessageAttribute.${attributeCount}.Value.DataType=Number`); + }); + + let responseData; + try { + responseData = await awsApiRequestSOAP.call(this, 'sqs', 'GET', `${queuePath}/?Action=${operation}&` + params.join('&')); + } catch (err) { + throw new Error(`AWS Error: ${err}`); + } + + const result = responseData.SendMessageResponse.SendMessageResult; + returnData.push(result as IDataObject); + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Aws/SQS/sqs.svg b/packages/nodes-base/nodes/Aws/SQS/sqs.svg new file mode 100644 index 0000000000..5d51fef2a8 --- /dev/null +++ b/packages/nodes-base/nodes/Aws/SQS/sqs.svg @@ -0,0 +1 @@ + diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index d3d39335f6..b545998de8 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -288,6 +288,7 @@ "dist/nodes/Aws/Rekognition/AwsRekognition.node.js", "dist/nodes/Aws/S3/AwsS3.node.js", "dist/nodes/Aws/SES/AwsSes.node.js", + "dist/nodes/Aws/SQS/AwsSqs.node.js", "dist/nodes/Aws/AwsSns.node.js", "dist/nodes/Aws/AwsSnsTrigger.node.js", "dist/nodes/Bannerbear/Bannerbear.node.js", From 12838f26e3940dcddc4d82c7478ad5b1dbabd22c Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Sat, 3 Apr 2021 04:04:22 -0400 Subject: [PATCH 120/137] :sparkles: Add Sheet -> create/remove to GoogleSheets node(#1620) * Add operation 'addSheet' to GoogleSheets node * lint fixes * :zap: Improvements * :zap: Move operations to "Sheet" Co-authored-by: dali Co-authored-by: Jan Oberhauser --- .../nodes/Google/Sheet/GenericFunctions.ts | 16 ++ .../nodes/Google/Sheet/GoogleSheets.node.ts | 244 +++++++++++++++++- 2 files changed, 255 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts b/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts index 21831fc9b7..80526a9ce1 100644 --- a/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts @@ -127,3 +127,19 @@ function getAccessToken(this: IExecuteFunctions | IExecuteSingleFunctions | ILoa //@ts-ignore return this.helpers.request(options); } + +// Hex to RGB +export function hexToRgb(hex: string) { + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, (m, r, g, b) => { + return r + r + g + g + b + b; + }); + + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + red: parseInt(result[1], 16), + green: parseInt(result[2], 16), + blue: parseInt(result[3], 16), + } : null; +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts index ac3750e9fa..58782e1e15 100644 --- a/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts +++ b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts @@ -23,6 +23,7 @@ import { import { googleApiRequest, + hexToRgb, } from './GenericFunctions'; export class GoogleSheets implements INodeType { @@ -121,6 +122,11 @@ export class GoogleSheets implements INodeType { value: 'clear', description: 'Clear data from a sheet', }, + { + name: 'Create', + value: 'create', + description: 'Create a new sheet', + }, { name: 'Delete', value: 'delete', @@ -136,6 +142,11 @@ export class GoogleSheets implements INodeType { value: 'read', description: 'Read data from a sheet', }, + { + name: 'Remove', + value: 'remove', + description: 'Remove a sheet', + }, { name: 'Update', value: 'update', @@ -150,7 +161,7 @@ export class GoogleSheets implements INodeType { // All // ---------------------------------- { - displayName: 'Sheet ID', + displayName: 'Spreadsheet ID', name: 'sheetId', type: 'string', displayOptions: { @@ -162,7 +173,7 @@ export class GoogleSheets implements INodeType { }, default: '', required: true, - description: 'The ID of the Google Sheet.
Found as part of the sheet URL https://docs.google.com/spreadsheets/d/{ID}/', + description: 'The ID of the Google Spreadsheet.
Found as part of the sheet URL https://docs.google.com/spreadsheets/d/{ID}/', }, { displayName: 'Range', @@ -176,7 +187,9 @@ export class GoogleSheets implements INodeType { }, hide: { operation: [ + 'create', 'delete', + 'remove', ], }, }, @@ -185,7 +198,6 @@ export class GoogleSheets implements INodeType { description: 'The table range to read from or to append data to. See the Google documentation for the details.
If it contains multiple sheets it can also be
added like this: "MySheet!A:F"', }, - // ---------------------------------- // Delete // ---------------------------------- @@ -392,8 +404,10 @@ export class GoogleSheets implements INodeType { hide: { operation: [ 'append', + 'create', 'clear', 'delete', + 'remove', ], rawData: [ true, @@ -422,7 +436,9 @@ export class GoogleSheets implements INodeType { hide: { operation: [ 'clear', + 'create', 'delete', + 'remove', ], rawData: [ true, @@ -596,7 +612,7 @@ export class GoogleSheets implements INodeType { { name: 'Formula', value: 'FORMULA', - description: ' Values will not be calculated. The reply will include the formulas. For example, if A1 is 1.23 and A2 is =A1 and formatted as currency, then A2 would return "=A1".', + description: 'Values will not be calculated. The reply will include the formulas. For example, if A1 is 1.23 and A2 is =A1 and formatted as currency, then A2 would return "=A1".', }, { name: 'Unformatted Value', @@ -793,6 +809,170 @@ export class GoogleSheets implements INodeType { }, ], }, + + // ---------------------------------- + // sheet:create + // ---------------------------------- + { + displayName: 'Simple', + name: 'simple', + type: 'boolean', + default: true, + displayOptions: { + show: { + resource: [ + 'sheet', + ], + operation: [ + 'create', + ], + }, + }, + description: 'When set to true a simplify version of the response will be used else the raw data.', + }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + resource: [ + 'sheet', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Grid Properties', + name: 'gridProperties', + type: 'collection', + placeholder: 'Add Property', + default: '', + options: [ + { + displayName: 'Column Count', + name: 'columnCount', + type: 'number', + default: 0, + description: 'The number of columns in the grid.', + }, + { + displayName: 'Column Group Control After', + name: 'columnGroupControlAfter', + type: 'boolean', + default: false, + description: 'True if the column grouping control toggle is shown after the group.', + }, + { + displayName: 'Frozen Column Count', + name: 'frozenColumnCount', + type: 'number', + default: 0, + description: 'The number of columns that are frozen in the grid.', + }, + { + displayName: 'Frozen Row Count', + name: 'frozenRowCount', + type: 'number', + default: 0, + description: 'The number of rows that are frozen in the grid.', + }, + { + displayName: 'Hide Gridlines', + name: 'hideGridlines', + type: 'boolean', + default: false, + description: 'True if the grid isn\'t showing gridlines in the UI.', + }, + { + displayName: 'Row Count', + name: 'rowCount', + type: 'number', + default: 0, + description: 'The number of rows in the grid.', + }, + { + displayName: 'Row Group Control After', + name: 'rowGroupControlAfter', + type: 'boolean', + default: false, + description: 'True if the row grouping control toggle is shown after the group.', + }, + + ], + description: 'The type of the sheet.', + }, + { + displayName: 'Hidden', + name: 'hidden', + type: 'boolean', + default: false, + description: 'True if the sheet is hidden in the UI, false if it\'s visible.', + }, + { + displayName: 'Right To Left', + name: 'rightToLeft', + type: 'boolean', + default: false, + description: 'True if the sheet is an RTL sheet instead of an LTR sheet.', + }, + { + displayName: 'Sheet ID', + name: 'sheetId', + type: 'number', + default: 0, + description: 'The ID of the sheet. Must be non-negative. This field cannot be changed once set.', + }, + { + displayName: 'Sheet Index', + name: 'index', + type: 'number', + default: 0, + description: 'The index of the sheet within the spreadsheet.', + }, + { + displayName: 'Tab Color', + name: 'tabColor', + type: 'color', + default: '0aa55c', + description: 'The color of the tab in the UI.', + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'The Sheet name.', + }, + ], + }, + + // ---------------------------------- + // sheet:remove + // ---------------------------------- + { + displayName: 'Sheet ID', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'sheet', + ], + operation: [ + 'remove', + ], + }, + }, + description: 'The ID of the sheet to delete.', + }, ], }; @@ -840,7 +1020,7 @@ export class GoogleSheets implements INodeType { const sheet = new GoogleSheet(spreadsheetId, this); let range = ''; - if (operation !== 'delete') { + if (!['create', 'delete', 'remove'].includes(operation)) { range = this.getNodeParameter('range', 0) as string; } @@ -878,6 +1058,39 @@ export class GoogleSheets implements INodeType { const items = this.getInputData(); return this.prepareOutputData(items); + + } else if (operation === 'create') { + const returnData: IDataObject[] = []; + + let responseData; + for (let i = 0; i < this.getInputData().length; i++) { + const spreadsheetId = this.getNodeParameter('sheetId', i) as string; + const options = this.getNodeParameter('options', i, {}) as IDataObject; + const simple = this.getNodeParameter('simple', 0) as boolean; + const properties = { ...options }; + + if (options.tabColor) { + const { red, green, blue } = hexToRgb(options.tabColor as string)!; + properties.tabColor = { red: red / 255, green: green / 255, blue: blue / 255 }; + } + + const requests = [{ + addSheet: { + properties, + }, + }]; + + responseData = await googleApiRequest.call(this, 'POST', `/v4/spreadsheets/${spreadsheetId}:batchUpdate`, { requests }); + + if (simple === true) { + Object.assign(responseData, responseData.replies[0].addSheet.properties); + delete responseData.replies; + } + returnData.push(responseData); + } + + return [this.helpers.returnJsonArray(returnData)]; + } else if (operation === 'delete') { // ---------------------------------- // delete @@ -976,6 +1189,27 @@ export class GoogleSheets implements INodeType { returnData = [{}]; } + return [this.helpers.returnJsonArray(returnData)]; + + } else if (operation === 'remove') { + const returnData: IDataObject[] = []; + + let responseData; + for (let i = 0; i < this.getInputData().length; i++) { + const sheetId = this.getNodeParameter('id', i) as string; + const spreadsheetId = this.getNodeParameter('sheetId', i) as string; + + const requests = [{ + deleteSheet: { + sheetId, + }, + }]; + + responseData = await googleApiRequest.call(this, 'POST', `/v4/spreadsheets/${spreadsheetId}:batchUpdate`, { requests }); + delete responseData.replies; + returnData.push(responseData); + } + return [this.helpers.returnJsonArray(returnData)]; } else if (operation === 'update') { // ---------------------------------- From 3b00c966436856f6fe3e085ab642f6b5a9916218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Sat, 3 Apr 2021 11:07:21 +0200 Subject: [PATCH 121/137] :sparkles: Add ERPNext node (#1604) * :construction: Integrated with access token OAuth2 still needs work * :construction: Removed OAuth2 for now * :zap: Improvements * :zap: Improvements * :zap: Refactor ERPNext node * :fire: Remove PNG icon * :fire: Remove leftover comments * :hammer: Catch unavailable resource error * :zap: Reposition docType for filters * :zap: Improvements * :zap: Cleanup Co-authored-by: Rupenieks Co-authored-by: ricardo Co-authored-by: Jan Oberhauser --- .../credentials/ERPNextApi.credentials.ts | 32 ++ .../nodes/ERPNext/DocumentDescription.ts | 463 ++++++++++++++++++ .../nodes-base/nodes/ERPNext/ERPNext.node.ts | 268 ++++++++++ .../nodes/ERPNext/GenericFunctions.ts | 107 ++++ packages/nodes-base/nodes/ERPNext/erpnext.svg | 8 + packages/nodes-base/nodes/ERPNext/utils.ts | 30 ++ packages/nodes-base/package.json | 2 + 7 files changed, 910 insertions(+) create mode 100644 packages/nodes-base/credentials/ERPNextApi.credentials.ts create mode 100644 packages/nodes-base/nodes/ERPNext/DocumentDescription.ts create mode 100644 packages/nodes-base/nodes/ERPNext/ERPNext.node.ts create mode 100644 packages/nodes-base/nodes/ERPNext/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/ERPNext/erpnext.svg create mode 100644 packages/nodes-base/nodes/ERPNext/utils.ts diff --git a/packages/nodes-base/credentials/ERPNextApi.credentials.ts b/packages/nodes-base/credentials/ERPNextApi.credentials.ts new file mode 100644 index 0000000000..d94210600e --- /dev/null +++ b/packages/nodes-base/credentials/ERPNextApi.credentials.ts @@ -0,0 +1,32 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + +export class ERPNextApi implements ICredentialType { + name = 'erpNextApi'; + displayName = 'ERPNext API'; + documentationUrl = 'erpnext'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + { + displayName: 'API Secret', + name: 'apiSecret', + type: 'string' as NodePropertyTypes, + default: '', + }, + { + displayName: 'Subdomain', + name: 'subdomain', + type: 'string' as NodePropertyTypes, + default: '', + placeholder: 'n8n', + description: 'ERPNext subdomain. For instance, entering n8n will make the url look like: https://n8n.erpnext.com/.', + }, + ]; +} diff --git a/packages/nodes-base/nodes/ERPNext/DocumentDescription.ts b/packages/nodes-base/nodes/ERPNext/DocumentDescription.ts new file mode 100644 index 0000000000..775c658cc9 --- /dev/null +++ b/packages/nodes-base/nodes/ERPNext/DocumentDescription.ts @@ -0,0 +1,463 @@ +import { + INodeProperties, +} from 'n8n-workflow'; + +export const documentOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'document', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a document.', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a document.', + }, + { + name: 'Get', + value: 'get', + description: 'Retrieve a document.', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Retrieve all documents.', + }, + { + name: 'Update', + value: 'update', + description: 'Update a document.', + }, + ], + default: 'create', + description: 'Operation to perform.', + }, +] as INodeProperties[]; + +export const documentFields = [ + // ---------------------------------- + // document: getAll + // ---------------------------------- + { + displayName: 'DocType', + name: 'docType', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocTypes', + }, + default: '', + description: 'DocType whose documents to retrieve.', + placeholder: 'Customer', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Return all items.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'getAll', + ], + }, + }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 10, + description: 'The number of results to return.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'getAll', + ], + returnAll: [ + false, + ], + }, + }, + }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'getAll', + ], + }, + }, + options: [ + { + displayName: 'Fields', + name: 'fields', + type: 'multiOptions', + typeOptions: { + loadOptionsMethod: 'getDocFilters', + loadOptionsDependsOn: [ + 'docType', + ], + }, + default: '', + description: 'Comma-separated list of fields to return.', + placeholder: 'name,country', + }, + { + displayName: 'Filters', + name: 'filters', + type: 'fixedCollection', + placeholder: 'Add Filter', + description: 'Custom Properties', + typeOptions: { + multipleValues: true, + }, + options: [ + { + displayName: 'Property', + name: 'customProperty', + values: [ + { + displayName: 'Field', + name: 'field', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocFields', + loadOptionsDependsOn: [ + 'docType', + ], + }, + default: '', + }, + { + displayName: 'Operator', + name: 'operator', + type: 'options', + default: 'is', + options: [ + { + name: 'IS', + value: 'is', + }, + { + name: 'IS NOT', + value: 'isNot', + }, + { + name: 'IS GREATER', + value: 'greater', + }, + { + name: 'IS LESS', + value: 'less', + }, + { + name: 'EQUALS, or GREATER', + value: 'equalsGreater', + }, + { + name: 'EQUALS, or LESS', + value: 'equalsLess', + }, + ], + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the operator condition.', + }, + ], + }, + ], + }, + ], + }, + + // ---------------------------------- + // document: create + // ---------------------------------- + { + displayName: 'DocType', + name: 'docType', + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getDocTypes', + }, + required: true, + description: 'DocType you would like to create.', + placeholder: 'Customer', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'create', + ], + }, + }, + }, + { + displayName: 'Properties', + name: 'properties', + type: 'fixedCollection', + placeholder: 'Add Property', + required: true, + default: {}, + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'create', + ], + }, + }, + options: [ + { + displayName: 'Property', + name: 'customProperty', + placeholder: 'Add Property', + values: [ + { + displayName: 'Field', + name: 'field', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocFields', + loadOptionsDependsOn: [ + 'docType', + ], + }, + default: [], + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + }, + ], + }, + ], + }, + + // ---------------------------------- + // document: get + // ---------------------------------- + { + displayName: 'DocType', + name: 'docType', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocTypes', + }, + default: '', + description: 'The type of document you would like to get.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'get', + ], + }, + }, + required: true, + }, + { + displayName: 'Document Name', + name: 'documentName', + type: 'string', + default: '', + description: 'The name (ID) of document you would like to get.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'get', + ], + }, + }, + required: true, + }, + + // ---------------------------------- + // document: delete + // ---------------------------------- + { + displayName: 'DocType', + name: 'docType', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocTypes', + }, + default: '', + description: 'The type of document you would like to delete.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'delete', + ], + }, + }, + required: true, + }, + { + displayName: 'Document Name', + name: 'documentName', + type: 'string', + default: '', + description: 'The name (ID) of document you would like to get.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'delete', + ], + }, + }, + required: true, + }, + + // ---------------------------------- + // document: update + // ---------------------------------- + { + displayName: 'DocType', + name: 'docType', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocTypes', + }, + default: '', + description: 'The type of document you would like to update', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Document Name', + name: 'documentName', + type: 'string', + default: '', + description: 'The name (ID) of document you would like to get.', + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'update', + ], + }, + }, + required: true, + }, + { + displayName: 'Properties', + name: 'properties', + type: 'fixedCollection', + placeholder: 'Add Property', + description: 'Properties of request body.', + default: {}, + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + resource: [ + 'document', + ], + operation: [ + 'update', + ], + }, + }, + options: [ + { + displayName: 'Property', + name: 'customProperty', + values: [ + { + displayName: 'Field', + name: 'field', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getDocFields', + loadOptionsDependsOn: [ + 'docType', + ], + }, + default: '', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + }, + ], + }, + ], + }, +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ERPNext/ERPNext.node.ts b/packages/nodes-base/nodes/ERPNext/ERPNext.node.ts new file mode 100644 index 0000000000..b5fc28a8bb --- /dev/null +++ b/packages/nodes-base/nodes/ERPNext/ERPNext.node.ts @@ -0,0 +1,268 @@ +import { + IExecuteFunctions, +} from 'n8n-core'; + +import { + IDataObject, + ILoadOptionsFunctions, + INodeExecutionData, + INodePropertyOptions, + INodeType, + INodeTypeDescription, +} from 'n8n-workflow'; + +import { + documentFields, + documentOperations, +} from './DocumentDescription'; + +import { + erpNextApiRequest, + erpNextApiRequestAllItems +} from './GenericFunctions'; + +import { + DocumentProperties, + processNames, + toSQL, +} from './utils'; + +export class ERPNext implements INodeType { + description: INodeTypeDescription = { + displayName: 'ERPNext', + name: 'erpNext', + icon: 'file:erpnext.svg', + group: ['output'], + version: 1, + subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}', + description: 'Consume ERPNext API', + defaults: { + name: 'ERPNext', + color: '#7574ff', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'erpNextApi', + required: true, + }, + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + options: [ + { + name: 'Document', + value: 'document', + }, + ], + default: 'document', + description: 'Resource to consume.', + }, + ...documentOperations, + ...documentFields, + ], + }; + + methods = { + loadOptions: { + async getDocTypes(this: ILoadOptionsFunctions): Promise { + const data = await erpNextApiRequestAllItems.call(this, 'data', 'GET', '/api/resource/DocType', {}); + const docTypes = data.map(({ name }: { name: string }) => { + return { name, value: encodeURI(name) }; + }); + + return processNames(docTypes); + }, + async getDocFilters(this: ILoadOptionsFunctions): Promise { + const docType = this.getCurrentNodeParameter('docType') as string; + const { data } = await erpNextApiRequest.call(this, 'GET', `/api/resource/DocType/${docType}`, {}); + + const docFields = data.fields.map(({ label, fieldname }: { label: string, fieldname: string }) => { + return ({ name: label, value: fieldname }); + }); + + docFields.unshift({ name: '*', value: '*' }); + + return processNames(docFields); + }, + async getDocFields(this: ILoadOptionsFunctions): Promise { + const docType = this.getCurrentNodeParameter('docType') as string; + const { data } = await erpNextApiRequest.call(this, 'GET', `/api/resource/DocType/${docType}`, {}); + + const docFields = data.fields.map(({ label, fieldname }: { label: string, fieldname: string }) => { + return ({ name: label, value: fieldname }); + }); + + return processNames(docFields); + }, + }, + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + const returnData: IDataObject[] = []; + let responseData; + + const body: IDataObject = {}; + const qs: IDataObject = {}; + + const resource = this.getNodeParameter('resource', 0) as string; + const operation = this.getNodeParameter('operation', 0) as string; + + for (let i = 0; i < items.length; i++) { + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/Resources/post_api_resource_Webhook + // https://frappeframework.com/docs/user/en/guides/integration/rest_api/manipulating_documents + + if (resource === 'document') { + + // ********************************************************************* + // document + // ********************************************************************* + + if (operation === 'get') { + + // ---------------------------------- + // document: get + // ---------------------------------- + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/General/get_api_resource__DocType___DocumentName_ + + const docType = this.getNodeParameter('docType', i) as string; + const documentName = this.getNodeParameter('documentName', i) as string; + + responseData = await erpNextApiRequest.call(this, 'GET', `/api/resource/${docType}/${documentName}`); + responseData = responseData.data; + } + + if (operation === 'getAll') { + + // ---------------------------------- + // document: getAll + // ---------------------------------- + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/General/get_api_resource__DocType_ + + const docType = this.getNodeParameter('docType', i) as string; + const endpoint = `/api/resource/${docType}`; + + const { + fields, + filters, + } = this.getNodeParameter('options', i) as { + fields: string[], + filters: { + customProperty: Array<{ field: string, operator: string, value: string }>, + }, + }; + + // fields=["test", "example", "hi"] + if (fields) { + if (fields.includes('*')) { + qs.fields = JSON.stringify(['*']); + } else { + qs.fields = JSON.stringify(fields); + } + } + // filters=[["Person","first_name","=","Jane"]] + // TODO: filters not working + if (filters) { + qs.filters = JSON.stringify(filters.customProperty.map((filter) => { + return [ + docType, + filter.field, + toSQL(filter.operator), + filter.value, + ]; + })); + } + + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + + if (!returnAll) { + const limit = this.getNodeParameter('limit', i) as number; + qs.limit_page_length = limit; + qs.limit_start = 0; + responseData = await erpNextApiRequest.call(this, 'GET', endpoint, {}, qs); + responseData = responseData.data; + + } else { + responseData = await erpNextApiRequestAllItems.call(this, 'data', 'GET', endpoint, {}, qs); + } + + } else if (operation === 'create') { + + // ---------------------------------- + // document: create + // ---------------------------------- + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/General/post_api_resource__DocType_ + + const properties = this.getNodeParameter('properties', i) as DocumentProperties; + + if (!properties.customProperty.length) { + throw new Error('Please enter at least one property for the document to create.'); + } + + properties.customProperty.forEach(property => { + body[property.field] = property.value; + }); + + const docType = this.getNodeParameter('docType', i) as string; + + responseData = await erpNextApiRequest.call(this, 'POST', `/api/resource/${docType}`, body); + responseData = responseData.data; + + } else if (operation === 'delete') { + + // ---------------------------------- + // document: delete + // ---------------------------------- + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/General/delete_api_resource__DocType___DocumentName_ + + const docType = this.getNodeParameter('docType', i) as string; + const documentName = this.getNodeParameter('documentName', i) as string; + + responseData = await erpNextApiRequest.call(this, 'DELETE', `/api/resource/${docType}/${documentName}`); + + } else if (operation === 'update') { + + // ---------------------------------- + // document: update + // ---------------------------------- + + // https://app.swaggerhub.com/apis-docs/alyf.de/ERPNext/11#/General/put_api_resource__DocType___DocumentName_ + + const properties = this.getNodeParameter('properties', i) as DocumentProperties; + + if (!properties.customProperty.length) { + throw new Error('Please enter at least one property for the document to update.'); + } + + properties.customProperty.forEach(property => { + body[property.field] = property.value; + }); + + const docType = this.getNodeParameter('docType', i) as string; + const documentName = this.getNodeParameter('documentName', i) as string; + + responseData = await erpNextApiRequest.call(this, 'PUT', `/api/resource/${docType}/${documentName}`, body); + responseData = responseData.data; + + } + } + + Array.isArray(responseData) + ? returnData.push(...responseData) + : returnData.push(responseData); + + } + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/ERPNext/GenericFunctions.ts b/packages/nodes-base/nodes/ERPNext/GenericFunctions.ts new file mode 100644 index 0000000000..b8da3d99d6 --- /dev/null +++ b/packages/nodes-base/nodes/ERPNext/GenericFunctions.ts @@ -0,0 +1,107 @@ +import { + OptionsWithUri, +} from 'request'; + +import { + IExecuteFunctions, + ILoadOptionsFunctions, +} from 'n8n-core'; + +import { + IDataObject, + IHookFunctions, + IWebhookFunctions +} from 'n8n-workflow'; + +export async function erpNextApiRequest( + this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions, + method: string, + resource: string, + body: IDataObject = {}, + query: IDataObject = {}, + uri?: string, + option: IDataObject = {}, +) { + + const credentials = this.getCredentials('erpNextApi'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + let options: OptionsWithUri = { + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + Authorization: `token ${credentials.apiKey}:${credentials.apiSecret}`, + }, + method, + body, + qs: query, + uri: uri || `https://${credentials.subdomain}.erpnext.com${resource}`, + json: true, + }; + + options = Object.assign({}, options, option); + + if (!Object.keys(options.body).length) { + delete options.body; + } + + if (!Object.keys(options.qs).length) { + delete options.qs; + } + try { + return await this.helpers.request!(options); + } catch (error) { + + if (error.statusCode === 403) { + throw new Error( + `ERPNext error response [${error.statusCode}]: DocType unavailable.`, + ); + } + + if (error.statusCode === 307) { + throw new Error( + `ERPNext error response [${error.statusCode}]: Please ensure the subdomain is correct.`, + ); + } + + let errorMessages; + if (error?.response?.body?._server_messages) { + const errors = JSON.parse(error.response.body._server_messages); + errorMessages = errors.map((e: string) => JSON.parse(e).message); + throw new Error( + `ARPNext error response [${error.statusCode}]: ${errorMessages.join('|')}`, + ); + } + + throw error; + } +} + +export async function erpNextApiRequestAllItems( + this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, + propertyName: string, + method: string, + resource: string, + body: IDataObject, + query: IDataObject = {}, +) { + // tslint:disable-next-line: no-any + const returnData: any[] = []; + + let responseData; + query!.limit_start = 0; + query!.limit_page_length = 1000; + + do { + responseData = await erpNextApiRequest.call(this, method, resource, body, query); + returnData.push.apply(returnData, responseData[propertyName]); + query!.limit_start += query!.limit_page_length - 1; + } while ( + responseData.data.length > 0 + ); + + return returnData; +} diff --git a/packages/nodes-base/nodes/ERPNext/erpnext.svg b/packages/nodes-base/nodes/ERPNext/erpnext.svg new file mode 100644 index 0000000000..3bf4e10dbd --- /dev/null +++ b/packages/nodes-base/nodes/ERPNext/erpnext.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/nodes-base/nodes/ERPNext/utils.ts b/packages/nodes-base/nodes/ERPNext/utils.ts new file mode 100644 index 0000000000..3d9852d8eb --- /dev/null +++ b/packages/nodes-base/nodes/ERPNext/utils.ts @@ -0,0 +1,30 @@ +import { + flow, + sortBy, + uniqBy, +} from 'lodash'; + +export type DocumentProperties = { + customProperty: Array<{ field: string; value: string; }>; +}; + +type DocFields = Array<{ name: string, value: string }>; + +const ensureName = (docFields: DocFields) => docFields.filter(o => o.name); +const sortByName = (docFields: DocFields) => sortBy(docFields, ['name']); +const uniqueByName = (docFields: DocFields) => uniqBy(docFields, o => o.name); + +export const processNames = flow(ensureName, sortByName, uniqueByName); + +export const toSQL = (operator: string) => { + const operators: { [key: string]: string } = { + 'is': '=', + 'isNot': '!=', + 'greater': '>', + 'less': '<', + 'equalsGreater': '>=', + 'equalsLess': '<=', + }; + + return operators[operator]; +}; diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index b545998de8..55cc068a38 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -75,6 +75,7 @@ "dist/credentials/DropboxOAuth2Api.credentials.js", "dist/credentials/EgoiApi.credentials.js", "dist/credentials/EmeliaApi.credentials.js", + "dist/credentials/ERPNextApi.credentials.js", "dist/credentials/EventbriteApi.credentials.js", "dist/credentials/EventbriteOAuth2Api.credentials.js", "dist/credentials/FacebookGraphApi.credentials.js", @@ -339,6 +340,7 @@ "dist/nodes/Emelia/Emelia.node.js", "dist/nodes/Emelia/EmeliaTrigger.node.js", "dist/nodes/ErrorTrigger.node.js", + "dist/nodes/ERPNext/ERPNext.node.js", "dist/nodes/Eventbrite/EventbriteTrigger.node.js", "dist/nodes/ExecuteCommand.node.js", "dist/nodes/ExecuteWorkflow.node.js", From f225bbbb84870d2488b1bb694e82f9699e2a4cb0 Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Sat, 3 Apr 2021 16:53:47 +0200 Subject: [PATCH 122/137] :sparkles: Add type casting to postgres queries (#1600) * 538 add support for casting types in postgres * Add typing to postgres insert nodes and removed unnecessary field from crate db * Added placeholder and description for types in postgres * Adding tests to insert and changes suggested by Ben * :zap: Minor improvement Co-authored-by: mutdmour Co-authored-by: Jan Oberhauser --- packages/nodes-base/nodes/HttpRequest.node.ts | 4 +- .../nodes/Postgres/Postgres.node.functions.ts | 38 +++-- .../nodes/Postgres/Postgres.node.ts | 8 +- .../nodes-base/nodes/QuestDb/QuestDb.node.ts | 18 +- .../Postgres/Postgres.node.functions.test.js | 158 ++++++++++++++++++ 5 files changed, 193 insertions(+), 33 deletions(-) create mode 100644 packages/nodes-base/test/nodes/Postgres/Postgres.node.functions.test.js diff --git a/packages/nodes-base/nodes/HttpRequest.node.ts b/packages/nodes-base/nodes/HttpRequest.node.ts index 43989cd73f..dfd7dff69a 100644 --- a/packages/nodes-base/nodes/HttpRequest.node.ts +++ b/packages/nodes-base/nodes/HttpRequest.node.ts @@ -829,7 +829,7 @@ export class HttpRequest implements INodeType { // Add Content Type if any are set if (options.bodyContentCustomMimeType) { - if(requestOptions.headers === undefined) { + if (requestOptions.headers === undefined) { requestOptions.headers = {}; } requestOptions.headers['Content-Type'] = options.bodyContentCustomMimeType; @@ -929,7 +929,7 @@ export class HttpRequest implements INodeType { if (property === 'body') { continue; } - returnItem[property] = response![property]; + returnItem[property] = response![property]; } newItem.json = returnItem; diff --git a/packages/nodes-base/nodes/Postgres/Postgres.node.functions.ts b/packages/nodes-base/nodes/Postgres/Postgres.node.functions.ts index eaeebe313e..df1f10cbbc 100644 --- a/packages/nodes-base/nodes/Postgres/Postgres.node.functions.ts +++ b/packages/nodes-base/nodes/Postgres/Postgres.node.functions.ts @@ -68,19 +68,22 @@ export async function pgInsert( const schema = getNodeParam('schema', 0) as string; let returnFields = (getNodeParam('returnFields', 0) as string).split(',') as string[]; const columnString = getNodeParam('columns', 0) as string; - const columns = columnString.split(',').map(column => column.trim()); - - const cs = new pgp.helpers.ColumnSet(columns); + const columns = columnString.split(',') + .map(column => column.trim().split(':')) + .map(([name, cast]) => ({ name, cast })); const te = new pgp.helpers.TableName({ table, schema }); // Prepare the data to insert and copy it to be returned - const insertItems = getItemCopy(items, columns); + const columnNames = columns.map(column => column.name); + const insertItems = getItemCopy(items, columnNames); + + const columnSet = new pgp.helpers.ColumnSet(columns); // Generate the multi-row insert query and return the id of new row returnFields = returnFields.map(value => value.trim()).filter(value => !!value); const query = - pgp.helpers.insert(insertItems, cs, te) + + pgp.helpers.insert(insertItems, columnSet, te) + (returnFields.length ? ` RETURNING ${returnFields.join(',')}` : ''); // Executing the query to insert the data @@ -109,21 +112,36 @@ export async function pgUpdate( const updateKey = getNodeParam('updateKey', 0) as string; const columnString = getNodeParam('columns', 0) as string; - const columns = columnString.split(',').map(column => column.trim()); + const [updateColumnName, updateColumnCast] = updateKey.split(':'); + const updateColumn = { + name: updateColumnName, + cast: updateColumnCast, + }; + + const columns = columnString.split(',') + .map(column => column.trim().split(':')) + .map(([name, cast]) => ({ name, cast })); const te = new pgp.helpers.TableName({ table, schema }); // Make sure that the updateKey does also get queried - if (!columns.includes(updateKey)) { - columns.unshift(updateKey); + const targetCol = columns.find((column) => column.name === updateColumn.name); + if (!targetCol) { + columns.unshift(updateColumn); + } + else if (!targetCol.cast) { + targetCol.cast = updateColumn.cast || targetCol.cast; } // Prepare the data to update and copy it to be returned - const updateItems = getItemCopy(items, columns); + const columnNames = columns.map(column => column.name); + const updateItems = getItemCopy(items, columnNames); + + const columnSet = new pgp.helpers.ColumnSet(columns); // Generate the multi-row update query const query = - pgp.helpers.update(updateItems, columns, te) + ' WHERE v.' + updateKey + ' = t.' + updateKey; + pgp.helpers.update(updateItems, columnSet, te) + ' WHERE v.' + updateColumn.name + ' = t.' + updateColumn.name; // Executing the query to update the data await db.none(query); diff --git a/packages/nodes-base/nodes/Postgres/Postgres.node.ts b/packages/nodes-base/nodes/Postgres/Postgres.node.ts index 1628510841..1250236d78 100644 --- a/packages/nodes-base/nodes/Postgres/Postgres.node.ts +++ b/packages/nodes-base/nodes/Postgres/Postgres.node.ts @@ -116,9 +116,9 @@ export class Postgres implements INodeType { }, }, default: '', - placeholder: 'id,name,description', + placeholder: 'id:int,name:text,description', description: - 'Comma separated list of the properties which should used as columns for the new rows.', + 'Comma separated list of the properties which should used as columns for the new rows.
You can use type casting with colons (:) like id:int.', }, { displayName: 'Return Fields', @@ -186,9 +186,9 @@ export class Postgres implements INodeType { }, }, default: '', - placeholder: 'name,description', + placeholder: 'name:text,description', description: - 'Comma separated list of the properties which should used as columns for rows to update.', + 'Comma separated list of the properties which should used as columns for rows to update.
You can use type casting with colons (:) like id:int.', }, ], }; diff --git a/packages/nodes-base/nodes/QuestDb/QuestDb.node.ts b/packages/nodes-base/nodes/QuestDb/QuestDb.node.ts index 15e7bcb2a5..c4b9036f0e 100644 --- a/packages/nodes-base/nodes/QuestDb/QuestDb.node.ts +++ b/packages/nodes-base/nodes/QuestDb/QuestDb.node.ts @@ -107,22 +107,6 @@ export class QuestDb implements INodeType { required: true, description: 'Name of the table in which to insert data to.', }, - { - displayName: 'Columns', - name: 'columns', - type: 'string', - displayOptions: { - show: { - operation: [ - 'insert', - ], - }, - }, - default: '', - placeholder: 'id,name,description', - description: - 'Comma separated list of the properties which should used as columns for the new rows.', - }, { displayName: 'Return Fields', name: 'returnFields', @@ -194,7 +178,7 @@ export class QuestDb implements INodeType { }).join(','); const query = `INSERT INTO ${tableName} (${columns.join(',')}) VALUES (${values});`; - queries.push(query); + queries.push(query); }); await db.any(pgp.helpers.concat(queries)); diff --git a/packages/nodes-base/test/nodes/Postgres/Postgres.node.functions.test.js b/packages/nodes-base/test/nodes/Postgres/Postgres.node.functions.test.js new file mode 100644 index 0000000000..bc3bcbb758 --- /dev/null +++ b/packages/nodes-base/test/nodes/Postgres/Postgres.node.functions.test.js @@ -0,0 +1,158 @@ +const PostgresFun = require('../../../nodes/Postgres/Postgres.node.functions') +const pgPromise = require('pg-promise'); + +describe('pgUpdate', () => { + it('runs query to update db', async () => { + const updateItem = {id: 1234, name: 'test'}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + updateKey: 'id', + columns: 'id,name' + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const none = jest.fn(); + const db = {none}; + + const items = [ + { + json: updateItem + } + ]; + + const results = await PostgresFun.pgUpdate(getNodeParam, pgp, db, items) + + expect(db.none).toHaveBeenCalledWith(`update \"myschema\".\"mytable\" as t set \"id\"=v.\"id\",\"name\"=v.\"name\" from (values(1234,'test')) as v(\"id\",\"name\") WHERE v.id = t.id`); + expect(results).toEqual([updateItem]); + }); + + it('runs query to update db if updateKey is not in columns', async () => { + const updateItem = {id: 1234, name: 'test'}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + updateKey: 'id', + columns: 'name' + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const none = jest.fn(); + const db = {none}; + + const items = [ + { + json: updateItem + } + ]; + + const results = await PostgresFun.pgUpdate(getNodeParam, pgp, db, items) + + expect(db.none).toHaveBeenCalledWith(`update \"myschema\".\"mytable\" as t set \"id\"=v.\"id\",\"name\"=v.\"name\" from (values(1234,'test')) as v(\"id\",\"name\") WHERE v.id = t.id`); + expect(results).toEqual([updateItem]); + }); + + it('runs query to update db with cast as updateKey', async () => { + const updateItem = {id: '1234', name: 'test'}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + updateKey: 'id:uuid', + columns: 'name' + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const none = jest.fn(); + const db = {none}; + + const items = [ + { + json: updateItem + } + ]; + + const results = await PostgresFun.pgUpdate(getNodeParam, pgp, db, items) + + expect(db.none).toHaveBeenCalledWith(`update \"myschema\".\"mytable\" as t set \"id\"=v.\"id\",\"name\"=v.\"name\" from (values('1234'::uuid,'test')) as v(\"id\",\"name\") WHERE v.id = t.id`); + expect(results).toEqual([updateItem]); + }); + + it('runs query to update db with cast in target columns', async () => { + const updateItem = {id: '1234', name: 'test'}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + updateKey: 'id', + columns: 'id:uuid,name' + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const none = jest.fn(); + const db = {none}; + + const items = [ + { + json: updateItem + } + ]; + + const results = await PostgresFun.pgUpdate(getNodeParam, pgp, db, items) + + expect(db.none).toHaveBeenCalledWith(`update \"myschema\".\"mytable\" as t set \"id\"=v.\"id\",\"name\"=v.\"name\" from (values('1234'::uuid,'test')) as v(\"id\",\"name\") WHERE v.id = t.id`); + expect(results).toEqual([updateItem]); + }); +}); + + + +describe('pgInsert', () => { + it('runs query to insert', async () => { + const insertItem = {id: 1234, name: 'test', age: 34}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + columns: 'id,name,age', + returnFields: '*', + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const manyOrNone = jest.fn(); + const db = {manyOrNone}; + + const items = [ + { + json: insertItem, + }, + ]; + + const results = await PostgresFun.pgInsert(getNodeParam, pgp, db, items); + + expect(db.manyOrNone).toHaveBeenCalledWith(`insert into \"myschema\".\"mytable\"(\"id\",\"name\",\"age\") values(1234,'test',34) RETURNING *`); + expect(results).toEqual([undefined, [insertItem]]); + }); + + it('runs query to insert with type casting', async () => { + const insertItem = {id: 1234, name: 'test', age: 34}; + const nodeParams = { + table: 'mytable', + schema: 'myschema', + columns: 'id:int,name:text,age', + returnFields: '*', + }; + const getNodeParam = (key) => nodeParams[key]; + const pgp = pgPromise(); + const manyOrNone = jest.fn(); + const db = {manyOrNone}; + + const items = [ + { + json: insertItem, + }, + ]; + + const results = await PostgresFun.pgInsert(getNodeParam, pgp, db, items); + + expect(db.manyOrNone).toHaveBeenCalledWith(`insert into \"myschema\".\"mytable\"(\"id\",\"name\",\"age\") values(1234::int,'test'::text,34) RETURNING *`); + expect(results).toEqual([undefined, [insertItem]]); + }); +}); From bf5ed9d8cf1488ea235ab49a2df3b86ebfcc26f4 Mon Sep 17 00:00:00 2001 From: Harshil Agrawal Date: Sat, 3 Apr 2021 16:59:07 +0200 Subject: [PATCH 123/137] :zap: Update description for file path and folder (#1282) --- .../nodes/NextCloud/NextCloud.node.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/nodes-base/nodes/NextCloud/NextCloud.node.ts b/packages/nodes-base/nodes/NextCloud/NextCloud.node.ts index 096b39427f..dd65e4d86b 100644 --- a/packages/nodes-base/nodes/NextCloud/NextCloud.node.ts +++ b/packages/nodes-base/nodes/NextCloud/NextCloud.node.ts @@ -233,7 +233,7 @@ export class NextCloud implements INodeType { }, }, placeholder: '/invoices/original.txt', - description: 'The path of file or folder to copy.', + description: 'The path of file or folder to copy. The path should start with "/"', }, { displayName: 'To Path', @@ -253,7 +253,7 @@ export class NextCloud implements INodeType { }, }, placeholder: '/invoices/copy.txt', - description: 'The destination path of file or folder.', + description: 'The destination path of file or folder. The path should start with "/"', }, // ---------------------------------- @@ -276,8 +276,8 @@ export class NextCloud implements INodeType { ], }, }, - placeholder: 'invoices/2019/invoice_1.pdf', - description: 'The path to delete. Can be a single file or a whole folder.', + placeholder: '/invoices/2019/invoice_1.pdf', + description: 'The path to delete. Can be a single file or a whole folder. The path should start with "/"', }, // ---------------------------------- @@ -301,7 +301,7 @@ export class NextCloud implements INodeType { }, }, placeholder: '/invoices/old_name.txt', - description: 'The path of file or folder to move.', + description: 'The path of file or folder to move. The path should start with "/"', }, { displayName: 'To Path', @@ -321,7 +321,7 @@ export class NextCloud implements INodeType { }, }, placeholder: '/invoices/new_name.txt', - description: 'The new path of file or folder.', + description: 'The new path of file or folder. The path should start with "/"', }, // ---------------------------------- @@ -343,8 +343,8 @@ export class NextCloud implements INodeType { ], }, }, - placeholder: 'invoices/2019/invoice_1.pdf', - description: 'The file path of the file to download. Has to contain the full path.', + placeholder: '/invoices/2019/invoice_1.pdf', + description: 'The file path of the file to download. Has to contain the full path. The path should start with "/"', }, { displayName: 'Binary Property', @@ -384,8 +384,8 @@ export class NextCloud implements INodeType { ], }, }, - placeholder: 'invoices/2019/invoice_1.pdf', - description: 'The file path of the file to upload. Has to contain the full path. The parent folder has to exist. Existing files get overwritten.', + placeholder: '/invoices/2019/invoice_1.pdf', + description: 'The absolute file path of the file to upload. Has to contain the full path. The parent folder has to exist. Existing files get overwritten.', }, { displayName: 'Binary Data', @@ -476,8 +476,8 @@ export class NextCloud implements INodeType { ], }, }, - placeholder: 'invoices/2019', - description: 'The folder to create. The parent folder has to exist.', + placeholder: '/invoices/2019', + description: 'The folder to create. The parent folder has to exist. The path should start with "/"', }, // ---------------------------------- @@ -498,8 +498,8 @@ export class NextCloud implements INodeType { ], }, }, - placeholder: 'invoices/2019/', - description: 'The path of which to list the content.', + placeholder: '/invoices/2019/', + description: 'The path of which to list the content. The path should start with "/"', }, // ---------------------------------- From 5e2aa023fcc020c25561fd433c79924c12837e2e Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:08:33 +0000 Subject: [PATCH 124/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-core@0.67?= =?UTF-8?q?.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index f6414a7281..f0eee7085c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "n8n-core", - "version": "0.66.0", + "version": "0.67.0", "description": "Core functionality of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 7dc0f53b60f465b5934938eb221e4546e2594502 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:08:47 +0000 Subject: [PATCH 125/137] :arrow_up: Set n8n-core@0.67.0 on n8n-nodes-base --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 55cc068a38..c5b1d32383 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -611,7 +611,7 @@ "mqtt": "4.2.1", "mssql": "^6.2.0", "mysql2": "~2.1.0", - "n8n-core": "~0.66.0", + "n8n-core": "~0.67.0", "nodemailer": "^6.4.6", "pdf-parse": "^1.1.1", "pg": "^8.3.0", From 4ef927e3771bcd88418752d6d1e05249ef607660 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:08:47 +0000 Subject: [PATCH 126/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-nodes-bas?= =?UTF-8?q?e@0.111.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index c5b1d32383..f7a15339d7 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "0.110.0", + "version": "0.111.0", "description": "Base nodes of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 83cc2eef16e48bb2e6ff071ca416390ee6b83820 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:09:58 +0000 Subject: [PATCH 127/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n-editor-ui?= =?UTF-8?q?@0.84.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index e383f9d4fa..806d31c247 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "0.83.0", + "version": "0.84.0", "description": "Workflow Editor UI for n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 039b5a6afdf68276c6bceeb2088a4e9490d99727 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:10:41 +0000 Subject: [PATCH 128/137] :arrow_up: Set n8n-core@0.67.0, n8n-editor-ui@0.84.0 and n8n-nodes-base@0.111.0 on n8n --- packages/cli/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 7c78b903ea..4bd675ce7c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -104,9 +104,9 @@ "localtunnel": "^2.0.0", "lodash.get": "^4.4.2", "mysql2": "~2.1.0", - "n8n-core": "~0.66.0", - "n8n-editor-ui": "~0.83.0", - "n8n-nodes-base": "~0.110.0", + "n8n-core": "~0.67.0", + "n8n-editor-ui": "~0.84.0", + "n8n-nodes-base": "~0.111.0", "n8n-workflow": "~0.55.0", "oauth-1.0a": "^2.2.6", "open": "^7.0.0", From 0c8afbb3cb798637aa5361e6a218dff80c79521c Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 3 Apr 2021 15:10:41 +0000 Subject: [PATCH 129/137] =?UTF-8?q?:bookmark:=20Release=C2=A0n8n@0.114.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 4bd675ce7c..a0e9583c94 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "0.113.0", + "version": "0.114.0", "description": "n8n Workflow Automation Tool", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 51f066cbcd7a7d24c9e3885b8aef06d20d9d173d Mon Sep 17 00:00:00 2001 From: s <59780143+stwonary@users.noreply.github.com> Date: Sun, 4 Apr 2021 04:33:22 -0400 Subject: [PATCH 130/137] :sparkles: Add RabbitMQ Header parameter (#1622) * Add RabbitMQ Exchange's Header parameter * code refactoring * remove log --- .../nodes/RabbitMQ/DefaultOptions.ts | 31 ++++++++++++++ .../nodes/RabbitMQ/RabbitMQ.node.ts | 42 ++++++++++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/RabbitMQ/DefaultOptions.ts b/packages/nodes-base/nodes/RabbitMQ/DefaultOptions.ts index 10d295dc03..bab50fa743 100644 --- a/packages/nodes-base/nodes/RabbitMQ/DefaultOptions.ts +++ b/packages/nodes-base/nodes/RabbitMQ/DefaultOptions.ts @@ -36,6 +36,37 @@ export const rabbitDefaultOptions: Array { + additionalHeaders[header.key as string] = header.value; + }); + headers = additionalHeaders; + } + channel = await rabbitmqConnectExchange.call(this, exchange, type, options); const sendInputData = this.getNodeParameter('sendInputData', 0) as boolean; @@ -336,7 +376,7 @@ export class RabbitMQ implements INodeType { message = this.getNodeParameter('message', i) as string; } - exchangePromises.push(channel.publish(exchange, routingKey, Buffer.from(message))); + exchangePromises.push(channel.publish(exchange, routingKey, Buffer.from(message), {headers})); } // @ts-ignore From 55c67d8a20505db6ab5dbc20084649ba6260691f Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 4 Apr 2021 10:33:53 +0200 Subject: [PATCH 131/137] :zap: Minor improvements to RabbitMQ headers --- .../nodes/RabbitMQ/RabbitMQ.node.ts | 121 ++++++++++-------- 1 file changed, 66 insertions(+), 55 deletions(-) diff --git a/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts b/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts index 3b9cd60c6f..c1b332fe18 100644 --- a/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts +++ b/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts @@ -177,6 +177,20 @@ export class RabbitMQ implements INodeType { default: {}, placeholder: 'Add Option', options: [ + { + displayName: 'Alternate Exchange', + name: 'alternateExchange', + type: 'string', + displayOptions: { + show: { + '/mode': [ + 'exchange', + ], + }, + }, + default: '', + description: 'An exchange to send messages to if this exchange can’t route them to any queues', + }, { displayName: 'Arguments', name: 'arguments', @@ -208,37 +222,6 @@ export class RabbitMQ implements INodeType { }, ], }, - { - displayName: 'Headers', - name: 'headers', - placeholder: 'Add Header', - description: 'Headers to add.', - type: 'fixedCollection', - typeOptions: { - multipleValues: true, - }, - default: {}, - options: [ - { - name: 'header', - displayName: 'Header', - values: [ - { - displayName: 'Key', - name: 'key', - type: 'string', - default: '', - }, - { - displayName: 'Value', - name: 'value', - type: 'string', - default: '', - }, - ], - }, - ], - }, { displayName: 'Auto Delete', name: 'autoDelete', @@ -268,18 +251,35 @@ export class RabbitMQ implements INodeType { description: 'Scopes the queue to the connection.', }, { - displayName: 'Alternate Exchange', - name: 'alternateExchange', - type: 'string', - displayOptions: { - show: { - '/mode': [ - 'exchange', + displayName: 'Headers', + name: 'headers', + placeholder: 'Add Header', + description: 'Headers to add.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'header', + displayName: 'Header', + values: [ + { + displayName: 'Key', + name: 'key', + type: 'string', + default: '', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + }, ], }, - }, - default: '', - description: 'An exchange to send messages to if this exchange can’t route them to any queues', + ], }, ], }, @@ -287,7 +287,7 @@ export class RabbitMQ implements INodeType { }; async execute(this: IExecuteFunctions): Promise { - let channel; + let channel, options: IDataObject; try { const items = this.getInputData(); const mode = this.getNodeParameter('mode', 0) as string; @@ -297,7 +297,7 @@ export class RabbitMQ implements INodeType { if (mode === 'queue') { const queue = this.getNodeParameter('queue', 0) as string; - const options = this.getNodeParameter('options', 0, {}) as IDataObject; + options = this.getNodeParameter('options', 0, {}) as IDataObject; channel = await rabbitmqConnectQueue.call(this, queue, options); @@ -313,7 +313,17 @@ export class RabbitMQ implements INodeType { message = this.getNodeParameter('message', i) as string; } - queuePromises.push(channel.sendToQueue(queue, Buffer.from(message))); + let headers: IDataObject = {}; + if (options.headers && ((options.headers as IDataObject).header! as IDataObject[]).length) { + let itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; + const additionalHeaders: IDataObject = {}; + ((itemOptions.headers as IDataObject).header as IDataObject[]).forEach((header: IDataObject) => { + additionalHeaders[header.key as string] = header.value; + }); + headers = additionalHeaders; + } + + queuePromises.push(channel.sendToQueue(queue, Buffer.from(message), { headers })); } // @ts-ignore @@ -351,16 +361,7 @@ export class RabbitMQ implements INodeType { const type = this.getNodeParameter('exchangeType', 0) as string; const routingKey = this.getNodeParameter('routingKey', 0) as string; - const options = this.getNodeParameter('options', 0, {}) as IDataObject; - - let headers : IDataObject = {}; - if (options.headers && ((options.headers as IDataObject).header! as IDataObject[]).length) { - const additionalHeaders: IDataObject = {}; - ((options.headers as IDataObject).header as IDataObject[]).forEach((header: IDataObject) => { - additionalHeaders[header.key as string] = header.value; - }); - headers = additionalHeaders; - } + options = this.getNodeParameter('options', 0, {}) as IDataObject; channel = await rabbitmqConnectExchange.call(this, exchange, type, options); @@ -376,7 +377,17 @@ export class RabbitMQ implements INodeType { message = this.getNodeParameter('message', i) as string; } - exchangePromises.push(channel.publish(exchange, routingKey, Buffer.from(message), {headers})); + let headers: IDataObject = {}; + if (options.headers && ((options.headers as IDataObject).header! as IDataObject[]).length) { + let itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; + const additionalHeaders: IDataObject = {}; + ((itemOptions.headers as IDataObject).header as IDataObject[]).forEach((header: IDataObject) => { + additionalHeaders[header.key as string] = header.value; + }); + headers = additionalHeaders; + } + + exchangePromises.push(channel.publish(exchange, routingKey, Buffer.from(message), { headers })); } // @ts-ignore From 012818b8047685343935c02b472267764f0dc578 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 4 Apr 2021 10:49:25 +0200 Subject: [PATCH 132/137] :shirt: Fix lint issue --- packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts b/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts index c1b332fe18..80a209c4e4 100644 --- a/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts +++ b/packages/nodes-base/nodes/RabbitMQ/RabbitMQ.node.ts @@ -315,7 +315,7 @@ export class RabbitMQ implements INodeType { let headers: IDataObject = {}; if (options.headers && ((options.headers as IDataObject).header! as IDataObject[]).length) { - let itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; + const itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; const additionalHeaders: IDataObject = {}; ((itemOptions.headers as IDataObject).header as IDataObject[]).forEach((header: IDataObject) => { additionalHeaders[header.key as string] = header.value; @@ -379,7 +379,7 @@ export class RabbitMQ implements INodeType { let headers: IDataObject = {}; if (options.headers && ((options.headers as IDataObject).header! as IDataObject[]).length) { - let itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; + const itemOptions = this.getNodeParameter('options', i, {}) as IDataObject; const additionalHeaders: IDataObject = {}; ((itemOptions.headers as IDataObject).header as IDataObject[]).forEach((header: IDataObject) => { additionalHeaders[header.key as string] = header.value; From 001c6b7cc9e3afe97658618bedc67f33eb305e55 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 4 Apr 2021 17:58:25 +0200 Subject: [PATCH 133/137] :bug: Fix bug that expressions could not be displayed in read-only mode --- packages/editor-ui/src/components/ExpressionInput.vue | 9 ++++----- packages/editor-ui/src/components/ParameterInput.vue | 5 +---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/editor-ui/src/components/ExpressionInput.vue b/packages/editor-ui/src/components/ExpressionInput.vue index 13c914ed17..a42ff6613b 100644 --- a/packages/editor-ui/src/components/ExpressionInput.vue +++ b/packages/editor-ui/src/components/ExpressionInput.vue @@ -12,23 +12,22 @@ import 'quill/dist/quill.core.css'; import Quill, { DeltaOperation } from 'quill'; // @ts-ignore -import AutoFormat, { AutoformatHelperAttribute } from 'quill-autoformat'; +import AutoFormat from 'quill-autoformat'; import { NodeParameterValue, Workflow, - WorkflowDataProxy, } from 'n8n-workflow'; import { - IExecutionResponse, IVariableItemSelected, - IVariableSelectorOption, } from '@/Interface'; +import { genericHelpers } from '@/components/mixins/genericHelpers'; import { workflowHelpers } from '@/components/mixins/workflowHelpers'; import mixins from 'vue-typed-mixins'; export default mixins( + genericHelpers, workflowHelpers, ) .extend({ @@ -119,7 +118,7 @@ export default mixins( }; this.editor = new Quill(this.$refs['expression-editor'] as Element, { - readOnly: !!this.resolvedValue, + readOnly: !!this.resolvedValue || this.isReadOnly, modules: { autoformat: {}, keyboard: { diff --git a/packages/editor-ui/src/components/ParameterInput.vue b/packages/editor-ui/src/components/ParameterInput.vue index 5f77346c3f..225859590f 100644 --- a/packages/editor-ui/src/components/ParameterInput.vue +++ b/packages/editor-ui/src/components/ParameterInput.vue @@ -10,7 +10,7 @@
- +
@@ -523,9 +523,6 @@ export default mixins( this.valueChanged(value); }, setFocus () { - if (this.isReadOnly === true) { - return; - } if (this.isValueExpression) { this.expressionEditDialogVisible = true; return; From cf733872143c6512b87fd6a3ade54d9c84ab5435 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 4 Apr 2021 18:03:41 +0200 Subject: [PATCH 134/137] :bug: Do now allow to edit JavaScript code in read-only mode --- .../editor-ui/src/components/CodeEdit.vue | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/packages/editor-ui/src/components/CodeEdit.vue b/packages/editor-ui/src/components/CodeEdit.vue index d89e820b09..fb1c02521d 100644 --- a/packages/editor-ui/src/components/CodeEdit.vue +++ b/packages/editor-ui/src/components/CodeEdit.vue @@ -6,7 +6,7 @@ {{parameter.displayName}}:
- +
@@ -14,42 +14,43 @@