Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk ist ein CRM für den Aufbau von Beziehungen nach Maßstab. Verwalten Sie Ihre Kontakte, Unternehmen und Beziehungen an einem Ort.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Ihr Folk-API-Schlüssel. Sie können Ihre API-Schlüssel in Ihren Workspace-Einstellungen unter \"API\" unter https://app.folk.app/apps/contacts/network/settings/api-keys anzeigen und verwalten",
"Create Company": "Firma erstellen",
"Update Company": "Firma aktualisieren",
"Create Person": "Person erstellen",
"Update Person": "Person aktualisieren",
"Find Company": "Firma finden",
"Get Company": "Firma holen",
"List People": "Personen auflisten",
"Get Person": "Person holen",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Erstellen Sie eine neue Firma in Ihrem Arbeitsbereich Folk. Sie können E-Mails, Links, Telefonnummern hinzufügen und einer Gruppe zuordnen.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Aktualisieren Sie ein bestehendes Unternehmen in Ihrem Arbeitsbereich Folk. Wählen Sie das Unternehmen aus der Dropdown-Liste aus, um seine Details zu aktualisieren.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Erstellen Sie eine neue Person in Ihrem Folk-Arbeitsbereich. Sie können sie mit einem Unternehmen verknüpfen, Kontaktdaten hinzufügen und einer Gruppe zuweisen.",
"Update an existing person in your Folk workspace with new information.": "Aktualisieren Sie eine vorhandene Person in Ihrem Folk-Arbeitsbereich mit neuen Informationen.",
"Search for companies in your Folk workspace by name or email address.": "Suchen Sie nach Firmen in Ihrem Arbeitsbereich nach Namen oder E-Mail-Adresse.",
"Retrieve detailed information about a company from your Folk workspace.": "Rufen Sie detaillierte Informationen über ein Unternehmen aus Ihrem Arbeitsbereich ab.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Rufen Sie eine paginierte Liste von Personen in Ihrem Folk-Arbeitsbereich mit optionaler Filterung ab.",
"Retrieve detailed information about a person from your Folk workspace.": "Rufen Sie detaillierte Informationen über eine Person aus Ihrem Arbeitsbereich ab.",
"Company Name": "Firmenname",
"Description": "Beschreibung",
"Industry": "Industrie",
"Addresses": "Adressen",
"Emails": "E-Mails",
"Phone Numbers": "Telefonnummern",
"URLs": "URLs",
"Group ID": "Gruppen-ID",
"Company": "Firma",
"First Name": "Vorname",
"Last Name": "Nachname",
"Full Name": "Voller Name",
"Birthday": "Geburtstag",
"Job Title": "Job Titel",
"Company Names": "Firmennamen",
"Companies": "Firmen",
"Person": "Person",
"Search Query": "Suchanfrage",
"Limit": "Limit",
"Cursor": "Cursor",
"Filter Combinator": "Filterkombinator",
"Name Filter": "Namensfilter",
"Email Filter": "E-Mail-Filter",
"The name of the company": "Der Name der Firma",
"A short description of the company": "Eine kurze Beschreibung des Unternehmens",
"The industry the company operates in": "Die Branche, in der das Unternehmen tätig ist",
"Physical addresses for the company. The first address is primary.": "Physikalische Adressen für das Unternehmen. Die erste Adresse ist die primäre Adresse.",
"Email addresses for the company. The first email is primary.": "E-Mail-Adressen für das Unternehmen. Die erste E-Mail ist primär.",
"Phone numbers for the company. The first phone is primary.": "Telefonnummern für das Unternehmen. Das erste Telefon ist primär.",
"Website URLs for the company. The first URL is primary.": "Website-URLs für das Unternehmen. Die erste URL ist primär.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Geben Sie eine Folk Group ID ein (z.B. grp_abc123). Gruppen helfen Ihnen, Ihre Kontakte zu organisieren.",
"Select a company from your Folk workspace.": "Wählen Sie eine Firma aus Ihrem Arbeitsbereich Folk.",
"The first name of the person": "Der Vorname der Person",
"The last name of the person": "Der Nachname der Person",
"The full name of the person (alternative to first/last)": "Der vollständige Name der Person (Alternative zur Vor/Letzten)",
"A short description of the person": "Eine kurze Beschreibung der Person",
"The birthday in YYYY-MM-DD format": "Geburtstag im Format JJJJJ-MM-TT",
"The job title of the person": "Der Job-Titel der Person",
"The names of companies to associate with the person. The first company will be primary.": "Die Namen der Unternehmen, die mit der Person assoziiert werden sollen.",
"Select companies to associate with the person.": "Wählen Sie Unternehmen aus, die mit der Person assoziiert werden sollen.",
"Physical addresses for the person. The first address is primary.": "Physikalische Adressen für die Person. Die erste Adresse ist primär.",
"Email addresses for the person. The first email is primary.": "E-Mail-Adresse für die Person. Die erste E-Mail ist primär.",
"Phone numbers for the person. The first phone is primary.": "Telefonnummern für die Person. Das erste Telefon ist primär.",
"Website URLs for the person. The first URL is primary.": "Website-URLs für die Person. Die erste URL ist primär.",
"Select a person from your Folk workspace.": "Wählen Sie eine Person aus Ihrem Folk-Arbeitsbereich.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Firmennamen zum Erstellen oder Verbinden mit Unternehmen werden erstellt, wenn sie nicht existieren.",
"Enter company name or email to search for": "Firmenname oder E-Mail eingeben um zu suchen",
"The number of items to return (1-100)": "Die Anzahl der zurückzugebenden Artikel (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "Ein Cursor für die Seiteneingabe. Verwenden Sie den nextLink-Wert einer vorherigen Antwort.",
"The logical operator to combine multiple filters": "Der logische Operator, um mehrere Filter zu kombinieren",
"Filter by person name (contains)": "Nach Personennamen filtern (enthält)",
"Filter by email address (contains)": "Nach E-Mail-Adresse filtern (enthält)",
"AND": "UND",
"OR": "ODER",
"Company Added": "Firma hinzugefügt",
"Company Removed": "Firma entfernt",
"Company Updated": "Firma aktualisiert",
"Company Groups Updated": "Unternehmensgruppen aktualisiert",
"Person Added": "Person hinzugefügt",
"Person Removed": "Person entfernt",
"Person Updated": "Person aktualisiert",
"Person Groups Updated": "Personengruppen aktualisiert",
"Fires when a new company is added to your Folk workspace.": "Feuert ab, wenn eine neue Firma Ihrem Arbeitsbereich hinzugefügt wird.",
"Fires when a company is removed from your Folk workspace.": "Feuert ab, wenn eine Firma aus Ihrem Folk-Arbeitsbereich entfernt wird.",
"Fires when a company is updated in your Folk workspace.": "Feuert ab, wenn eine Firma in Ihrem Arbeitsbereich \"Folk\" aktualisiert wird.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Feuer, wenn die Aufgaben einer Unternehmensgruppe im Arbeitsbereich Folk aktualisiert werden.",
"Fires when a new person is added to your Folk workspace.": "Feuert ab, wenn eine neue Person deinem Arbeitsbereich hinzugefügt wird.",
"Fires when a person is removed from your Folk workspace.": "Feuert ab, wenn eine Person aus Ihrem Folk-Arbeitsbereich entfernt wird.",
"Fires when a person is updated in your Folk workspace.": "Feuert ab, wenn eine Person im Arbeitsbereich Folk aktualisiert wird.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Feuer, wenn die Gruppenzuordnungen einer Person im Arbeitsbereich Folk aktualisiert werden."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk es un CRM para construir relaciones a escala. Gestione sus contactos, empresas y relaciones en un solo lugar.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Su clave API popular. Puede ver y administrar sus claves API en la configuración de su espacio de trabajo en la sección \"API\" en https://app.folk.app/apps/contacts/network/settings/api-keys",
"Create Company": "Crear empresa",
"Update Company": "Actualizar Compañía",
"Create Person": "Crear Persona",
"Update Person": "Actualizar Persona",
"Find Company": "Buscar empresa",
"Get Company": "Obtener empresa",
"List People": "Listar Personas",
"Get Person": "Obtener Persona",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Crea una nueva empresa en tu área de trabajo popular. Puedes añadir correos electrónicos, enlaces, números de teléfono y asignarlo a un grupo.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Actualice una empresa existente en su espacio de trabajo popular. Seleccione la empresa en el menú desplegable para actualizar sus detalles.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Crea una nueva persona en tu espacio de trabajo popular. Puedes enlazarlos a una empresa, añadir datos de contacto y asignar a un grupo.",
"Update an existing person in your Folk workspace with new information.": "Actualice una persona existente en su área de trabajo con nueva información.",
"Search for companies in your Folk workspace by name or email address.": "Buscar empresas en su espacio de trabajo popular por nombre o dirección de correo electrónico.",
"Retrieve detailed information about a company from your Folk workspace.": "Recupere información detallada sobre una empresa de su espacio de trabajo popular.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Recupere una lista paginada de personas en su espacio de trabajo popular con filtrado opcional.",
"Retrieve detailed information about a person from your Folk workspace.": "Recupere información detallada sobre una persona de su espacio de trabajo popular.",
"Company Name": "Nombre De La Empresa",
"Description": "Descripción",
"Industry": "Industria",
"Addresses": "Direcciones",
"Emails": "Correos",
"Phone Numbers": "Números de teléfono",
"URLs": "URLs",
"Group ID": "ID de grupo",
"Company": "Empresa",
"First Name": "Nombre",
"Last Name": "Apellido",
"Full Name": "Nombre completo",
"Birthday": "Cumpleaños",
"Job Title": "Trabajo",
"Company Names": "Nombres de la empresa",
"Companies": "Empresas",
"Person": "Persona",
"Search Query": "Buscar consulta",
"Limit": "Límite",
"Cursor": "Cursor",
"Filter Combinator": "Filtrar combinador",
"Name Filter": "Filtro de nombres",
"Email Filter": "Filtro de Email",
"The name of the company": "El nombre de la empresa",
"A short description of the company": "Una breve descripción de la empresa",
"The industry the company operates in": "La industria en la que opera la empresa",
"Physical addresses for the company. The first address is primary.": "Direcciones físicas para la empresa. La primera dirección es primaria.",
"Email addresses for the company. The first email is primary.": "Direcciones de correo electrónico para la empresa. El primer correo electrónico es principal.",
"Phone numbers for the company. The first phone is primary.": "Números de teléfono para la empresa. El primer teléfono es primario.",
"Website URLs for the company. The first URL is primary.": "URL del sitio web de la empresa. La primera URL es principal.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Introduzca un ID de grupo folk (por ejemplo, grp_abc123). Los grupos le ayudan a organizar sus contactos.",
"Select a company from your Folk workspace.": "Seleccione una empresa de su área de trabajo popular.",
"The first name of the person": "El nombre de la persona",
"The last name of the person": "El apellido de la persona",
"The full name of the person (alternative to first/last)": "El nombre completo de la persona (alternativa al primero/último)",
"A short description of the person": "Una breve descripción de la persona",
"The birthday in YYYY-MM-DD format": "El cumpleaños en formato AAA-MM-DD",
"The job title of the person": "El título del trabajo de la persona",
"The names of companies to associate with the person. The first company will be primary.": "Los nombres de las empresas que se asocian con la persona, la primera empresa será primaria.",
"Select companies to associate with the person.": "Seleccione las empresas a las que asociar con la persona.",
"Physical addresses for the person. The first address is primary.": "Direcciones físicas para la persona. La primera dirección es primaria.",
"Email addresses for the person. The first email is primary.": "Direcciones de correo electrónico para la persona. El primer correo es principal.",
"Phone numbers for the person. The first phone is primary.": "Número de teléfono para la persona. El primer teléfono es primario.",
"Website URLs for the person. The first URL is primary.": "URL del sitio web para la persona. La primera URL es principal.",
"Select a person from your Folk workspace.": "Seleccione una persona de su área de trabajo popular.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Nombres de empresas para crear o asociar. Las empresas se crearán si no existen.",
"Enter company name or email to search for": "Introduzca el nombre de la empresa o el correo electrónico para buscar",
"The number of items to return (1-100)": "El número de elementos a devolver (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "Un cursor para la paginación. Utilice el valor nextLink de una respuesta anterior.",
"The logical operator to combine multiple filters": "El operador lógico para combinar múltiples filtros",
"Filter by person name (contains)": "Filtrar por nombre de persona (contiene)",
"Filter by email address (contains)": "Filtrar por dirección de correo electrónico (contiene)",
"AND": "Y",
"OR": "O",
"Company Added": "Compañía añadida",
"Company Removed": "Compañía eliminada",
"Company Updated": "Empresa Actualizada",
"Company Groups Updated": "Grupos de Compañía Actualizados",
"Person Added": "Persona añadida",
"Person Removed": "Persona eliminada",
"Person Updated": "Persona actualizada",
"Person Groups Updated": "Grupos de personas actualizados",
"Fires when a new company is added to your Folk workspace.": "Inicia cuando una nueva empresa se agrega a su espacio de trabajo popular.",
"Fires when a company is removed from your Folk workspace.": "Dispara cuando una empresa es removida de su espacio de trabajo popular.",
"Fires when a company is updated in your Folk workspace.": "Inicia cuando una empresa se actualiza en su espacio de trabajo popular.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Dispara cuando las asignaciones de grupo de una empresa se actualizan en su área de trabajo popular.",
"Fires when a new person is added to your Folk workspace.": "Dispara cuando una nueva persona se agrega a tu espacio de trabajo popular.",
"Fires when a person is removed from your Folk workspace.": "Dispara cuando una persona es removida de su espacio de trabajo popular.",
"Fires when a person is updated in your Folk workspace.": "Dispara cuando una persona se actualiza en su espacio de trabajo popular.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Dispara cuando las tareas de grupo de una persona se actualizan en su área de trabajo."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk est un CRM pour construire des relations à l'échelle. Gérez vos contacts, vos entreprises et vos relations en un seul endroit.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Votre clé API Folk. Vous pouvez voir et gérer vos clés API dans vos paramètres de workspace dans la section \"API\" à https://app.folk.app/apps/contacts/network/settings/api-keys",
"Create Company": "Créer une entreprise",
"Update Company": "Mettre à jour la société",
"Create Person": "Créer une personne",
"Update Person": "Mettre à jour la personne",
"Find Company": "Trouver une entreprise",
"Get Company": "Obtenir la société",
"List People": "Liste des personnes",
"Get Person": "Obtenir une personne",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Créez une nouvelle entreprise dans votre espace de travail Folk. Vous pouvez ajouter des e-mails, des liens, des numéros de téléphone et l'assigner à un groupe.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Mettez à jour une entreprise existante dans votre espace de travail Folk. Sélectionnez la société dans la liste déroulante pour mettre à jour ses détails.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Créez une nouvelle personne dans votre espace de travail Folk. Vous pouvez la lier à une entreprise, ajouter des coordonnées et l'assigner à un groupe.",
"Update an existing person in your Folk workspace with new information.": "Mettez à jour une personne existante dans votre espace de travail Folk avec de nouvelles informations.",
"Search for companies in your Folk workspace by name or email address.": "Recherchez des entreprises dans votre espace de travail Folk par nom ou par adresse e-mail.",
"Retrieve detailed information about a company from your Folk workspace.": "Récupérez des informations détaillées sur une entreprise dans votre espace de travail Folk.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Récupérez une liste paginée de personnes dans votre espace de travail Folk avec filtrage facultatif.",
"Retrieve detailed information about a person from your Folk workspace.": "Récupérez des informations détaillées sur une personne dans votre espace de travail Folk.",
"Company Name": "Nom de lentreprise",
"Description": "Libellé",
"Industry": "Industrie",
"Addresses": "Adresses",
"Emails": "E-mails",
"Phone Numbers": "Numéros de téléphone",
"URLs": "URLs",
"Group ID": "ID du groupe",
"Company": "Entreprise",
"First Name": "First Name",
"Last Name": "Last Name",
"Full Name": "Nom complet",
"Birthday": "Date d'anniversaire",
"Job Title": "Titre du poste",
"Company Names": "Noms de la société",
"Companies": "Entreprises",
"Person": "Personne",
"Search Query": "Requête de recherche",
"Limit": "Limite",
"Cursor": "Curseur",
"Filter Combinator": "Combinateur de filtres",
"Name Filter": "Filtre de nom",
"Email Filter": "Filtre d'email",
"The name of the company": "Le nom de la société",
"A short description of the company": "Une courte description de la société",
"The industry the company operates in": "L'industrie dans laquelle l'entreprise opère",
"Physical addresses for the company. The first address is primary.": "Adresses physiques pour l'entreprise. La première adresse est primaire.",
"Email addresses for the company. The first email is primary.": "Adresses e-mail pour l'entreprise. Le premier email est primaire.",
"Phone numbers for the company. The first phone is primary.": "Numéros de téléphone pour l'entreprise. Le premier téléphone est principal.",
"Website URLs for the company. The first URL is primary.": "URL du site web pour l'entreprise. La première URL est primaire.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Entrez un ID de groupe populaire (par exemple, grp_abc123). Les groupes vous aident à organiser vos contacts.",
"Select a company from your Folk workspace.": "Sélectionnez une entreprise dans votre espace de travail Folk.",
"The first name of the person": "Le prénom de la personne",
"The last name of the person": "Le nom de la personne",
"The full name of the person (alternative to first/last)": "Le nom complet de la personne (alternative au premier/dernier)",
"A short description of the person": "Une courte description de la personne",
"The birthday in YYYY-MM-DD format": "L'anniversaire au format AAAA-MM-JJ",
"The job title of the person": "Le titre du poste de la personne",
"The names of companies to associate with the person. The first company will be primary.": "Le nom des entreprises à associer à la personne. La première entreprise sera primaire.",
"Select companies to associate with the person.": "Sélectionnez les entreprises à associer à la personne.",
"Physical addresses for the person. The first address is primary.": "Adresses physiques pour la personne. La première adresse est primaire.",
"Email addresses for the person. The first email is primary.": "Adresses e-mail pour la personne. Le premier email est principal.",
"Phone numbers for the person. The first phone is primary.": "Numéros de téléphone pour la personne. Le premier téléphone est principal.",
"Website URLs for the person. The first URL is primary.": "URL du site web pour la personne. La première URL est primaire.",
"Select a person from your Folk workspace.": "Sélectionnez une personne dans votre espace de travail Folk.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Les noms de la société à créer ou à associer. Les entreprises seront créées si elles n'existent pas.",
"Enter company name or email to search for": "Entrez le nom de la société ou l'e-mail à rechercher",
"The number of items to return (1-100)": "Le nombre d'articles à retourner (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "Un curseur pour la pagination. Utilisez la valeur nextLink d'une réponse précédente.",
"The logical operator to combine multiple filters": "L'opérateur logique pour combiner plusieurs filtres",
"Filter by person name (contains)": "Filtrer par nom de personne (contient)",
"Filter by email address (contains)": "Filtrer par adresse e-mail (contenu)",
"AND": "ET",
"OR": "OU",
"Company Added": "Société ajoutée",
"Company Removed": "Société retirée",
"Company Updated": "Société mise à jour",
"Company Groups Updated": "Groupes de la société mis à jour",
"Person Added": "Personne ajoutée",
"Person Removed": "Personne supprimée",
"Person Updated": "Personne mise à jour",
"Person Groups Updated": "Groupes de personnes mis à jour",
"Fires when a new company is added to your Folk workspace.": "Tire lorsqu'une nouvelle entreprise est ajoutée à votre espace de travail Folk.",
"Fires when a company is removed from your Folk workspace.": "Tire quand une entreprise est retirée de votre espace de travail Folk.",
"Fires when a company is updated in your Folk workspace.": "Déclenche quand une entreprise est mise à jour dans votre espace de travail Folk.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Déclenche lorsque les affectations de groupe d'une entreprise sont mises à jour dans votre espace de travail Folk.",
"Fires when a new person is added to your Folk workspace.": "Se déclenche lorsqu'une nouvelle personne est ajoutée à votre espace de travail Folk.",
"Fires when a person is removed from your Folk workspace.": "Se déclenche lorsqu'une personne est retirée de votre espace de travail Folk.",
"Fires when a person is updated in your Folk workspace.": "Se déclenche lorsqu'une personne est mise à jour dans votre espace de travail Folk.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Tire quand les affectations de groupe d'une personne sont mises à jour dans votre espace de travail Folk."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk は大規模な関係を構築するための CRM です。連絡先、会社、関係を一箇所で管理します。",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Folk APIキー。ワークスペースの設定で、https://app.folk.app/apps/contacts/network/settings/api-keys の \"API\" セクションでAPIキーを表示および管理できます。",
"Create Company": "所属を作成",
"Update Company": "所属を更新",
"Create Person": "ユーザーを作成",
"Update Person": "担当者を更新",
"Find Company": "会社を検索",
"Get Company": "会社を取得する",
"List People": "人物一覧",
"Get Person": "ユーザーを取得",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Folk ワークスペースで新しい会社を作成します。メール、リンク、電話番号を追加し、グループに割り当てることができます。",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Folk ワークスペースの既存の会社を更新します。ドロップダウンから会社を選択して詳細を更新します。",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Folk ワークスペースで新しい人を作成します。それらを会社にリンクし、連絡先の詳細を追加し、グループに割り当てることができます。",
"Update an existing person in your Folk workspace with new information.": "新しい情報を使用して Folk ワークスペースの既存のユーザーを更新します。",
"Search for companies in your Folk workspace by name or email address.": "Folk ワークスペースの会社を名前またはメールアドレスで検索します。",
"Retrieve detailed information about a company from your Folk workspace.": "Folk ワークスペースから会社の詳細情報を取得します。",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "オプションのフィルタリングを使用して format@@0 ワークスペースにいる人物のページ付けリストを取得します。",
"Retrieve detailed information about a person from your Folk workspace.": "フォークワークスペースから人に関する詳細情報を取得します。",
"Company Name": "会社名",
"Description": "説明",
"Industry": "産業",
"Addresses": "アドレス",
"Emails": "E-mail",
"Phone Numbers": "電話番号",
"URLs": "URL",
"Group ID": "グループID",
"Company": "会社名",
"First Name": "名",
"Last Name": "Last Name",
"Full Name": "フルネーム",
"Birthday": "誕生日",
"Job Title": "役職名",
"Company Names": "会社名",
"Companies": "会社名",
"Person": "人",
"Search Query": "検索クエリ",
"Limit": "制限",
"Cursor": "Cursor",
"Filter Combinator": "組み合わせをフィルターする",
"Name Filter": "名前フィルタ",
"Email Filter": "メールフィルタ",
"The name of the company": "会社名",
"A short description of the company": "会社の簡単な説明",
"The industry the company operates in": "会社が運営する産業",
"Physical addresses for the company. The first address is primary.": "会社の住所。最初の住所はプライマリです。",
"Email addresses for the company. The first email is primary.": "会社のメールアドレス。最初のメールはプライマリです。",
"Phone numbers for the company. The first phone is primary.": "会社の電話番号。最初の電話番号は主要です。",
"Website URLs for the company. The first URL is primary.": "会社のウェブサイトURL。最初のURLはプライマリです。",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "フォークグループIDを入力してくださいgrp_abc123。グループは連絡先を整理するのに役立ちます。",
"Select a company from your Folk workspace.": "Folk ワークスペースから会社を選択します。",
"The first name of the person": "その人の名",
"The last name of the person": "その人の姓",
"The full name of the person (alternative to first/last)": "人のフルネーム (first/lastに代わる)",
"A short description of the person": "人物の簡単な説明",
"The birthday in YYYY-MM-DD format": "YYYY-MM-DD形式の誕生日",
"The job title of the person": "職名",
"The names of companies to associate with the person. The first company will be primary.": "個人に関連付ける企業の名前。最初の会社が主要になります。",
"Select companies to associate with the person.": "個人に関連付ける会社を選択します。",
"Physical addresses for the person. The first address is primary.": "その人のための物理的な住所。最初の住所はプライマリです。",
"Email addresses for the person. The first email is primary.": "ユーザーのメールアドレス。最初のメールはプライマリです。",
"Phone numbers for the person. The first phone is primary.": "人物の電話番号。最初の電話番号は主要です。",
"Website URLs for the person. The first URL is primary.": "ユーザのウェブサイトURL。最初のURLはプライマリです。",
"Select a person from your Folk workspace.": "Folk ワークスペースから人を選択します。",
"Company names to create or associate with. Companies will be created if they don't exist.": "作成または関連付ける会社名。存在しない場合、会社は作成されます。",
"Enter company name or email to search for": "検索する会社名またはメールアドレスを入力してください",
"The number of items to return (1-100)": "The number of items to return (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "ページネーションのカーソル。前のレスポンスの nextLink 値を使用します。",
"The logical operator to combine multiple filters": "複数のフィルタを組み合わせる論理演算子",
"Filter by person name (contains)": "個人名でフィルター (含む)",
"Filter by email address (contains)": "メールアドレスでフィルター (含まれるもの)",
"AND": "AND",
"OR": "OR",
"Company Added": "所属追加",
"Company Removed": "会社が削除されました",
"Company Updated": "所属が更新されました",
"Company Groups Updated": "会社グループが更新されました",
"Person Added": "追加された人",
"Person Removed": "削除された人",
"Person Updated": "ユーザーが更新されました",
"Person Groups Updated": "個人グループが更新されました",
"Fires when a new company is added to your Folk workspace.": "新しい会社がFolkのワークスペースに追加されたときに発火します。",
"Fires when a company is removed from your Folk workspace.": "会社が format@@0 ワークスペースから削除されたときに発火します。",
"Fires when a company is updated in your Folk workspace.": "Folk ワークスペースで会社が更新されたときに発火します。",
"Fires when a company's group assignments are updated in your Folk workspace.": "会社のグループの課題が format@@0 ワークスペースで更新されたときに発生します。",
"Fires when a new person is added to your Folk workspace.": "新しいユーザーが format@@0 ワークスペースに追加されたときに発生します。",
"Fires when a person is removed from your Folk workspace.": "ユーザーが format@@0 ワークスペースから削除されたときに発火します。",
"Fires when a person is updated in your Folk workspace.": "ユーザーが format@@0 ワークスペースで更新されたときに発生します。",
"Fires when a person's group assignments are updated in your Folk workspace.": "ユーザのグループ課題が format@@0 ワークスペースで更新されたときに発生します。"
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk is een CRM voor het opbouwen van relaties op schaal. Beheer uw contacten, bedrijven en relaties in één plaats.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Je Folk API-sleutel. Je kunt uw API-sleutels bekijken en beheren in je workspace instellingen onder de sectie \"API\" op https://app.folk.app/apps/contactpersonen/netwerk/settings/api-keys",
"Create Company": "Bedrijf aanmaken",
"Update Company": "Bedrijf bijwerken",
"Create Person": "Maak persoon aan",
"Update Person": "Update Persoon",
"Find Company": "Bedrijf zoeken",
"Get Company": "Bedrijf ophalen",
"List People": "Mensen weergeven",
"Get Person": "Verkrijg persoon",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Maak een nieuw bedrijf aan in uw Folk werkruimte. U kunt e-mails, links, telefoonnummers en toewijzen aan een groep.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Een bestaand bedrijf in uw Folk werkruimte bijwerken. Selecteer het bedrijf uit de dropdown om de gegevens bij te werken.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Maak een nieuwe persoon aan in je Folk werkruimte. Je kunt hem koppelen aan een bedrijf, voeg contactgegevens toe en wijs toe aan een groep.",
"Update an existing person in your Folk workspace with new information.": "Werk een bestaande persoon in uw Folk workspace bij met nieuwe informatie.",
"Search for companies in your Folk workspace by name or email address.": "Zoek naar bedrijven in uw Folk werkruimte op naam of e-mailadres.",
"Retrieve detailed information about a company from your Folk workspace.": "Haal gedetailleerde informatie over een bedrijf op van uw Folk workspace.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Haal een gepagineerde lijst op van mensen in uw Folk werkruimte met optionele filtering.",
"Retrieve detailed information about a person from your Folk workspace.": "Haal gedetailleerde informatie op over een persoon uit jouw volkswerkruimte.",
"Company Name": "Bedrijfsnaam",
"Description": "Beschrijving",
"Industry": "Bedrijfstak",
"Addresses": "Adres",
"Emails": "E-mails",
"Phone Numbers": "Telefoon nummers",
"URLs": "URL's",
"Group ID": "Groep ID",
"Company": "Bedrijfsnaam",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Full Name": "Volledige naam",
"Birthday": "Verjaardag",
"Job Title": "Job titel",
"Company Names": "Bedrijfsnaam",
"Companies": "Bedrijven",
"Person": "Persoon",
"Search Query": "Zoek query",
"Limit": "Limiet",
"Cursor": "Cursor",
"Filter Combinator": "Filter Combinator",
"Name Filter": "Naam filter",
"Email Filter": "E-mail filter",
"The name of the company": "De naam van het bedrijf",
"A short description of the company": "Een korte beschrijving van het bedrijf",
"The industry the company operates in": "De industrie waarin het bedrijf actief is",
"Physical addresses for the company. The first address is primary.": "Fysieke adressen van het bedrijf. Het eerste adres is primair.",
"Email addresses for the company. The first email is primary.": "E-mailadressen voor het bedrijf. De eerste e-mail is primair.",
"Phone numbers for the company. The first phone is primary.": "Telefoonnummers voor het bedrijf. De eerste telefoon is primair.",
"Website URLs for the company. The first URL is primary.": "Website URL's voor dit bedrijf. De eerste URL is primair.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Voer een Folk groep ID in (bijv. grp_abc123). Groepen helpen u uw contactpersonen te organiseren.",
"Select a company from your Folk workspace.": "Selecteer een bedrijf uit uw Volkswerkruimte.",
"The first name of the person": "De voornaam van de persoon",
"The last name of the person": "De achternaam van de persoon",
"The full name of the person (alternative to first/last)": "De volledige naam van de persoon (alternatief voor eerste/laatst)",
"A short description of the person": "Een korte beschrijving van de persoon",
"The birthday in YYYY-MM-DD format": "Het geboortedatum in JJJJ-MM-DD formaat",
"The job title of the person": "De job titel van de persoon",
"The names of companies to associate with the person. The first company will be primary.": "De namen van bedrijven die geassocieerd worden met de persoon. Het eerste bedrijf zal primair zijn.",
"Select companies to associate with the person.": "Selecteer bedrijven om met deze persoon te verbinden.",
"Physical addresses for the person. The first address is primary.": "Fysieke adressen van de persoon. Het eerste adres is primair.",
"Email addresses for the person. The first email is primary.": "E-mailadressen voor de persoon. Het eerste e-mailadres is primair.",
"Phone numbers for the person. The first phone is primary.": "Telefoonnummers voor de persoon. De eerste telefoon is primair.",
"Website URLs for the person. The first URL is primary.": "Website URL's voor deze persoon. De eerste URL is primair.",
"Select a person from your Folk workspace.": "Selecteer een persoon uit uw volkswerkruimte.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Bedrijfsnaam om aan te maken of te koppelen. Bedrijven worden aangemaakt als ze niet bestaan.",
"Enter company name or email to search for": "Voer bedrijfsnaam of e-mailadres in om naar te zoeken",
"The number of items to return (1-100)": "Het aantal items om te retourneren (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "Een cursor voor paginering. Gebruik de volgendeLink-waarde van een vorige reactie.",
"The logical operator to combine multiple filters": "De logische operator om meerdere filters te combineren",
"Filter by person name (contains)": "Filter op naam (bevatten)",
"Filter by email address (contains)": "Filter op e-mailadres (bevat)",
"AND": "en",
"OR": "OF",
"Company Added": "Bedrijf toegevoegd",
"Company Removed": "Bedrijf verwijderd",
"Company Updated": "Bedrijf bijgewerkt",
"Company Groups Updated": "Bedrijfsgroepen bijgewerkt",
"Person Added": "Persoon toegevoegd",
"Person Removed": "Persoon verwijderd",
"Person Updated": "Persoon bijgewerkt",
"Person Groups Updated": "Persoon groepen bijgewerkt",
"Fires when a new company is added to your Folk workspace.": "Vuurt wanneer een nieuw bedrijf is toegevoegd aan uw Folk werkruimte.",
"Fires when a company is removed from your Folk workspace.": "Vuurt wanneer een bedrijf wordt verwijderd uit uw Folk werkruimte.",
"Fires when a company is updated in your Folk workspace.": "Vuurt wanneer een bedrijf wordt bijgewerkt in uw Folk werkruimte.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Vuurt wanneer de groepsopdrachten van een bedrijf worden bijgewerkt in uw Folk werkruimte.",
"Fires when a new person is added to your Folk workspace.": "Schiet wanneer een nieuwe persoon is toegevoegd aan jouw Folk werkruimte.",
"Fires when a person is removed from your Folk workspace.": "Schiet wanneer een persoon verwijderd wordt uit je Volkswerkruimte.",
"Fires when a person is updated in your Folk workspace.": "Vuurt wanneer een persoon wordt bijgewerkt in jouw Folk werkruimte.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Vuurt wanneer iemands groepsopdrachten worden bijgewerkt in uw Folk werkruimte."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk é um CRM para construir relações em escala. Gerencie seus contatos, empresas e relacionamentos em um só lugar.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Sua chave Folk API. Você pode visualizar e gerenciar suas chaves de API nas configurações do seu espaço de trabalho na seção \"API\" em https://app.folk.app/apps/contacts/network/settings/api-keys",
"Create Company": "Criar Empresa",
"Update Company": "Atualizar Empresa",
"Create Person": "Criar Pessoa",
"Update Person": "Atualizar pessoa",
"Find Company": "Encontrar empresa",
"Get Company": "Obter Empresa",
"List People": "Listar pessoas",
"Get Person": "Obter Pessoa",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Criar uma nova empresa em sua área de trabalho Folk. Você pode adicionar e-mails, links, números de telefone e atribuí-los a um grupo.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Atualize uma empresa existente no seu espaço de trabalho Folk. Selecione a empresa no menu suspenso para atualizar seus detalhes.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Criar uma nova pessoa no seu espaço de trabalho Folk. Você pode vinculá-la a uma empresa, adicionar detalhes de contato e atribuir a um grupo.",
"Update an existing person in your Folk workspace with new information.": "Atualize uma pessoa existente no seu espaço de trabalho Folk com novas informações.",
"Search for companies in your Folk workspace by name or email address.": "Pesquise empresas no seu espaço de trabalho Folk por nome ou endereço de e-mail.",
"Retrieve detailed information about a company from your Folk workspace.": "Recupere informações detalhadas sobre uma empresa do seu espaço de trabalho Folk.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Recupere uma lista paginada de pessoas em seu espaço de trabalho Folk com filtragem opcional.",
"Retrieve detailed information about a person from your Folk workspace.": "Recupere informações detalhadas sobre uma pessoa da sua área de trabalho Folk.",
"Company Name": "Nome da Empresa",
"Description": "Descrição",
"Industry": "Indústria",
"Addresses": "Endereços",
"Emails": "e-mails",
"Phone Numbers": "Números de telefone",
"URLs": "Links",
"Group ID": "Grupo ID",
"Company": "Empresas",
"First Name": "Nome",
"Last Name": "Sobrenome",
"Full Name": "Nome Completo",
"Birthday": "Aniversário",
"Job Title": "Título do Cargo",
"Company Names": "Nomes da empresa",
"Companies": "Empresas",
"Person": "Pessoa",
"Search Query": "Consulta de Pesquisa",
"Limit": "Limitar",
"Cursor": "Cursor",
"Filter Combinator": "Filtrar Combinador",
"Name Filter": "Filtro de Nome",
"Email Filter": "Filtro de e-mail",
"The name of the company": "O nome da empresa",
"A short description of the company": "Uma breve descrição da empresa",
"The industry the company operates in": "O setor no qual a empresa opera",
"Physical addresses for the company. The first address is primary.": "Endereços físicos para a empresa. O primeiro endereço é principal.",
"Email addresses for the company. The first email is primary.": "Endereços de e-mail para a empresa. O primeiro e-mail é principal.",
"Phone numbers for the company. The first phone is primary.": "Números de telefone para a empresa. O primeiro telefone é principal.",
"Website URLs for the company. The first URL is primary.": "URLs de sites para a empresa. O primeiro URL é principal.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Informe um ID Folk (p. ex., grp_abc123). Grupos ajudam você a organizar seus contatos.",
"Select a company from your Folk workspace.": "Selecionar uma empresa do seu espaço de trabalho Folk.",
"The first name of the person": "O primeiro nome da pessoa",
"The last name of the person": "O sobrenome da pessoa",
"The full name of the person (alternative to first/last)": "O nome completo da pessoa (alternativa ao primeiro/última)",
"A short description of the person": "Uma breve descrição da pessoa",
"The birthday in YYYY-MM-DD format": "A data de aniversário no formato YYYY-MM-DD",
"The job title of the person": "O título do cargo da pessoa",
"The names of companies to associate with the person. The first company will be primary.": "Os nomes das empresas a se associarem à pessoa. A primeira empresa será a principal.",
"Select companies to associate with the person.": "Selecione empresas para associar com a pessoa.",
"Physical addresses for the person. The first address is primary.": "Endereços físicos para a pessoa. O primeiro endereço é principal.",
"Email addresses for the person. The first email is primary.": "Endereços de email para a pessoa. O primeiro email é principal.",
"Phone numbers for the person. The first phone is primary.": "Números de telefone para a pessoa. O primeiro telefone é principal.",
"Website URLs for the person. The first URL is primary.": "URLs de sites para a pessoa. O primeiro URL é principal.",
"Select a person from your Folk workspace.": "Selecionar uma pessoa do seu espaço de trabalho Folk.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Nomes de empresa para criar ou associar. Empresas serão criadas se não existirem.",
"Enter company name or email to search for": "Digite o nome ou e-mail da empresa para pesquisar",
"The number of items to return (1-100)": "O número de itens a retornar (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "Um cursor para paginação. Use o valor nextLink de uma resposta anterior.",
"The logical operator to combine multiple filters": "O operador lógico para combinar vários filtros",
"Filter by person name (contains)": "Filtrar por nome de pessoa (contém)",
"Filter by email address (contains)": "Filtrar por endereço de e-mail (contém)",
"AND": "OU",
"OR": "OU",
"Company Added": "Empresa adicionada",
"Company Removed": "Empresa removida",
"Company Updated": "Empresa atualizada",
"Company Groups Updated": "Grupos de Empresa Atualizados",
"Person Added": "Pessoa adicionada",
"Person Removed": "Pessoa removida",
"Person Updated": "Pessoa atualizada",
"Person Groups Updated": "Grupos de pessoas atualizados",
"Fires when a new company is added to your Folk workspace.": "Atira quando uma nova empresa é adicionada ao seu espaço de trabalho Folk.",
"Fires when a company is removed from your Folk workspace.": "Atira quando uma empresa é removida do seu espaço de trabalho Folk.",
"Fires when a company is updated in your Folk workspace.": "Atira quando uma empresa é atualizada em sua área de trabalho Folk.",
"Fires when a company's group assignments are updated in your Folk workspace.": "aciona quando as missões de grupo de uma empresa são atualizadas em sua área de trabalho Folk.",
"Fires when a new person is added to your Folk workspace.": "Atira quando uma nova pessoa é adicionada à sua área de trabalho Folk.",
"Fires when a person is removed from your Folk workspace.": "Atira quando uma pessoa é removida da sua área de trabalho Folk.",
"Fires when a person is updated in your Folk workspace.": "Atira quando uma pessoa é atualizada na sua área de trabalho Folk.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Atira quando as atividades em grupo de uma pessoa são atualizadas na sua área de trabalho Folk."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys",
"Create Company": "Create Company",
"Update Company": "Update Company",
"Create Person": "Create Person",
"Update Person": "Update Person",
"Find Company": "Find Company",
"Get Company": "Get Company",
"List People": "List People",
"Get Person": "Get Person",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.",
"Update an existing person in your Folk workspace with new information.": "Update an existing person in your Folk workspace with new information.",
"Search for companies in your Folk workspace by name or email address.": "Search for companies in your Folk workspace by name or email address.",
"Retrieve detailed information about a company from your Folk workspace.": "Retrieve detailed information about a company from your Folk workspace.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Retrieve a paginated list of people in your Folk workspace with optional filtering.",
"Retrieve detailed information about a person from your Folk workspace.": "Retrieve detailed information about a person from your Folk workspace.",
"Company Name": "Company Name",
"Description": "Description",
"Industry": "Industry",
"Addresses": "Addresses",
"Emails": "Emails",
"Phone Numbers": "Phone Numbers",
"URLs": "URLs",
"Group ID": "Group ID",
"Company": "Company",
"First Name": "First Name",
"Last Name": "Last Name",
"Full Name": "Full Name",
"Birthday": "Birthday",
"Job Title": "Job Title",
"Company Names": "Company Names",
"Companies": "Companies",
"Person": "Person",
"Search Query": "Search Query",
"Limit": "Limit",
"Cursor": "Cursor",
"Filter Combinator": "Filter Combinator",
"Name Filter": "Name Filter",
"Email Filter": "Email Filter",
"The name of the company": "The name of the company",
"A short description of the company": "A short description of the company",
"The industry the company operates in": "The industry the company operates in",
"Physical addresses for the company. The first address is primary.": "Physical addresses for the company. The first address is primary.",
"Email addresses for the company. The first email is primary.": "Email addresses for the company. The first email is primary.",
"Phone numbers for the company. The first phone is primary.": "Phone numbers for the company. The first phone is primary.",
"Website URLs for the company. The first URL is primary.": "Website URLs for the company. The first URL is primary.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.",
"Select a company from your Folk workspace.": "Select a company from your Folk workspace.",
"The first name of the person": "The first name of the person",
"The last name of the person": "The last name of the person",
"The full name of the person (alternative to first/last)": "The full name of the person (alternative to first/last)",
"A short description of the person": "A short description of the person",
"The birthday in YYYY-MM-DD format": "The birthday in YYYY-MM-DD format",
"The job title of the person": "The job title of the person",
"The names of companies to associate with the person. The first company will be primary.": "The names of companies to associate with the person. The first company will be primary.",
"Select companies to associate with the person.": "Select companies to associate with the person.",
"Physical addresses for the person. The first address is primary.": "Physical addresses for the person. The first address is primary.",
"Email addresses for the person. The first email is primary.": "Email addresses for the person. The first email is primary.",
"Phone numbers for the person. The first phone is primary.": "Phone numbers for the person. The first phone is primary.",
"Website URLs for the person. The first URL is primary.": "Website URLs for the person. The first URL is primary.",
"Select a person from your Folk workspace.": "Select a person from your Folk workspace.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Company names to create or associate with. Companies will be created if they don't exist.",
"Enter company name or email to search for": "Enter company name or email to search for",
"The number of items to return (1-100)": "The number of items to return (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "A cursor for pagination. Use the nextLink value from a previous response.",
"The logical operator to combine multiple filters": "The logical operator to combine multiple filters",
"Filter by person name (contains)": "Filter by person name (contains)",
"Filter by email address (contains)": "Filter by email address (contains)",
"AND": "AND",
"OR": "OR",
"Company Added": "Company Added",
"Company Removed": "Company Removed",
"Company Updated": "Company Updated",
"Company Groups Updated": "Company Groups Updated",
"Person Added": "Person Added",
"Person Removed": "Person Removed",
"Person Updated": "Person Updated",
"Person Groups Updated": "Person Groups Updated",
"Fires when a new company is added to your Folk workspace.": "Fires when a new company is added to your Folk workspace.",
"Fires when a company is removed from your Folk workspace.": "Fires when a company is removed from your Folk workspace.",
"Fires when a company is updated in your Folk workspace.": "Fires when a company is updated in your Folk workspace.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Fires when a company's group assignments are updated in your Folk workspace.",
"Fires when a new person is added to your Folk workspace.": "Fires when a new person is added to your Folk workspace.",
"Fires when a person is removed from your Folk workspace.": "Fires when a person is removed from your Folk workspace.",
"Fires when a person is updated in your Folk workspace.": "Fires when a person is updated in your Folk workspace.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Fires when a person's group assignments are updated in your Folk workspace."
}

View File

@@ -0,0 +1,90 @@
{
"Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.": "Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.",
"Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys": "Your Folk API key. You can view and manage your API keys in your workspace settings under the \"API\" section at https://app.folk.app/apps/contacts/network/settings/api-keys",
"Create Company": "Create Company",
"Update Company": "Update Company",
"Create Person": "Create Person",
"Update Person": "Update Person",
"Find Company": "Find Company",
"Get Company": "Get Company",
"List People": "List People",
"Get Person": "Get Person",
"Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.": "Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.",
"Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.": "Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.",
"Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.": "Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.",
"Update an existing person in your Folk workspace with new information.": "Update an existing person in your Folk workspace with new information.",
"Search for companies in your Folk workspace by name or email address.": "Search for companies in your Folk workspace by name or email address.",
"Retrieve detailed information about a company from your Folk workspace.": "Retrieve detailed information about a company from your Folk workspace.",
"Retrieve a paginated list of people in your Folk workspace with optional filtering.": "Retrieve a paginated list of people in your Folk workspace with optional filtering.",
"Retrieve detailed information about a person from your Folk workspace.": "Retrieve detailed information about a person from your Folk workspace.",
"Company Name": "Company Name",
"Description": "描述",
"Industry": "Industry",
"Addresses": "Addresses",
"Emails": "电子邮件",
"Phone Numbers": "Phone Numbers",
"URLs": "URLs",
"Group ID": "Group ID",
"Company": "Company",
"First Name": "First Name",
"Last Name": "名字",
"Full Name": "Full Name",
"Birthday": "Birthday",
"Job Title": "Job Title",
"Company Names": "Company Names",
"Companies": "Companies",
"Person": "Person",
"Search Query": "Search Query",
"Limit": "Limit",
"Cursor": "Cursor",
"Filter Combinator": "Filter Combinator",
"Name Filter": "Name Filter",
"Email Filter": "Email Filter",
"The name of the company": "The name of the company",
"A short description of the company": "A short description of the company",
"The industry the company operates in": "The industry the company operates in",
"Physical addresses for the company. The first address is primary.": "Physical addresses for the company. The first address is primary.",
"Email addresses for the company. The first email is primary.": "Email addresses for the company. The first email is primary.",
"Phone numbers for the company. The first phone is primary.": "Phone numbers for the company. The first phone is primary.",
"Website URLs for the company. The first URL is primary.": "Website URLs for the company. The first URL is primary.",
"Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.": "Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.",
"Select a company from your Folk workspace.": "Select a company from your Folk workspace.",
"The first name of the person": "The first name of the person",
"The last name of the person": "The last name of the person",
"The full name of the person (alternative to first/last)": "The full name of the person (alternative to first/last)",
"A short description of the person": "A short description of the person",
"The birthday in YYYY-MM-DD format": "The birthday in YYYY-MM-DD format",
"The job title of the person": "The job title of the person",
"The names of companies to associate with the person. The first company will be primary.": "The names of companies to associate with the person. The first company will be primary.",
"Select companies to associate with the person.": "Select companies to associate with the person.",
"Physical addresses for the person. The first address is primary.": "Physical addresses for the person. The first address is primary.",
"Email addresses for the person. The first email is primary.": "Email addresses for the person. The first email is primary.",
"Phone numbers for the person. The first phone is primary.": "Phone numbers for the person. The first phone is primary.",
"Website URLs for the person. The first URL is primary.": "Website URLs for the person. The first URL is primary.",
"Select a person from your Folk workspace.": "Select a person from your Folk workspace.",
"Company names to create or associate with. Companies will be created if they don't exist.": "Company names to create or associate with. Companies will be created if they don't exist.",
"Enter company name or email to search for": "Enter company name or email to search for",
"The number of items to return (1-100)": "The number of items to return (1-100)",
"A cursor for pagination. Use the nextLink value from a previous response.": "A cursor for pagination. Use the nextLink value from a previous response.",
"The logical operator to combine multiple filters": "The logical operator to combine multiple filters",
"Filter by person name (contains)": "Filter by person name (contains)",
"Filter by email address (contains)": "Filter by email address (contains)",
"AND": "AND",
"OR": "或",
"Company Added": "Company Added",
"Company Removed": "Company Removed",
"Company Updated": "Company Updated",
"Company Groups Updated": "Company Groups Updated",
"Person Added": "Person Added",
"Person Removed": "Person Removed",
"Person Updated": "Person Updated",
"Person Groups Updated": "Person Groups Updated",
"Fires when a new company is added to your Folk workspace.": "Fires when a new company is added to your Folk workspace.",
"Fires when a company is removed from your Folk workspace.": "Fires when a company is removed from your Folk workspace.",
"Fires when a company is updated in your Folk workspace.": "Fires when a company is updated in your Folk workspace.",
"Fires when a company's group assignments are updated in your Folk workspace.": "Fires when a company's group assignments are updated in your Folk workspace.",
"Fires when a new person is added to your Folk workspace.": "Fires when a new person is added to your Folk workspace.",
"Fires when a person is removed from your Folk workspace.": "Fires when a person is removed from your Folk workspace.",
"Fires when a person is updated in your Folk workspace.": "Fires when a person is updated in your Folk workspace.",
"Fires when a person's group assignments are updated in your Folk workspace.": "Fires when a person's group assignments are updated in your Folk workspace."
}

View File

@@ -0,0 +1,50 @@
import { createPiece } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { folkAuth } from './lib/common/auth';
import { companyAdded } from './lib/triggers/company-added';
import { companyRemoved } from './lib/triggers/company-removed';
import { companyUpdated } from './lib/triggers/company-updated';
import { companyCustomFieldUpdated } from './lib/triggers/company-custom-field-updated';
import { personAdded } from './lib/triggers/person-added';
import { personRemoved } from './lib/triggers/person-removed';
import { personUpdated } from './lib/triggers/person-updated';
import { personCustomFieldUpdated } from './lib/triggers/person-custom-field-updated';
import { createCompany } from './lib/actions/create-company';
import { updateCompany } from './lib/actions/update-company';
import { createPerson } from './lib/actions/create-person';
import { updatePerson } from './lib/actions/update-person';
import { findCompany } from './lib/actions/find-company';
import { getCompany } from './lib/actions/get-company';
import { findPerson } from './lib/actions/find-person';
import { getPerson } from './lib/actions/get-person';
export const folk = createPiece({
displayName: 'Folk',
auth: folkAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/folk.png',
authors: ['sparkybug'],
categories: [PieceCategory.SALES_AND_CRM],
description:
'Folk is a CRM for building relationships at scale. Manage your contacts, companies, and relationships in one place.',
actions: [
createCompany,
updateCompany,
createPerson,
updatePerson,
findCompany,
getCompany,
findPerson,
getPerson,
],
triggers: [
companyAdded,
companyRemoved,
companyUpdated,
companyCustomFieldUpdated,
personAdded,
personRemoved,
personUpdated,
personCustomFieldUpdated,
],
});

View File

@@ -0,0 +1,114 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const createCompany = createAction({
auth: folkAuth,
name: 'createCompany',
displayName: 'Create Company',
description: 'Create a new company in your Folk workspace. You can add emails, links, phone numbers, and assign it to a group.',
props: {
name: Property.ShortText({
displayName: 'Company Name',
description: 'The name of the company',
required: true,
}),
description: Property.LongText({
displayName: 'Description',
description: 'A short description of the company',
required: false,
}),
industry: Property.ShortText({
displayName: 'Industry',
description: 'The industry the company operates in',
required: false,
}),
addresses: Property.Array({
displayName: 'Addresses',
description: 'Physical addresses for the company. The first address is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Address',
required: true,
}),
},
}),
emails: Property.Array({
displayName: 'Emails',
description: 'Email addresses for the company. The first email is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Email',
required: true,
}),
},
}),
phones: Property.Array({
displayName: 'Phone Numbers',
description: 'Phone numbers for the company. The first phone is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Phone Number',
required: true,
}),
},
}),
urls: Property.Array({
displayName: 'URLs',
description: 'Website URLs for the company. The first URL is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'URL',
required: true,
}),
},
}),
groupId: folkProps.group_id(false, 'Group ID'),
},
async run(context) {
const { name, description, industry, addresses, emails, phones, urls, groupId } = context.propsValue;
const companyData: any = {
name,
};
if (description) companyData.description = description;
if (industry) companyData.industry = industry;
if (addresses && Array.isArray(addresses) && addresses.length > 0) {
companyData.addresses = addresses.map((addr: any) => addr.value || addr);
}
if (emails && Array.isArray(emails) && emails.length > 0) {
companyData.emails = emails.map((e: any) => e.value || e);
}
if (phones && Array.isArray(phones) && phones.length > 0) {
companyData.phones = phones.map((p: any) => p.value || p);
}
if (urls && Array.isArray(urls) && urls.length > 0) {
companyData.urls = urls.map((u: any) => u.value || u);
}
if (groupId) {
companyData.groups = [{ id: groupId }];
}
const response = await folkClient.createCompany({
apiKey: context.auth,
data: companyData,
});
return {
company: response.data,
success: true,
};
},
});

View File

@@ -0,0 +1,168 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const createPerson = createAction({
auth: folkAuth,
name: 'createPerson',
displayName: 'Create Person',
description:
'Create a new person in your Folk workspace. You can link them to a company, add contact details, and assign to a group.',
props: {
firstName: Property.ShortText({
displayName: 'First Name',
description: 'The first name of the person',
required: false,
}),
lastName: Property.ShortText({
displayName: 'Last Name',
description: 'The last name of the person',
required: false,
}),
fullName: Property.ShortText({
displayName: 'Full Name',
description: 'The full name of the person (alternative to first/last)',
required: false,
}),
description: Property.LongText({
displayName: 'Description',
description: 'A short description of the person',
required: false,
}),
birthday: Property.ShortText({
displayName: 'Birthday',
description: 'The birthday in YYYY-MM-DD format',
required: false,
}),
jobTitle: Property.ShortText({
displayName: 'Job Title',
description: 'The job title of the person',
required: false,
}),
companyNames: Property.Array({
displayName: 'Company Names',
description:
'The names of companies to associate with the person. The first company will be primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Company Name',
required: true,
}),
},
}),
companyIds: folkProps.companyIds(false),
addresses: Property.Array({
displayName: 'Addresses',
description:
'Physical addresses for the person. The first address is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Address',
required: true,
}),
},
}),
emails: Property.Array({
displayName: 'Emails',
description:
'Email addresses for the person. The first email is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Email',
required: true,
}),
},
}),
phones: Property.Array({
displayName: 'Phone Numbers',
description: 'Phone numbers for the person. The first phone is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Phone Number',
required: true,
}),
},
}),
urls: Property.Array({
displayName: 'URLs',
description: 'Website URLs for the person. The first URL is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'URL',
required: true,
}),
},
}),
groupId: folkProps.group_id(false, 'Group ID'),
},
async run(context) {
const {
firstName,
lastName,
fullName,
description,
birthday,
jobTitle,
companyNames,
companyIds,
addresses,
emails,
phones,
urls,
groupId,
} = context.propsValue;
const personData: any = {};
if (firstName) personData.firstName = firstName;
if (lastName) personData.lastName = lastName;
if (fullName) personData.fullName = fullName;
if (description) personData.description = description;
if (birthday) personData.birthday = birthday;
if (jobTitle) personData.jobTitle = jobTitle;
const companies: any[] = [];
if (companyIds) {
for (const companyId of companyIds) {
companies.push({ id: companyId });
}
}
if (companyNames && Array.isArray(companyNames)) {
companies.push(...companyNames.map((c: any) => ({ name: c.value || c })));
}
if (companies.length > 0) personData.companies = companies;
if (addresses && Array.isArray(addresses) && addresses.length > 0) {
personData.addresses = addresses.map((addr: any) => addr.value || addr);
}
if (emails && Array.isArray(emails) && emails.length > 0) {
personData.emails = emails.map((e: any) => e.value || e);
}
if (phones && Array.isArray(phones) && phones.length > 0) {
personData.phones = phones.map((p: any) => p.value || p);
}
if (urls && Array.isArray(urls) && urls.length > 0) {
personData.urls = urls.map((u: any) => u.value || u);
}
if (groupId) {
personData.groups = [{ id: groupId }];
}
const response = await folkClient.createPerson({
apiKey: context.auth,
data: personData,
});
return response.data;
},
});

View File

@@ -0,0 +1,32 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
export const findCompany = createAction({
auth: folkAuth,
name: 'findCompany',
displayName: 'Find Company',
description: 'Search for companies in your Folk workspace by name or email address.',
props: {
query: Property.ShortText({
displayName: 'Search Query',
description: 'Enter company name or email to search for',
required: true,
}),
},
async run(context) {
const { query } = context.propsValue;
const response = await folkClient.searchCompany({
apiKey: context.auth,
query,
});
return {
companies: response.data?.items || [],
count: response.data?.items?.length || 0,
pagination: response.data?.pagination,
};
},
});

View File

@@ -0,0 +1,63 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
export const findPerson = createAction({
auth: folkAuth,
name: 'findPerson',
displayName: 'List People',
description: 'Retrieve a paginated list of people in your Folk workspace with optional filtering.',
props: {
limit: Property.Number({
displayName: 'Limit',
description: 'The number of items to return (1-100)',
required: false,
defaultValue: 20,
}),
cursor: Property.ShortText({
displayName: 'Cursor',
description: 'A cursor for pagination. Use the nextLink value from a previous response.',
required: false,
}),
combinator: Property.StaticDropdown({
displayName: 'Filter Combinator',
description: 'The logical operator to combine multiple filters',
required: false,
defaultValue: 'and',
options: {
options: [
{ label: 'AND', value: 'and' },
{ label: 'OR', value: 'or' },
],
},
}),
nameFilter: Property.ShortText({
displayName: 'Name Filter',
description: 'Filter by person name (contains)',
required: false,
}),
emailFilter: Property.ShortText({
displayName: 'Email Filter',
description: 'Filter by email address (contains)',
required: false,
}),
},
async run(context) {
const { limit, cursor, combinator, nameFilter, emailFilter } = context.propsValue;
const response = await folkClient.getPeopleWithFilters({
apiKey: context.auth,
limit: limit || 20,
cursor,
combinator: combinator as 'and' | 'or',
nameFilter,
emailFilter,
});
return {
data: response.data,
success: true,
};
},
});

View File

@@ -0,0 +1,27 @@
import { createAction } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const getCompany = createAction({
auth: folkAuth,
name: 'getCompany',
displayName: 'Get Company',
description: 'Retrieve detailed information about a company from your Folk workspace.',
props: {
companyId: folkProps.company_id(true),
},
async run(context) {
const { companyId } = context.propsValue;
const response = await folkClient.getCompany({
apiKey: context.auth,
companyId: companyId as string,
});
return {
company: response.data,
};
},
});

View File

@@ -0,0 +1,28 @@
import { createAction } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const getPerson = createAction({
auth: folkAuth,
name: 'getPerson',
displayName: 'Get Person',
description: 'Retrieve detailed information about a person from your Folk workspace.',
props: {
personId: folkProps.person_id(true),
},
async run(context) {
const { personId } = context.propsValue;
const response = await folkClient.getPerson({
apiKey: context.auth,
contactId: personId as string,
});
return {
data: response.data,
success: true,
};
},
});

View File

@@ -0,0 +1,115 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const updateCompany = createAction({
auth: folkAuth,
name: 'updateCompany',
displayName: 'Update Company',
description: 'Update an existing company in your Folk workspace. Select the company from the dropdown to update its details.',
props: {
companyId: folkProps.company_id(true),
name: Property.ShortText({
displayName: 'Company Name',
description: 'The name of the company',
required: false,
}),
description: Property.LongText({
displayName: 'Description',
description: 'A short description of the company',
required: false,
}),
industry: Property.ShortText({
displayName: 'Industry',
description: 'The industry the company operates in',
required: false,
}),
addresses: Property.Array({
displayName: 'Addresses',
description: 'Physical addresses for the company. The first address is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Address',
required: true,
}),
},
}),
emails: Property.Array({
displayName: 'Emails',
description: 'Email addresses for the company. The first email is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Email',
required: true,
}),
},
}),
phones: Property.Array({
displayName: 'Phone Numbers',
description: 'Phone numbers for the company. The first phone is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Phone Number',
required: true,
}),
},
}),
urls: Property.Array({
displayName: 'URLs',
description: 'Website URLs for the company. The first URL is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'URL',
required: true,
}),
},
}),
groupId: folkProps.group_id(false, 'Group ID'),
},
async run(context) {
const { companyId, name, description, industry, addresses, emails, phones, urls, groupId } = context.propsValue;
const companyData: any = {};
if (name) companyData.name = name;
if (description) companyData.description = description;
if (industry) companyData.industry = industry;
if (addresses && Array.isArray(addresses)) {
companyData.addresses = addresses.map((addr: any) => addr.value || addr);
}
if (emails && Array.isArray(emails)) {
companyData.emails = emails.map((e: any) => e.value || e);
}
if (phones && Array.isArray(phones)) {
companyData.phones = phones.map((p: any) => p.value || p);
}
if (urls && Array.isArray(urls)) {
companyData.urls = urls.map((u: any) => u.value || u);
}
if (groupId) {
companyData.groups = [{ id: groupId }];
}
const response = await folkClient.updateCompany({
apiKey: context.auth,
companyId: companyId as string,
data: companyData,
});
return {
company: response.data,
success: true,
};
},
});

View File

@@ -0,0 +1,174 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const updatePerson = createAction({
auth: folkAuth,
name: 'updatePerson',
displayName: 'Update Person',
description:
'Update an existing person in your Folk workspace with new information.',
props: {
personId: folkProps.person_id(true),
firstName: Property.ShortText({
displayName: 'First Name',
description: 'The first name of the person',
required: false,
}),
lastName: Property.ShortText({
displayName: 'Last Name',
description: 'The last name of the person',
required: false,
}),
fullName: Property.ShortText({
displayName: 'Full Name',
description: 'The full name of the person (alternative to first/last)',
required: false,
}),
description: Property.LongText({
displayName: 'Description',
description: 'A short description of the person',
required: false,
}),
birthday: Property.ShortText({
displayName: 'Birthday',
description: 'The birthday in YYYY-MM-DD format',
required: false,
}),
jobTitle: Property.ShortText({
displayName: 'Job Title',
description: 'The job title of the person',
required: false,
}),
companyIds: folkProps.companyIds(false),
companyNames: Property.Array({
displayName: 'Company Names',
description:
"Company names to create or associate with. Companies will be created if they don't exist.",
required: false,
properties: {
value: Property.ShortText({
displayName: 'Company Name',
required: true,
}),
},
}),
addresses: Property.Array({
displayName: 'Addresses',
description:
'Physical addresses for the person. The first address is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Address',
required: true,
}),
},
}),
emails: Property.Array({
displayName: 'Emails',
description:
'Email addresses for the person. The first email is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Email',
required: true,
}),
},
}),
phones: Property.Array({
displayName: 'Phone Numbers',
description: 'Phone numbers for the person. The first phone is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'Phone Number',
required: true,
}),
},
}),
urls: Property.Array({
displayName: 'URLs',
description: 'Website URLs for the person. The first URL is primary.',
required: false,
properties: {
value: Property.ShortText({
displayName: 'URL',
required: true,
}),
},
}),
groupId: folkProps.group_id(false, 'Group ID'),
},
async run(context) {
const {
personId,
firstName,
lastName,
fullName,
description,
birthday,
jobTitle,
companyIds,
companyNames,
addresses,
emails,
phones,
urls,
groupId,
} = context.propsValue;
const personData: any = {};
if (firstName) personData.firstName = firstName;
if (lastName) personData.lastName = lastName;
if (fullName) personData.fullName = fullName;
if (description) personData.description = description;
if (birthday) personData.birthday = birthday;
if (jobTitle) personData.jobTitle = jobTitle;
const companies: any[] = [];
if (companyIds) {
for (const companyId of companyIds) {
companies.push({ id: companyId });
}
}
if (companyNames && Array.isArray(companyNames)) {
companies.push(...companyNames.map((c: any) => ({ name: c.value || c })));
}
if (companies.length > 0) personData.companies = companies;
if (addresses && Array.isArray(addresses) && addresses.length > 0) {
personData.addresses = addresses.map((addr: any) => addr.value || addr);
}
if (emails && Array.isArray(emails) && emails.length > 0) {
personData.emails = emails.map((e: any) => e.value || e);
}
if (phones && Array.isArray(phones) && phones.length > 0) {
personData.phones = phones.map((p: any) => p.value || p);
}
if (urls && Array.isArray(urls) && urls.length > 0) {
personData.urls = urls.map((u: any) => u.value || u);
}
if (groupId) {
personData.groups = [{ id: groupId }];
}
const response = await folkClient.updatePerson({
apiKey: context.auth,
contactId: personId as string,
data: personData,
});
return {
data: response.data,
success: true,
};
},
});

View File

@@ -0,0 +1,37 @@
import { PieceAuth } from '@activepieces/pieces-framework';
import { folkClient } from './client';
import { AppConnectionType } from '@activepieces/shared';
export const folkAuth = PieceAuth.SecretText({
displayName: 'API Key',
description:
'Your Folk API key. You can view and manage your API keys in your workspace settings under the "API" section at https://app.folk.app/apps/contacts/network/settings/api-keys',
required: true,
validate: async ({ auth }) => {
try {
await folkClient.testConnection({
secret_text: auth,
type: AppConnectionType.SECRET_TEXT,
});
return {
valid: true,
message: 'API key validated successfully. Connected to Folk.',
};
} catch (error: any) {
if (error.message?.includes('401') || error.message?.includes('403')) {
return {
valid: false,
error: 'Invalid API key. Please check your API key and try again.',
};
}
return {
valid: false,
error: `Authentication failed: ${error.message}. Please verify your API key is correct.`,
};
}
},
});
export type FolkAuthType = string;

View File

@@ -0,0 +1,329 @@
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { folkAuth } from './auth';
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
export const folkClient = {
baseUrl: 'https://api.folk.app',
async testConnection(apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>): Promise<void> {
await this.makeRequest<any>({
method: HttpMethod.GET,
url: '/v1/people?limit=1',
apiKey,
});
},
async makeRequest<T>({
method,
url,
apiKey,
body,
headers,
}: {
method: HttpMethod;
url: string;
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
body?: any;
headers?: Record<string, string>;
}): Promise<T> {
const response = await httpClient.sendRequest<T>({
method,
url: `${this.baseUrl}${url}`,
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
...headers,
},
body,
});
if (response.status >= 400) {
throw new Error(
`Folk API error: ${response.status} ${JSON.stringify(response.body)}`
);
}
return response.body;
},
async getPeople({
apiKey,
limit = 100,
offset = 0,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
limit?: number;
offset?: number;
}) {
return this.makeRequest<{ people: any[] }>({
method: HttpMethod.GET,
url: `/v1/people/list?limit=${limit}&offset=${offset}`,
apiKey,
});
},
async getPeopleWithFilters({
apiKey,
limit = 20,
cursor,
combinator = 'and',
nameFilter,
emailFilter,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
limit?: number;
cursor?: string;
combinator?: 'and' | 'or';
nameFilter?: string;
emailFilter?: string;
}) {
const params = new URLSearchParams();
if (limit) params.append('limit', limit.toString());
if (cursor) params.append('cursor', cursor);
// Only add combinator and filters if we actually have filters
const hasFilters = nameFilter || emailFilter;
if (hasFilters) {
if (combinator) params.append('combinator', combinator);
if (nameFilter) {
params.append('filter[fullName][like]', nameFilter);
}
if (emailFilter) {
params.append('filter[emails][like]', emailFilter);
}
}
const queryString = params.toString();
const url = queryString ? `/v1/people?${queryString}` : '/v1/people';
return this.makeRequest<{
data: {
items: any[];
pagination: { nextLink?: string };
};
}>({
method: HttpMethod.GET,
url,
apiKey,
});
},
async getPerson({
apiKey,
contactId,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
contactId: string;
}) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.GET,
url: `/v1/people/${contactId}`,
apiKey,
});
},
async searchPerson({ apiKey, query }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>; query: string }) {
return this.makeRequest<{ people: any[] }>({
method: HttpMethod.GET,
url: `/v1/people/search?query=${encodeURIComponent(query)}`,
apiKey,
});
},
async createPerson({ apiKey, data }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>; data: any }) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.POST,
url: '/v1/people',
apiKey: apiKey,
body: data,
});
},
async updatePerson({
apiKey,
contactId,
data,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
contactId: string;
data: any;
}) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.PATCH,
url: `/v1/people/${contactId}`,
apiKey,
body: data,
});
},
async getCompanies({
apiKey,
limit = 100,
offset = 0,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
limit?: number;
offset?: number;
}) {
return this.makeRequest<{ companies: any[] }>({
method: HttpMethod.GET,
url: `/v1/companies/list?limit=${limit}&offset=${offset}`,
apiKey,
});
},
async getCompaniesWithFilters({
apiKey,
limit = 20,
cursor,
combinator = 'and',
nameFilter
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
limit?: number;
cursor?: string;
combinator?: 'and' | 'or';
nameFilter?: string;
}) {
const params = new URLSearchParams();
if (limit) params.append('limit', limit.toString());
if (cursor) params.append('cursor', cursor);
// Only add combinator and filters if we actually have filters
if (nameFilter) {
if (combinator) params.append('combinator', combinator);
params.append('filter[name][like]', nameFilter);
}
const queryString = params.toString();
const url = queryString ? `/v1/companies?${queryString}` : '/v1/companies';
return this.makeRequest<{
data: {
items: any[];
pagination: { nextLink?: string }
}
}>({
method: HttpMethod.GET,
url,
apiKey,
});
},
async getCompany({
apiKey,
companyId,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
companyId: string;
}) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.GET,
url: `/v1/companies/${companyId}`,
apiKey,
});
},
async searchCompany({ apiKey, query }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>; query: string }) {
return this.makeRequest<{
data: { items: any[]; pagination: { nextLink: string } };
}>({
method: HttpMethod.GET,
url: `/v1/companies?limit=100&filter[name][like]=${encodeURIComponent(
query
)}`,
apiKey,
});
},
async createCompany({ apiKey, data }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>; data: any }) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.POST,
url: '/v1/companies',
apiKey: apiKey,
body: data,
});
},
async updateCompany({
apiKey,
companyId,
data,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
companyId: string;
data: any;
}) {
return this.makeRequest<{ data: any }>({
method: HttpMethod.PATCH,
url: `/v1/companies/${companyId}`,
apiKey,
body: data,
});
},
async getGroups({ apiKey }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth> }) {
return this.makeRequest<{
data: { items: any[]; pagination: { nextLink?: string } };
}>({
method: HttpMethod.GET,
url: '/v1/groups',
apiKey,
});
},
async createWebhook({
apiKey,
name,
targetUrl,
subscribedEvents,
}: {
apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>;
name: string;
targetUrl: string;
subscribedEvents: Array<{
eventType: string;
filter?: {
groupId?: string;
objectType?: string;
path?: string[];
value?: string;
};
}>;
}) {
return this.makeRequest<{
data: {
id: string;
name: string;
targetUrl: string;
subscribedEvents: Array<{
eventType: string;
filter: Record<string, any>;
}>;
signingSecret: string;
status: string;
createdAt: string;
};
}>({
method: HttpMethod.POST,
url: '/v1/webhooks',
apiKey,
body: {
name,
targetUrl,
subscribedEvents,
},
});
},
async deleteWebhook({ apiKey, webhookId }: { apiKey: AppConnectionValueForAuthProperty<typeof folkAuth>; webhookId: string }) {
return this.makeRequest<void>({
method: HttpMethod.DELETE,
url: `/v1/webhooks/${webhookId}`,
apiKey,
body: {}
});
},
};

View File

@@ -0,0 +1,201 @@
import { Property } from '@activepieces/pieces-framework';
import { folkAuth } from './auth';
import { folkClient } from './client';
export const folkProps = {
group_id: (required = false, displayName = 'Group ID') =>
Property.Dropdown({
auth: folkAuth,
displayName,
description:
'Enter a Folk group ID (e.g., grp_abc123). Groups help you organize your contacts.',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account to see groups.',
options: [],
};
}
try {
const response = await folkClient.getGroups({
apiKey: auth,
});
const groups = response.data?.items || [];
return {
disabled: false,
placeholder:
groups.length === 0 ? 'No groups found' : 'Select a group',
options: groups.map((group: any) => ({
label: group.name,
value: group.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Error loading groups. Check your API key.',
options: [],
};
}
},
}),
company_id: (required = false) =>
Property.Dropdown({
auth: folkAuth,
displayName: 'Company',
description: 'Select a company from your Folk workspace.',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account to see companies.',
options: [],
};
}
try {
const limit = 100;
const response = await folkClient.getCompaniesWithFilters({
apiKey: auth,
limit,
});
const companies = response.data?.items || [];
return {
disabled: false,
placeholder:
companies.length === 0
? 'No companies found'
: 'Select a company',
options: companies.slice(0, 100).map((company: any) => {
const emails = company.emails
?.map((e: any) => e.email)
.filter(Boolean)
.join(', ');
const label = emails
? `${company.name} (${emails})`
: company.name || `Company ${company.id}`;
return {
label,
value: company.id,
};
}),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Error loading companies. Check your API key.',
options: [],
};
}
},
}),
companyIds: (required = false) =>
Property.MultiSelectDropdown({
auth: folkAuth,
displayName: 'Companies',
description: 'Select companies to associate with the person.',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account to see companies.',
options: [],
};
}
try {
const limit = 100;
const response = await folkClient.getCompaniesWithFilters({
apiKey: auth,
limit,
});
const companies = response.data?.items || [];
return {
disabled: false,
placeholder:
companies.length === 0
? 'No companies found'
: 'Select companies',
options: companies.map((company: any) => ({
label: company.name,
value: company.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Error loading companies. Check your API key.',
options: [],
};
}
},
}),
person_id: (required = false) =>
Property.Dropdown({
auth: folkAuth,
displayName: 'Person',
description: 'Select a person from your Folk workspace.',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account to see people.',
options: [],
};
}
try {
const limit = 100;
const response = await folkClient.getPeopleWithFilters({
apiKey: auth,
limit,
});
const people = response.data?.items || [];
return {
disabled: false,
placeholder:
people.length === 0 ? 'No people found' : 'Select a person',
options: people.slice(0, 100).map((person: any) => {
const name =
person.fullName ||
person.name ||
`${person.firstName || ''} ${person.lastName || ''}`.trim();
const emails = person.emails
?.map((e: any) => e.email)
.filter(Boolean)
.join(', ');
const label = emails
? `${name} (${emails})`
: name || `Person ${person.id}`;
return {
label,
value: person.id,
};
}),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Error loading people. Check your API key.',
options: [],
};
}
},
}),
};

View File

@@ -0,0 +1,76 @@
import {
createTrigger,
Property,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const companyAdded = createTrigger({
auth: folkAuth,
name: 'company_added',
displayName: 'Company Added',
description: 'Fires when a new company is added to your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'company.created',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/companies/com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'company.created',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Company Added - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'company.created') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,76 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
export const companyCustomFieldUpdated = createTrigger({
auth: folkAuth,
name: 'company_custom_field_updated',
displayName: 'Company Groups Updated',
description:
"Fires when a company's group assignments are updated in your Folk workspace.",
props: {},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'company.groups_updated',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/companies/com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
changes: [
{
path: ['groups'],
type: 'add',
value: [{ id: 'grp_bc984b3f-0386-434d-82d7-a91eb6badd71' }],
},
{
path: ['groups'],
type: 'remove',
value: [{ id: 'grp_3b7d7b65-4c2d-4b65-822a-6bc759e1e951' }],
},
],
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const subscribedEvents = [
{
eventType: 'company.groups_updated',
},
];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Company Groups Updated - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'company.groups_updated') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,80 @@
import {
createTrigger,
Property,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const companyRemoved = createTrigger({
auth: folkAuth,
name: 'company_removed',
displayName: 'Company Removed',
description: 'Fires when a company is removed from your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'company.deleted',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/companies/com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
details: {
name: 'ACME Inc.',
emails: ['hello@acme.com'],
},
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'company.deleted',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Company Removed - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'company.deleted') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,113 @@
import {
createTrigger,
Property,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const companyUpdated = createTrigger({
auth: folkAuth,
name: 'company_updated',
displayName: 'Company Updated',
description: 'Fires when a company is updated in your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'company.updated',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/companies/com_05837e2d-9bf7-4f17-8729-e95f1be4de67',
changes: [
{
path: ['name'],
type: 'set',
value: 'ACME Inc.',
},
{
path: ['description'],
type: 'set',
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Status',
],
type: 'set',
value: 'In Progress',
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Tags',
],
type: 'remove',
value: ['VIP'],
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Assigned to',
],
type: 'add',
value: [{ id: 'usr_3b7d7b65-4c2d-4b65-822a-6bc759e1e951' }],
},
],
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'company.updated',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Company Updated - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'company.updated') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,83 @@
import {
createTrigger,
TriggerStrategy,
Property,
} from '@activepieces/pieces-framework';
import {
httpClient,
HttpRequest,
HttpMethod,
} from '@activepieces/pieces-common';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const personAdded = createTrigger({
auth: folkAuth,
name: 'person_added',
displayName: 'Person Added',
description: 'Fires when a new person is added to your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'person.created',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/people/per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'person.created',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Person Added - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
// Webhook might already be deleted, ignore error
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'person.created') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,76 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
export const personCustomFieldUpdated = createTrigger({
auth: folkAuth,
name: 'person_custom_field_updated',
displayName: 'Person Groups Updated',
description:
"Fires when a person's group assignments are updated in your Folk workspace.",
props: {},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'person.groups_updated',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/people/per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
changes: [
{
path: ['groups'],
type: 'add',
value: [{ id: 'grp_bc984b3f-0386-434d-82d7-a91eb6badd71' }],
},
{
path: ['groups'],
type: 'remove',
value: [{ id: 'grp_3b7d7b65-4c2d-4b65-822a-6bc759e1e951' }],
},
],
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const subscribedEvents = [
{
eventType: 'person.groups_updated',
},
];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Person Groups Updated - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'person.groups_updated') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,76 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const personRemoved = createTrigger({
auth: folkAuth,
name: 'person_removed',
displayName: 'Person Removed',
description: 'Fires when a person is removed from your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'person.deleted',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/people/per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
details: {
name: 'John Doe',
emails: ['john@doe.com'],
},
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'person.deleted',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Person Removed - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'person.deleted') {
return [];
}
return [payloadBody];
},
});

View File

@@ -0,0 +1,115 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { folkAuth } from '../common/auth';
import { folkClient } from '../common/client';
import { folkProps } from '../common/props';
export const personUpdated = createTrigger({
auth: folkAuth,
name: 'person_updated',
displayName: 'Person Updated',
description: 'Fires when a person is updated in your Folk workspace.',
props: {
groupId: folkProps.group_id(false, 'Group ID'),
},
sampleData: {
id: 'evt_6004f2ef-dcc3-4c56-a704-9326730ad100',
type: 'person.updated',
createdAt: '2025-09-30T09:55:52.715Z',
source:
'https://api.folk.app/v1/webhooks/wbk_2f15ec4f-0f70-4884-a43d-1f88ef7a6665',
data: {
id: 'per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
url: 'https://api.folk.app/v1/people/per_05837e2d-9bf7-4f17-8729-e95f1be4de67',
changes: [
{
path: ['firstName'],
type: 'set',
value: 'John',
},
{
path: ['description'],
type: 'set',
},
{
path: ['companies'],
type: 'add',
value: [{ id: 'com_3b7d7b65-4c2d-4b65-822a-6bc759e1e951' }],
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Status',
],
type: 'set',
value: 'In Progress',
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Tags',
],
type: 'remove',
value: ['VIP'],
},
{
path: [
'customFieldValues',
'grp_bc984b3f-0386-434d-82d7-a91eb6badd71',
'Assigned to',
],
type: 'add',
value: [{ id: 'usr_3b7d7b65-4c2d-4b65-822a-6bc759e1e951' }],
},
],
},
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const eventConfig: any = {
eventType: 'person.updated',
};
if (context.propsValue?.groupId) {
eventConfig.filter = {
groupId: context.propsValue.groupId,
};
}
const subscribedEvents = [eventConfig];
const webhook = await folkClient.createWebhook({
apiKey: context.auth,
name: `Activepieces Person Updated - ${Date.now()}`,
targetUrl: context.webhookUrl,
subscribedEvents,
});
await context.store?.put('_webhookId', webhook.data.id);
// await context.store?.put('_signingSecret', webhook.data.signingSecret);
},
async onDisable(context) {
const webhookId = (await context.store?.get('_webhookId')) as string;
if (webhookId) {
try {
await folkClient.deleteWebhook({
apiKey: context.auth,
webhookId,
});
} catch (error) {
console.warn('Failed to delete webhook:', error);
}
}
},
async run(context) {
const payloadBody = context.payload.body as any;
if (payloadBody.type !== 'person.updated') {
return [];
}
return [payloadBody];
},
});