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,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-fathom
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-fathom` to build the library.

View File

@@ -0,0 +1,27 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"name": "@activepieces/piece-fathom",
"dependencies": {
"fathom-typescript": "^0.0.36",
"tslib": "^2.3.0",
},
},
},
"packages": {
"@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="],
"fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="],
"fathom-typescript": ["fathom-typescript@0.0.36", "", { "dependencies": { "svix": "^1.65.0", "zod": "^3.20.0" } }, "sha512-DKVDAp8kCP1fHEkkqWk6QV9RLlcoTwoXkShPyuSQJDnZq+EzedXPk3kG/FINpUci0+6dGkTjfaItp9laGOi4JA=="],
"svix": ["svix@1.81.0", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0", "uuid": "^10.0.0" } }, "sha512-Q4DiYb1ydhRYqez65vZES8AkGY2oxn26qP7mLVbMf8Orrveb54TZLkaVG5zr7eJT4T3zYRThkKf6aOnvzgwhYw=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="],
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
}
}

View File

@@ -0,0 +1,11 @@
{
"name": "@activepieces/piece-fathom",
"version": "0.0.2",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"fathom-typescript": "^0.0.36",
"tslib": "^2.3.0"
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-fathom",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/fathom/src",
"projectType": "library",
"release": {
"version": {
"manifestRootsToUpdate": [
"dist/{projectRoot}"
],
"currentVersionResolver": "git-tag",
"fallbackCurrentVersionResolver": "disk"
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/fathom",
"tsConfig": "packages/pieces/community/fathom/tsconfig.lib.json",
"packageJson": "packages/pieces/community/fathom/package.json",
"main": "packages/pieces/community/fathom/src/index.ts",
"assets": [
"packages/pieces/community/fathom/*.md",
{
"input": "packages/pieces/community/fathom/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/fathom",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom ist ein KI-Sitzungsassistent, der automatisch Zusammenfassungen und Aktionselemente aus Ihren Meetings aufzeichnet, überträgt, hervorhebt und generiert. Integrieren Sie in Workflows, um auf Meetings zu reagieren und Meetingdaten abzurufen.",
"Enter your Fathom API key": "Fathom API-Schlüssel eingeben",
"Get Recording Summary": "Aufzeichnungszusammenfassung abrufen",
"Get Recording Transcript": "Aufnahme-Transkript abrufen",
"List Meetings": "Meetings auflisten",
"Find Team": "Team finden",
"Find Team Member": "Teammitglied finden",
"Get the AI-generated summary of a meeting recording": "Erhalten Sie die AI-generierte Zusammenfassung einer Besprechung",
"Get the AI-generated transcript of a meeting recording": "Erhalte die AI-generierte Abschrift einer Besprechungsaufzeichnung",
"List meetings with optional filtering and pagination": "Besprechungen mit optionaler Filterung und Seitenangabe auflisten",
"Find team based on name": "Team basierend auf Namen suchen",
"Find team member based on email": "Teammitglied basierend auf E-Mail finden",
"Meeting Recording": "Besprechung",
"Destination URL": "Ziel-URL",
"Calendar Invitees": "Kalendereinladungen",
"Calendar Invitees Domains": "Einladungs-Domänen des Kalenders",
"Calendar Invitees Domains Type": "Kalender Einladungen Domänentyp",
"Recorded By": "Aufgenommen von",
"Teams": "Teams",
"Created After": "Erstellt nach",
"Created Before": "Erstellt vor",
"Include Transcript": "Transkript einbeziehen",
"Include Summary": "Zusammenfassung einbeziehen",
"Include Action Items": "Aktionselemente einbeziehen",
"Include CRM Matches": "CRM Matches einbeziehen",
"Cursor": "Cursor",
"Team": "Team",
"Select the meeting recording to get the summary for": "Wählen Sie die Besprechungsaufnahme, um die Zusammenfassung zu erhalten für",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Optional: URL wo Fathom die Zusammenfassung POST wird. Leer lassen um Daten direkt in Antwort zu erhalten.",
"Select the meeting recording to get the transcript for": "Wählen Sie die Besprechungsaufnahme, um das Transkript zu erhalten für",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Optional: URL wo Fathom das Transkript POST wird. Leer lassen um Daten direkt in Antwort zu erhalten.",
"Email addresses of calendar invitees to filter by": "E-Mail-Adressen der Kalendereinladungen nach",
"Domains of the companies to filter by (e.g., acme.com)": "Domänen der zu filternden Unternehmen (z.B. acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filtern Sie, ob die Kalender-Einladungsliste externe E-Mail-Domänen enthält",
"Email addresses of users who recorded meetings": "E-Mail-Adressen von Benutzern, die Meetings aufgezeichnet haben",
"Team names to filter by (e.g., Sales, Engineering)": "Teamnamen zum Filtern (z.B. Verkauf, Ingenieur)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter für Meetings, die nach diesem Zeitstempel erstellt wurden (z.B. 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter für Meetings, die vor diesem Zeitstempel erstellt wurden (z.B. 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Transkript für jede Besprechung einbeziehen",
"Include the summary for each meeting": "Zusammenfassung für jedes Meeting einbeziehen",
"Include the action items for each meeting": "Fügen Sie die Aktionselemente für jedes Meeting ein",
"Include CRM matches for each meeting": "CRM-Matches für jedes Meeting einbeziehen",
"Cursor for pagination (from previous response)": "Cursor für Seitennavigation (von vorheriger Antwort)",
"Team name to filter by": "Teamname zum filtern",
"All": "Alle",
"Only Internal": "Nur intern",
"One or More External": "Ein oder mehrere Externe",
"New Recording": "Neue Aufnahme",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Feuer, wenn ein Meeting aufgezeichnet wird (z.B. eine neue Sitzungsaufzeichnung wird erstellt)",
"Trigger For": "Auslösen für",
"Select which types of recordings should trigger this webhook": "Wählen Sie, welche Arten von Aufzeichnungen diesen Webhook auslösen sollen",
"Include the transcript in the webhook payload": "Das Protokoll in die Payload des Webhooks einbeziehen",
"Include the summary in the webhook payload": "Zusammenfassung in den webhook payload einfügen",
"Include the action items in the webhook payload": "Die Aktionselemente in den webhook payload einbeziehen",
"Include CRM matches in the webhook payload": "CRM-Matches in den Webhook Payload einbeziehen"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom es un asistente de reuniones de IA que automáticamente registra, transcribe, resalta y genera resúmenes de IA y elementos de acción a partir de sus reuniones. Integre con flujos de trabajo para reaccionar a los eventos de reunión y recuperar los datos de las reuniones.",
"Enter your Fathom API key": "Introduzca su clave API de Fathom",
"Get Recording Summary": "Obtener resumen de grabación",
"Get Recording Transcript": "Obtener la grabación de transcripción",
"List Meetings": "Lista de reuniones",
"Find Team": "Buscar equipo",
"Find Team Member": "Buscar miembro del equipo",
"Get the AI-generated summary of a meeting recording": "Obtenga el resumen generado por la IA de la grabación de una reunión",
"Get the AI-generated transcript of a meeting recording": "Obtener la transcripción generada por la IA de la grabación de una reunión",
"List meetings with optional filtering and pagination": "Listar reuniones con filtrado opcional y paginación",
"Find team based on name": "Buscar equipo basado en el nombre",
"Find team member based on email": "Buscar miembro del equipo basado en correo electrónico",
"Meeting Recording": "Grabación de reunión",
"Destination URL": "URL de destino",
"Calendar Invitees": "Invitados del calendario",
"Calendar Invitees Domains": "Dominios del Calendario de Invitados",
"Calendar Invitees Domains Type": "Tipo de Dominios de Invitados del Calendario",
"Recorded By": "Registrado por",
"Teams": "Equipos",
"Created After": "Creado después de",
"Created Before": "Creado antes",
"Include Transcript": "Incluye transcripción",
"Include Summary": "Resumen de inclusión",
"Include Action Items": "Incluye elementos de acción",
"Include CRM Matches": "Incluye coincidencias CRM",
"Cursor": "Cursor",
"Team": "Equipo",
"Select the meeting recording to get the summary for": "Seleccione la grabación de la reunión para obtener el resumen de",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Opcional: URL donde Fathom POST el resumen. Dejar en blanco para obtener datos directamente en respuesta.",
"Select the meeting recording to get the transcript for": "Seleccione la grabación de la reunión para obtener la transcripción de",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Opcional: URL donde Fathom POST la transcripción. Dejar en blanco para obtener datos directamente en respuesta.",
"Email addresses of calendar invitees to filter by": "Direcciones de correo electrónico de los invitados del calendario a filtrar por",
"Domains of the companies to filter by (e.g., acme.com)": "Dominios de las empresas por las que filtrar (por ejemplo, acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filtrar por si la lista de invitados del calendario incluye dominios de correo externo",
"Email addresses of users who recorded meetings": "Direcciones de correo electrónico de los usuarios que grabaron reuniones",
"Team names to filter by (e.g., Sales, Engineering)": "Nombres de equipo por los que filtrar (por ejemplo, ventas, ingeniería)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrar a reuniones creadas después de esta marca de tiempo (por ejemplo, 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrar a reuniones creadas antes de esta marca de tiempo (por ejemplo, 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Incluye la transcripción para cada reunión",
"Include the summary for each meeting": "Incluye el resumen de cada reunión",
"Include the action items for each meeting": "Incluye los elementos de acción para cada reunión",
"Include CRM matches for each meeting": "Incluye coincidencias CRM para cada reunión",
"Cursor for pagination (from previous response)": "Curso de paginación (de respuesta anterior)",
"Team name to filter by": "Nombre del equipo a filtrar por",
"All": "Todos",
"Only Internal": "Sólo Interno",
"One or More External": "Uno o más externos",
"New Recording": "Nueva grabación",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Dispara cuando se graba una reunión (es decir, se produce una nueva grabación de reunión)",
"Trigger For": "Disparador para",
"Select which types of recordings should trigger this webhook": "Seleccione qué tipos de grabaciones deben activar este webhook",
"Include the transcript in the webhook payload": "Incluye la transcripción en el webhook payload",
"Include the summary in the webhook payload": "Incluye el resumen en la carga del webhook",
"Include the action items in the webhook payload": "Incluye los elementos de acción en la carga del webhook",
"Include CRM matches in the webhook payload": "Incluye coincidencias CRM en la carga del webhook"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom est un assistant de réunion de l'IA qui enregistre automatiquement, transcrire, met en évidence et génère des résumés et des éléments d'action IA à partir de vos réunions. Intégrer aux workflows pour réagir aux événements de réunion et récupérer les données de la réunion.",
"Enter your Fathom API key": "Entrez votre clé API Fathom",
"Get Recording Summary": "Résumé de l'enregistrement",
"Get Recording Transcript": "Obtenir la transcription d'enregistrement",
"List Meetings": "Lister les réunions",
"Find Team": "Trouver une équipe",
"Find Team Member": "Trouver un membre de l'équipe",
"Get the AI-generated summary of a meeting recording": "Obtenir le résumé généré par l'IA d'un enregistrement de réunion",
"Get the AI-generated transcript of a meeting recording": "Obtenir la transcription d'un enregistrement de réunion générée par l'IA",
"List meetings with optional filtering and pagination": "Lister les réunions avec filtrage et pagination facultatifs",
"Find team based on name": "Trouver une équipe basée sur le nom",
"Find team member based on email": "Trouver un membre de l'équipe en fonction de l'e-mail",
"Meeting Recording": "Enregistrement de la réunion",
"Destination URL": "URL de destination",
"Calendar Invitees": "Invités du calendrier",
"Calendar Invitees Domains": "Domaines des invités du calendrier",
"Calendar Invitees Domains Type": "Type de domaine des invités du calendrier",
"Recorded By": "Enregistré par",
"Teams": "Équipes",
"Created After": "Créé après",
"Created Before": "Créé avant",
"Include Transcript": "Inclure la transcription",
"Include Summary": "Inclure le résumé",
"Include Action Items": "Inclure les éléments de l'action",
"Include CRM Matches": "Inclure les correspondances CRM",
"Cursor": "Curseur",
"Team": "Équipe",
"Select the meeting recording to get the summary for": "Sélectionnez l'enregistrement de la réunion pour obtenir le résumé pour",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Optionnel: URL où Fathom POST le résumé. Laissez vide pour obtenir des données directement dans la réponse.",
"Select the meeting recording to get the transcript for": "Sélectionnez l'enregistrement de la réunion pour obtenir la transcription pour",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Optionnel: URL où Fathom POST la transcription. Laissez vide pour obtenir des données directement dans la réponse.",
"Email addresses of calendar invitees to filter by": "Adresses e-mail des invités de calendrier à filtrer par",
"Domains of the companies to filter by (e.g., acme.com)": "Domaines des entreprises à filtrer (par exemple, acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filtrer par si la liste des invités du calendrier inclut des domaines de messagerie externes",
"Email addresses of users who recorded meetings": "Adresses e-mail des utilisateurs qui ont enregistré des réunions",
"Team names to filter by (e.g., Sales, Engineering)": "Noms d'équipes à filtrer par (ex: ventes, ingénierie)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrer aux réunions créées après cet horodatage (par exemple, 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrer aux réunions créées avant cet horodatage (par exemple, 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Inclure la transcription pour chaque réunion",
"Include the summary for each meeting": "Inclure le résumé pour chaque réunion",
"Include the action items for each meeting": "Inclure les éléments d'action pour chaque réunion",
"Include CRM matches for each meeting": "Inclure les correspondances CRM pour chaque réunion",
"Cursor for pagination (from previous response)": "Curseur pour la pagination (à partir de la réponse précédente)",
"Team name to filter by": "Nom de l'équipe à filtrer par",
"All": "Tous",
"Only Internal": "Uniquement en interne",
"One or More External": "Un ou plusieurs externes",
"New Recording": "Nouvel enregistrement",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Se déclenche lorsqu'une réunion est enregistrée (c'est-à-dire qu'une nouvelle réunion est produite)",
"Trigger For": "Déclencheur pour",
"Select which types of recordings should trigger this webhook": "Sélectionnez les types d'enregistrement à déclencher ce webhook",
"Include the transcript in the webhook payload": "Inclure la transcription dans la charge utile du webhook",
"Include the summary in the webhook payload": "Inclure le résumé dans la charge utile du webhook",
"Include the action items in the webhook payload": "Inclure les éléments d'action dans la charge utile du webhook",
"Include CRM matches in the webhook payload": "Inclure les correspondances CRM dans la charge utile du webhook"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "FathomはAIミーティングアシスタントで、ミーティングから自動的にAIの要約やアクションアイテムを記録、転写、ハイライト、生成します。 ワークフローと統合してミーティングイベントに反応し、ミーティングデータを取得します。",
"Enter your Fathom API key": "Fathom APIキーを入力してください",
"Get Recording Summary": "レコーディングの概要",
"Get Recording Transcript": "録音トランスクリプトを取得",
"List Meetings": "ミーティング一覧",
"Find Team": "チームを探す",
"Find Team Member": "チームメンバーを探す",
"Get the AI-generated summary of a meeting recording": "会議録音のAI生成サマリーを取得する",
"Get the AI-generated transcript of a meeting recording": "会議録音のAI生成記録を取得する",
"List meetings with optional filtering and pagination": "フィルタリングとページネーションでミーティングを一覧表示する",
"Find team based on name": "名前に基づいてチームを探す",
"Find team member based on email": "メールに基づいてチームメンバーを見つける",
"Meeting Recording": "ミーティング記録",
"Destination URL": "リンク先URL",
"Calendar Invitees": "カレンダーの招待",
"Calendar Invitees Domains": "カレンダー招待ドメイン",
"Calendar Invitees Domains Type": "カレンダー招待者ドメインタイプ",
"Recorded By": "記録者",
"Teams": "チーム",
"Created After": "作成後",
"Created Before": "作成前",
"Include Transcript": "トランスクリプトを含める",
"Include Summary": "概要を含める",
"Include Action Items": "アクションアイテムを含める",
"Include CRM Matches": "CRMの一致を含める",
"Cursor": "Cursor",
"Team": "Team",
"Select the meeting recording to get the summary for": "以下の概要を取得するミーティング記録を選択してください",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "オプション: 要約を投稿するURL。応答で直接データを取得するには、空のままにします。",
"Select the meeting recording to get the transcript for": "会議の録音記録を選択してください",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "オプション: FathomがトランスクリプトをPOSTするURL。空のままにすると、応答で直接データを取得できます。",
"Email addresses of calendar invitees to filter by": "フィルタリングするカレンダー招待者のメールアドレス:",
"Domains of the companies to filter by (e.g., acme.com)": "フィルター対象の企業のドメイン (例: acme.com)",
"Filter by whether calendar invitee list includes external email domains": "カレンダー招待者リストに外部メールドメインが含まれているかどうかでフィルター",
"Email addresses of users who recorded meetings": "ミーティングを記録したユーザーのメールアドレス",
"Team names to filter by (e.g., Sales, Engineering)": "フィルタリングするチーム名(例:セールス、エンジニアリング)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "このタイムスタンプの後に作成されたミーティングをフィルタリングします2025-01T00:00Z",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "このタイムスタンプの前に作成されたミーティングをフィルタリングします2025-01T00:00Z",
"Include the transcript for each meeting": "各ミーティングの成績簿を含める",
"Include the summary for each meeting": "各ミーティングの概要を含める",
"Include the action items for each meeting": "各ミーティングのアクション項目を含める",
"Include CRM matches for each meeting": "各ミーティングにCRM一致を含める",
"Cursor for pagination (from previous response)": "ページネーションのカーソル(以前の応答から)",
"Team name to filter by": "フィルタリングするチーム名",
"All": "すべて",
"Only Internal": "内部のみ",
"One or More External": "1つまたは複数の外部",
"New Recording": "新しい録音",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "ミーティングが記録されたときに発火します.(例えば,新しいミーティングの記録が作成されます)",
"Trigger For": "トリガー:",
"Select which types of recordings should trigger this webhook": "このWebhookをトリガーする録音の種類を選択してください",
"Include the transcript in the webhook payload": "Webhookペイロードにトランスクリプトを含める",
"Include the summary in the webhook payload": "Webhookペイロードに概要を含める",
"Include the action items in the webhook payload": "Webhookペイロードにアクション項目を含める",
"Include CRM matches in the webhook payload": "WebhookペイロードにCRMの一致を含める"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom is een AI meeting assistent die automatisch registreert, transcribes, highlighten en AI samenvattingen en actie items uit uw vergaderingen genereert. Integreer met workflows om te reageren op gebeurtenissen van vergadering en vergadergegevens ophalen.",
"Enter your Fathom API key": "Voer uw Fathom API-sleutel in",
"Get Recording Summary": "Samenvatting opnemen",
"Get Recording Transcript": "Opname Transcript ophalen",
"List Meetings": "Afspraken weergeven",
"Find Team": "Vind Team",
"Find Team Member": "Vind Team Lid",
"Get the AI-generated summary of a meeting recording": "Krijg de AI-gegenereerde samenvatting van een vergadering",
"Get the AI-generated transcript of a meeting recording": "Krijg de AI-gegenereerde transcript van een vergadering opname",
"List meetings with optional filtering and pagination": "Toon vergaderingen met optionele filtering en paginering",
"Find team based on name": "Vind team gebaseerd op naam",
"Find team member based on email": "Vind teamlid op basis van e-mail",
"Meeting Recording": "Vergadering Opnemen",
"Destination URL": "Bestemming URL",
"Calendar Invitees": "Kalender genodigden",
"Calendar Invitees Domains": "Kalender genodigden domeinen",
"Calendar Invitees Domains Type": "Kalender Uitgenodigden Domeinen Type",
"Recorded By": "Opgenomen door",
"Teams": "teams",
"Created After": "Gemaakt na",
"Created Before": "Aangemaakt voor",
"Include Transcript": "Transcript meenemen",
"Include Summary": "Samenvatting opnemen",
"Include Action Items": "Voeg actie items toe",
"Include CRM Matches": "Inclusief CRM overeenkomsten",
"Cursor": "Cursor",
"Team": "Team",
"Select the meeting recording to get the summary for": "Selecteer de vergadering opname om de samenvatting te krijgen voor",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Optioneel: URL waar Fathom de samenvatting zal POSTen. Laat leeg om gegevens direct in reactie te krijgen.",
"Select the meeting recording to get the transcript for": "Selecteer de meetingopname om de transcript voor te krijgen",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Optioneel: URL waar Fathom het transcript zal postgeven. Laat leeg om gegevens direct te krijgen in een reactie.",
"Email addresses of calendar invitees to filter by": "Email adressen van agenda uitnodigingen om te filteren op",
"Domains of the companies to filter by (e.g., acme.com)": "Domeinen van bedrijven waarop gefilterd kan worden (b.v. acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filter op of de kalender uitnodigingslijst externe e-maildomeinen bevat",
"Email addresses of users who recorded meetings": "E-mailadressen van gebruikers die vergaderingen hebben opgenomen",
"Team names to filter by (e.g., Sales, Engineering)": "Teamnamen om te filteren op (bijv. Verkopening, Ingenieering)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter op vergaderingen aangemaakt na deze tijdstempel (bijv. 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter op vergaderingen gemaakt voor deze tijdstempel (bijv. 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Voeg de transcript voor elke vergadering toe",
"Include the summary for each meeting": "Voeg de samenvatting toe voor elke vergadering",
"Include the action items for each meeting": "Voeg de actie items toe voor elke vergadering",
"Include CRM matches for each meeting": "Inclusief CRM overeenkomsten voor elke vergadering",
"Cursor for pagination (from previous response)": "Cursor voor paginering (uit vorige reactie)",
"Team name to filter by": "Teamnaam om te filteren op",
"All": "Allemaal",
"Only Internal": "Alleen intern",
"One or More External": "Een of meer extern",
"New Recording": "Nieuwe opname",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Vuurt wanneer een vergadering wordt opgenomen (dat wil zeggen dat er een nieuwe vergadering wordt opgenomen)",
"Trigger For": "Trigger voor",
"Select which types of recordings should trigger this webhook": "Selecteer welke type opnames deze webhook moet activeren",
"Include the transcript in the webhook payload": "Inclusief de transcript in de webhook payload",
"Include the summary in the webhook payload": "Voeg de samenvatting toe aan de webhook payload",
"Include the action items in the webhook payload": "Inclusief de actie items in de webhook payload",
"Include CRM matches in the webhook payload": "Inclusief CRM overeenkomsten in de webhook payload"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom é um assistente de encontro à IA que registra automaticamente, transcrições, realces e gera resumos de IA e itens de ação de suas reuniões. Integre com fluxos de trabalho para reagir a eventos de reunião e recuperar dados de reuniões.",
"Enter your Fathom API key": "Digite sua chave da API Fathom",
"Get Recording Summary": "Obter Resumo da Gravação",
"Get Recording Transcript": "Obter Transcrição de Gravação",
"List Meetings": "Listar Reuniões",
"Find Team": "Encontrar equipe",
"Find Team Member": "Localizar membro da equipe",
"Get the AI-generated summary of a meeting recording": "Obter o resumo gerado pela IA de uma gravação de reunião",
"Get the AI-generated transcript of a meeting recording": "Obtenha a transcrição gerada pela IA de uma gravação de reuniões",
"List meetings with optional filtering and pagination": "Lista de reuniões com filtragem e paginação opcionais",
"Find team based on name": "Encontrar uma equipe baseada no nome",
"Find team member based on email": "Encontrar membro da equipe com base no e-mail",
"Meeting Recording": "Gravação de Reunião",
"Destination URL": "URL de destino",
"Calendar Invitees": "Convidados do calendário",
"Calendar Invitees Domains": "Domínios Convidados da Agenda",
"Calendar Invitees Domains Type": "Tipo de domínios convidados do calendário",
"Recorded By": "Registrado por",
"Teams": "Times",
"Created After": "Criado Depois",
"Created Before": "Criado Antes",
"Include Transcript": "Incluir Transcrição",
"Include Summary": "Incluir Resumo",
"Include Action Items": "Incluir itens de ação",
"Include CRM Matches": "Incluir Partidas CRM",
"Cursor": "Cursor",
"Team": "Equipe",
"Select the meeting recording to get the summary for": "Selecione a gravação da reunião para obter o resumo de",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Opcional: URL onde Fathom irá POST o resumo. Deixe em branco para obter dados diretamente na resposta.",
"Select the meeting recording to get the transcript for": "Selecione a gravação da reunião para obter a transcrição para",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Opcional: URL onde Fathom irá POST a transcrição. Deixe em branco para obter dados diretamente na resposta.",
"Email addresses of calendar invitees to filter by": "Endereços de e-mail dos convidados da agenda para filtrar por",
"Domains of the companies to filter by (e.g., acme.com)": "Domínios das empresas a serem filtrados (por exemplo, acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filtrar por se a lista de convidados da agenda inclui domínios de e-mail externos",
"Email addresses of users who recorded meetings": "Endereços de e-mail de usuários que gravaram reuniões",
"Team names to filter by (e.g., Sales, Engineering)": "Nomes de equipe para filtrar (por exemplo, Vendas, Engenhario)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrar para reuniões criadas após este timestamp (por exemplo, 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filtrar reuniões criadas antes deste timestamp (por exemplo, 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Incluir a transcrição para cada reunião",
"Include the summary for each meeting": "Incluir o resumo de cada reunião",
"Include the action items for each meeting": "Incluir os itens de ação de cada reunião",
"Include CRM matches for each meeting": "Incluir correspondências CRM para cada reunião",
"Cursor for pagination (from previous response)": "Cursor para paginação (de resposta anterior)",
"Team name to filter by": "Nome da equipe para filtrar por",
"All": "TODOS",
"Only Internal": "Apenas interno",
"One or More External": "Um ou Mais Externos",
"New Recording": "Nova Gravação",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Atira quando uma reunião é gravada (ou seja, é produzido um novo registo de reuniões)",
"Trigger For": "Gatilho para",
"Select which types of recordings should trigger this webhook": "Selecionar quais tipos de gravações devem acionar este webhook",
"Include the transcript in the webhook payload": "Incluir a transcrição na carga do webhook",
"Include the summary in the webhook payload": "Incluir o resumo na carga do webhook",
"Include the action items in the webhook payload": "Incluir os itens de ação na carga do payhook",
"Include CRM matches in the webhook payload": "Incluir CRM correspondências na carga do webhook"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.",
"Enter your Fathom API key": "Enter your Fathom API key",
"Get Recording Summary": "Get Recording Summary",
"Get Recording Transcript": "Get Recording Transcript",
"List Meetings": "List Meetings",
"Find Team": "Find Team",
"Find Team Member": "Find Team Member",
"Get the AI-generated summary of a meeting recording": "Get the AI-generated summary of a meeting recording",
"Get the AI-generated transcript of a meeting recording": "Get the AI-generated transcript of a meeting recording",
"List meetings with optional filtering and pagination": "List meetings with optional filtering and pagination",
"Find team based on name": "Find team based on name",
"Find team member based on email": "Find team member based on email",
"Meeting Recording": "Meeting Recording",
"Destination URL": "Destination URL",
"Calendar Invitees": "Calendar Invitees",
"Calendar Invitees Domains": "Calendar Invitees Domains",
"Calendar Invitees Domains Type": "Calendar Invitees Domains Type",
"Recorded By": "Recorded By",
"Teams": "Teams",
"Created After": "Created After",
"Created Before": "Created Before",
"Include Transcript": "Include Transcript",
"Include Summary": "Include Summary",
"Include Action Items": "Include Action Items",
"Include CRM Matches": "Include CRM Matches",
"Cursor": "Cursor",
"Team": "Team",
"Select the meeting recording to get the summary for": "Select the meeting recording to get the summary for",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.",
"Select the meeting recording to get the transcript for": "Select the meeting recording to get the transcript for",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.",
"Email addresses of calendar invitees to filter by": "Email addresses of calendar invitees to filter by",
"Domains of the companies to filter by (e.g., acme.com)": "Domains of the companies to filter by (e.g., acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filter by whether calendar invitee list includes external email domains",
"Email addresses of users who recorded meetings": "Email addresses of users who recorded meetings",
"Team names to filter by (e.g., Sales, Engineering)": "Team names to filter by (e.g., Sales, Engineering)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Include the transcript for each meeting",
"Include the summary for each meeting": "Include the summary for each meeting",
"Include the action items for each meeting": "Include the action items for each meeting",
"Include CRM matches for each meeting": "Include CRM matches for each meeting",
"Cursor for pagination (from previous response)": "Cursor for pagination (from previous response)",
"Team name to filter by": "Team name to filter by",
"All": "All",
"Only Internal": "Only Internal",
"One or More External": "One or More External",
"New Recording": "New Recording",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Fires when a meeting is recorded (i.e. a new meeting recording is produced)",
"Trigger For": "Trigger For",
"Select which types of recordings should trigger this webhook": "Select which types of recordings should trigger this webhook",
"Include the transcript in the webhook payload": "Include the transcript in the webhook payload",
"Include the summary in the webhook payload": "Include the summary in the webhook payload",
"Include the action items in the webhook payload": "Include the action items in the webhook payload",
"Include CRM matches in the webhook payload": "Include CRM matches in the webhook payload"
}

View File

@@ -0,0 +1,57 @@
{
"Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.": "Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.",
"Enter your Fathom API key": "Enter your Fathom API key",
"Get Recording Summary": "Get Recording Summary",
"Get Recording Transcript": "Get Recording Transcript",
"List Meetings": "List Meetings",
"Find Team": "Find Team",
"Find Team Member": "Find Team Member",
"Get the AI-generated summary of a meeting recording": "Get the AI-generated summary of a meeting recording",
"Get the AI-generated transcript of a meeting recording": "Get the AI-generated transcript of a meeting recording",
"List meetings with optional filtering and pagination": "List meetings with optional filtering and pagination",
"Find team based on name": "Find team based on name",
"Find team member based on email": "Find team member based on email",
"Meeting Recording": "Meeting Recording",
"Destination URL": "Destination URL",
"Calendar Invitees": "Calendar Invitees",
"Calendar Invitees Domains": "Calendar Invitees Domains",
"Calendar Invitees Domains Type": "Calendar Invitees Domains Type",
"Recorded By": "Recorded By",
"Teams": "Teams",
"Created After": "Created After",
"Created Before": "Created Before",
"Include Transcript": "Include Transcript",
"Include Summary": "Include Summary",
"Include Action Items": "Include Action Items",
"Include CRM Matches": "Include CRM Matches",
"Cursor": "Cursor",
"Team": "Team",
"Select the meeting recording to get the summary for": "Select the meeting recording to get the summary for",
"Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.": "Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.",
"Select the meeting recording to get the transcript for": "Select the meeting recording to get the transcript for",
"Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.": "Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.",
"Email addresses of calendar invitees to filter by": "Email addresses of calendar invitees to filter by",
"Domains of the companies to filter by (e.g., acme.com)": "Domains of the companies to filter by (e.g., acme.com)",
"Filter by whether calendar invitee list includes external email domains": "Filter by whether calendar invitee list includes external email domains",
"Email addresses of users who recorded meetings": "Email addresses of users who recorded meetings",
"Team names to filter by (e.g., Sales, Engineering)": "Team names to filter by (e.g., Sales, Engineering)",
"Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)",
"Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)": "Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)",
"Include the transcript for each meeting": "Include the transcript for each meeting",
"Include the summary for each meeting": "Include the summary for each meeting",
"Include the action items for each meeting": "Include the action items for each meeting",
"Include CRM matches for each meeting": "Include CRM matches for each meeting",
"Cursor for pagination (from previous response)": "Cursor for pagination (from previous response)",
"Team name to filter by": "Team name to filter by",
"All": "所有的",
"Only Internal": "Only Internal",
"One or More External": "One or More External",
"New Recording": "New Recording",
"Fires when a meeting is recorded (i.e. a new meeting recording is produced)": "Fires when a meeting is recorded (i.e. a new meeting recording is produced)",
"Trigger For": "Trigger For",
"Select which types of recordings should trigger this webhook": "Select which types of recordings should trigger this webhook",
"Include the transcript in the webhook payload": "Include the transcript in the webhook payload",
"Include the summary in the webhook payload": "Include the summary in the webhook payload",
"Include the action items in the webhook payload": "Include the action items in the webhook payload",
"Include CRM matches in the webhook payload": "Include CRM matches in the webhook payload"
}

View File

@@ -0,0 +1,26 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { getRecordingSummary } from './lib/actions/get-recording-summary';
import { getRecordingTranscript } from './lib/actions/get-recording-transcript';
import { listMeetings } from './lib/actions/list-meetings';
import { findTeam } from './lib/actions/find-team';
import { findTeamMember } from './lib/actions/find-team-member';
import { newRecording } from './lib/triggers/new-recording';
export const fathomAuth = PieceAuth.SecretText({
displayName: 'API Key',
description: 'Enter your Fathom API key',
required: true
});
export const fathom = createPiece({
displayName: 'Fathom',
auth: fathomAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/fathom.png',
authors: ["fortunamide", "onyedikachi-david"],
categories: [PieceCategory.PRODUCTIVITY],
description: 'Fathom is an AI meeting assistant that automatically records, transcribes, highlights, and generates AI summaries and action items from your meetings. Integrate with workflows to react to meeting events and retrieve meeting data.',
actions: [getRecordingSummary, getRecordingTranscript, listMeetings, findTeam, findTeamMember],
triggers: [newRecording],
});

View File

@@ -0,0 +1,42 @@
import { fathomAuth } from '../..';
import { createAction, Property } from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
import { ListTeamMembersRequest } from 'fathom-typescript/dist/esm/sdk/models/operations';
export const findTeamMember = createAction({
name: 'findTeamMember',
displayName: 'Find Team Member',
description: 'Find team member based on email',
auth: fathomAuth,
props: {
team: Property.ShortText({
displayName: 'Team',
description: 'Team name to filter by',
required: false
}),
cursor: Property.ShortText({
displayName: 'Cursor',
description: 'Cursor for pagination (from previous response)',
required: false
})
},
async run({ auth, propsValue }) {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text }
});
const params: Partial<ListTeamMembersRequest> = {};
if (propsValue.team) {
params.team = propsValue.team;
}
if (propsValue.cursor) {
params.cursor = propsValue.cursor;
}
const response = await fathom.listTeamMembers(params);
return response;
}
});

View File

@@ -0,0 +1,32 @@
import { fathomAuth } from '../..';
import { createAction, Property } from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
import { ListTeamsRequest } from 'fathom-typescript/dist/esm/sdk/models/operations';
export const findTeam = createAction({
name: 'findTeam',
displayName: 'Find Team',
description: 'Find team based on name',
auth: fathomAuth,
props: {
cursor: Property.ShortText({
displayName: 'Cursor',
description: 'Cursor for pagination (from previous response)',
required: false,
}),
},
async run({ auth, propsValue }) {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const params: Partial<ListTeamsRequest> = {};
if (propsValue.cursor) {
params.cursor = propsValue.cursor;
}
const response = await fathom.listTeams(params);
return response;
},
});

View File

@@ -0,0 +1,79 @@
import { fathomAuth } from '../..';
import { createAction, Property } from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
export const getRecordingSummary = createAction({
name: 'getRecordingSummary',
displayName: 'Get Recording Summary',
description: 'Get the AI-generated summary of a meeting recording',
auth: fathomAuth,
props: {
recording_id: Property.Dropdown({
auth: fathomAuth,
displayName: 'Meeting Recording',
description: 'Select the meeting recording to get the summary for',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
try {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const meetingsIterator = await fathom.listMeetings();
const options: { label: string; value: number }[] = [];
for await (const response of meetingsIterator) {
if (response && response.result && response.result.items) {
response.result.items.forEach((meeting) => {
const label = meeting.title || `Meeting on ${meeting.scheduledStartTime.toLocaleDateString()}`;
options.push({
label: label,
value: meeting.recordingId
});
});
}
}
return {
disabled: false,
options: options
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'Failed to load meetings. Please check your API key.'
};
}
}
}),
destination_url: Property.ShortText({
displayName: 'Destination URL',
description: 'Optional: URL where Fathom will POST the summary. Leave empty to get data directly in response.',
required: false,
}),
},
async run({ auth, propsValue }) {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const request = {
recordingId: propsValue.recording_id,
...(propsValue.destination_url && { destinationUrl: propsValue.destination_url })
};
const response = await fathom.getRecordingSummary(request);
return response;
},
});

View File

@@ -0,0 +1,80 @@
import { fathomAuth } from '../..';
import { createAction, Property } from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
import { GetRecordingTranscriptRequest } from 'fathom-typescript/dist/esm/sdk/models/operations';
export const getRecordingTranscript = createAction({
name: 'getRecordingTranscript',
displayName: 'Get Recording Transcript',
description: 'Get the AI-generated transcript of a meeting recording',
auth: fathomAuth,
props: {
recording_id: Property.Dropdown({
auth: fathomAuth,
displayName: 'Meeting Recording',
description: 'Select the meeting recording to get the transcript for',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
try {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const meetingsIterator = await fathom.listMeetings();
const options: { label: string; value: number }[] = [];
for await (const response of meetingsIterator) {
if (response && response.result && response.result.items) {
response.result.items.forEach((meeting) => {
const label = meeting.title || `Meeting on ${meeting.scheduledStartTime.toLocaleDateString()}`;
options.push({
label: label,
value: meeting.recordingId
});
});
}
}
return {
disabled: false,
options: options
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'Failed to load meetings. Please check your API key.'
};
}
}
}),
destination_url: Property.ShortText({
displayName: 'Destination URL',
description: 'Optional: URL where Fathom will POST the transcript. Leave empty to get data directly in response.',
required: false,
}),
},
async run({ auth, propsValue }) {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const request = {
recordingId: propsValue.recording_id,
...(propsValue.destination_url && { destinationUrl: propsValue.destination_url })
} as GetRecordingTranscriptRequest;
const response = await fathom.getRecordingTranscript(request);
return response;
},
});

View File

@@ -0,0 +1,149 @@
import { fathomAuth } from '../..';
import { createAction, Property } from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
import { ListMeetingsRequest } from 'fathom-typescript/dist/esm/sdk/models/operations';
export const listMeetings = createAction({
name: 'listMeetings',
displayName: 'List Meetings',
description: 'List meetings with optional filtering and pagination',
auth: fathomAuth,
props: {
calendar_invitees: Property.Array({
displayName: 'Calendar Invitees',
description: 'Email addresses of calendar invitees to filter by',
required: false,
}),
calendar_invitees_domains: Property.Array({
displayName: 'Calendar Invitees Domains',
description: 'Domains of the companies to filter by (e.g., acme.com)',
required: false,
}),
calendar_invitees_domains_type: Property.StaticDropdown({
displayName: 'Calendar Invitees Domains Type',
description: 'Filter by whether calendar invitee list includes external email domains',
required: false,
options: {
options: [
{ label: 'All', value: 'all' },
{ label: 'Only Internal', value: 'only_internal' },
{ label: 'One or More External', value: 'one_or_more_external' },
],
},
defaultValue: 'all',
}),
recorded_by: Property.Array({
displayName: 'Recorded By',
description: 'Email addresses of users who recorded meetings',
required: false,
}),
teams: Property.Array({
displayName: 'Teams',
description: 'Team names to filter by (e.g., Sales, Engineering)',
required: false,
}),
created_after: Property.ShortText({
displayName: 'Created After',
description: 'Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)',
required: false,
}),
created_before: Property.ShortText({
displayName: 'Created Before',
description: 'Filter to meetings created before this timestamp (e.g., 2025-01-01T00:00:00Z)',
required: false,
}),
include_transcript: Property.Checkbox({
displayName: 'Include Transcript',
description: 'Include the transcript for each meeting',
required: false,
defaultValue: false,
}),
include_summary: Property.Checkbox({
displayName: 'Include Summary',
description: 'Include the summary for each meeting',
required: false,
defaultValue: false,
}),
include_action_items: Property.Checkbox({
displayName: 'Include Action Items',
description: 'Include the action items for each meeting',
required: false,
defaultValue: false,
}),
include_crm_matches: Property.Checkbox({
displayName: 'Include CRM Matches',
description: 'Include CRM matches for each meeting',
required: false,
defaultValue: false,
}),
cursor: Property.ShortText({
displayName: 'Cursor',
description: 'Cursor for pagination (from previous response)',
required: false,
}),
},
async run({ auth, propsValue }) {
const fathom = new Fathom({
security: { apiKeyAuth: auth.secret_text },
});
const request: Partial<ListMeetingsRequest> = {};
if (propsValue.calendar_invitees && Array.isArray(propsValue.calendar_invitees)) {
request.calendarInvitees = propsValue.calendar_invitees as string[];
}
if (propsValue.calendar_invitees_domains && Array.isArray(propsValue.calendar_invitees_domains)) {
request.calendarInviteesDomains = propsValue.calendar_invitees_domains as string[];
}
if (propsValue.calendar_invitees_domains_type && propsValue.calendar_invitees_domains_type !== 'all') {
request.calendarInviteesDomainsType = propsValue.calendar_invitees_domains_type as 'only_internal' | 'one_or_more_external';
}
if (propsValue.recorded_by && Array.isArray(propsValue.recorded_by)) {
request.recordedBy = propsValue.recorded_by as string[];
}
if (propsValue.teams && Array.isArray(propsValue.teams)) {
request.teams = propsValue.teams as string[];
}
if (propsValue.created_after) {
request.createdAfter = propsValue.created_after;
}
if (propsValue.created_before) {
request.createdBefore = propsValue.created_before;
}
if (propsValue.include_transcript) {
request.includeTranscript = true;
}
if (propsValue.include_summary) {
request.includeSummary = true;
}
if (propsValue.include_action_items) {
request.includeActionItems = true;
}
if (propsValue.include_crm_matches) {
request.includeCrmMatches = true;
}
if (propsValue.cursor) {
request.cursor = propsValue.cursor;
}
const response = await fathom.listMeetings(request);
const meetings = [];
for await (const meeting of response) {
meetings.push(meeting);
}
return meetings;
},
});

View File

@@ -0,0 +1,140 @@
import { fathomAuth } from '../..';
import {
createTrigger,
TriggerStrategy,
Property
} from '@activepieces/pieces-framework';
import { Fathom } from 'fathom-typescript';
import { CreateWebhookRequest } from 'fathom-typescript/dist/esm/sdk/models/operations';
interface WebhookInformation {
webhookId: string;
}
export const newRecording = createTrigger({
auth: fathomAuth,
name: 'newRecording',
displayName: 'New Recording',
description:
'Fires when a meeting is recorded (i.e. a new meeting recording is produced)',
props: {
triggered_for: Property.MultiSelectDropdown({
auth: fathomAuth,
displayName: 'Trigger For',
description: 'Select which types of recordings should trigger this webhook',
required: true,
refreshers: [],
options: async () => {
return {
disabled: false,
options: [
{ label: 'My Recordings', value: 'my_recordings' },
{ label: 'Shared External Recordings', value: 'shared_external_recordings' },
{ label: 'My Shared With Team Recordings', value: 'my_shared_with_team_recordings' },
{ label: 'Shared Team Recordings', value: 'shared_team_recordings' }
]
};
},
defaultValue: ['my_recordings']
}),
include_transcript: Property.Checkbox({
displayName: 'Include Transcript',
description: 'Include the transcript in the webhook payload',
required: false,
defaultValue: false
}),
include_summary: Property.Checkbox({
displayName: 'Include Summary',
description: 'Include the summary in the webhook payload',
required: false,
defaultValue: false
}),
include_action_items: Property.Checkbox({
displayName: 'Include Action Items',
description: 'Include the action items in the webhook payload',
required: false,
defaultValue: false
}),
include_crm_matches: Property.Checkbox({
displayName: 'Include CRM Matches',
description: 'Include CRM matches in the webhook payload',
required: false,
defaultValue: false
})
},
sampleData: {
title: 'Quarterly Business Review',
meeting_title: 'QBR 2025 Q1',
recording_id: 123456789,
url: 'https://fathom.video/xyz123',
share_url: 'https://fathom.video/share/xyz123',
created_at: '2025-03-01T17:01:30Z',
scheduled_start_time: '2025-03-01T16:00:00Z',
scheduled_end_time: '2025-03-01T17:00:00Z',
recording_start_time: '2025-03-01T16:01:12Z',
recording_end_time: '2025-03-01T17:00:55Z',
calendar_invitees_domains_type: 'one_or_more_external',
transcript_language: 'en'
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const fathom = new Fathom({
security: { apiKeyAuth: context.auth.secret_text }
});
const webhookParams: CreateWebhookRequest = {
destinationUrl: context.webhookUrl,
triggeredFor: context.propsValue.triggered_for as ('my_recordings' | 'shared_external_recordings' | 'my_shared_with_team_recordings' | 'shared_team_recordings')[],
includeTranscript: context.propsValue.include_transcript || false,
includeSummary: context.propsValue.include_summary || false,
includeActionItems: context.propsValue.include_action_items || false,
includeCrmMatches: context.propsValue.include_crm_matches || false
};
const webhook = await fathom.createWebhook(webhookParams);
if (webhook?.id) {
await context.store?.put<WebhookInformation>('_new_recording_webhook', {
webhookId: webhook.id
});
}
},
async onDisable(context) {
const webhookInfo = await context.store.get<WebhookInformation>(
'_new_recording_webhook'
);
if (webhookInfo?.webhookId) {
const fathom = new Fathom({
security: { apiKeyAuth: context.auth.secret_text }
});
await fathom.deleteWebhook({ id: webhookInfo.webhookId });
}
},
async test(context) {
const fathom = new Fathom({
security: { apiKeyAuth: context.auth.secret_text }
});
const params = {
includeTranscript: context.propsValue.include_transcript || false,
includeSummary: context.propsValue.include_summary || false,
includeActionItems: context.propsValue.include_action_items || false,
includeCrmMatches: context.propsValue.include_crm_matches || false
};
const response = await fathom.listMeetings(params);
const meetings = [];
for await (const meetingResponse of response) {
if (meetingResponse?.result?.items) {
meetings.push(...meetingResponse.result.items.slice(0, 3));
if (meetings.length >= 3) break;
}
}
return meetings.slice(0, 3);
},
async run(context) {
return [context.payload.body];
}
});

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"importHelpers": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"]
}