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,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "Anruf- und SMS-Plattform. Automatisieren Sie ausgehende Kampagnen, verwalten Sie Leads und erhalten Echtzeit-Anrufanalysen.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Erstelle einen API-Schlüssel in deinem Famulor-Account und füge den Wert hier ein. Hol dir API-Schlüssel hier -> https://app.famulor.de.",
"Add Lead to Campaign": "Lead zur Kampagne hinzufügen",
"Send SMS": "SMS senden",
"Start/Stop Campaign": "Kampagne starten/stoppen",
"Make Phone Call": "Telefonanruf tätigen",
"Delete Lead": "Lead löschen",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Fügen Sie eine Lead zu einer ausgehenden Kampagne hinzu, die von einem KI-Assistenten aufgerufen werden soll.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Senden Sie eine SMS mit Ihren gekauften Telefonnummern. Die Kosten werden automatisch von Ihrem Konto abgezogen.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Starten oder stoppen Sie eine ausgehende Anrufkampagne. Für das Starten benötigen Sie ausreichende Anrufe; das Anhalten von laufenden Anrufen wird abgebrochen.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Initiieren Sie mit einem ausgewählten Assistenten einen Anruf mit AI-gestützten Anrufen an einen Kunden.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": ":warnung: Löschen Sie dauerhaft einen Lead aus dem System. Diese Aktion kann nicht rückgängig gemacht werden und wird laufende Anrufe abbrechen.",
"Campaign": "Kampagne",
"Customer Phone Number": "Kunden-Telefon",
"Variables": "Variablen",
"Allow Duplicates": "Duplikate erlauben",
"Number of Secondary Contacts": "Anzahl der sekundären Kontakte",
"Secondary Contacts": "Sekundäre Kontakte",
"From Phone Number": "Von Telefonnummer",
"Recipient Phone Number": "Telefonnummer des Empfängers",
"Message": "Nachricht",
"Action": "Aktion",
"Assistant": "Assistent",
"Lead": "Lead",
"Select the campaign": "Wählen Sie die Kampagne",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Geben Sie die Telefonnummer des Kunden ein (E.164-Format: +1234567890)",
"Variables to pass to the assistant": "Variablen die an den Assistenten übergeben werden",
"Allow the same phone number to be added to the campaign more than once": "Erlaube die gleiche Telefonnummer mehr als einmal zur Kampagne hinzuzufügen",
"How many secondary contacts do you want to add? (Max: 10)": "Wie viele sekundäre Kontakte möchten Sie hinzufügen? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Fügen Sie für diesen Leitfaden sekundäre Kontakte hinzu. Jeder Kontakt kann seine eigene Telefonnummer und Variablen haben.",
"Select an SMS-capable phone number to send from": "Wählen Sie eine SMS-fähige Telefonnummer zum Senden aus",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Telefonnummer des Empfängers eingeben (Format 164: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "SMS-Nachrichteninhalt (max. 300 Zeichen). Langnachrichten können in mehrere Segmente aufgeteilt werden.",
"Select the action to perform on the campaign": "Aktion für die Kampagne auswählen",
"Select the AI assistant to use for the call": "Wählen Sie den für den Anruf zu verwendenden KI-Assistenten",
"Enter the phone number to call (E.164 format: +1234567890)": "Telefonnummer eingeben (Format 164: +1234567890)",
"Variables to pass to the assistant during the call": "Variablen, die während des Anrufs an den Assistenten übergeben werden",
"Select the lead to delete": "Lead zum Löschen auswählen",
"Start Campaign": "Kampagne starten",
"Stop Campaign": "Kampagne stoppen",
"Phone Call Completed": "Telefonanruf abgeschlossen",
"New or Updated Assistant": "Neuer oder aktualisierter Assistent",
"Inbound Call Received": "Eingehender Anruf empfangen",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Löst einen Anruf aus, wenn ein Anruf abgeschlossen ist, mit vollständiger Gesprächsabschrift, extrahierten Variablen und Rufen Sie Metadaten an.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Löst aus, wenn KI-Assistenten in deinem Famulor Account erstellt oder aktualisiert werden.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Auslöser wenn ein eingehender Anruf von Ihrem AI-Assistenten empfangen wird. Webhook muss für den ausgewählten Assistenten aktiviert sein.",
"Assistant Type": "Assistententyp",
"Items Per Page": "Artikel pro Seite",
"Inbound Assistant": "Eingehender Assistent",
"Select an assistant to receive post-call webhook notifications for": "Wählen Sie einen Assistenten aus, um nach Anruf Webhook-Benachrichtigungen für",
"Filter assistants by type": "Assistenten nach Typ filtern",
"Number of assistants to fetch per page (1-100, default: 10)": "Anzahl der Assistenten pro Seite (1-100, Standardwert: 10)",
"Select an inbound assistant to receive webhook notifications for": "Wählen Sie einen eingehenden Assistenten aus, um Webhook Benachrichtigungen für",
"All Types": "Alle Typen",
"Inbound": "Eingehend",
"Outbound": "Ausgehend"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "Plataforma de llamadas y SMS impulsada por AI. Automatiza campañas salientes, administra clientes potenciales y consigue análisis de llamadas en tiempo real.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Crea una clave API en tu cuenta Famulor y pega el valor aquí. Obtén la clave API aquí -> https://app.famulor.de.",
"Add Lead to Campaign": "Añadir jefe a la campaña",
"Send SMS": "Enviar SMS",
"Start/Stop Campaign": "Inicio/Detener Campaña",
"Make Phone Call": "Hacer llamada telefónica",
"Delete Lead": "Eliminar plomo",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Añada un plomo a una campaña de salida para ser convocada por un asistente de IA.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Envía un mensaje SMS usando los números de teléfono adquiridos. Los costos se deducirán automáticamente de tu cuenta.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Iniciar o detener una campaña de llamadas salientes. Iniciar requiere suficientes clientes potenciales; detener cancelaciones de llamadas en curso.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Inicie una llamada telefónica de AI-powered a un cliente usando un asistente seleccionado.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Elimina permanentemente un plomo del sistema. Esta acción no se puede deshacer y abortará cualquier llamada en curso.",
"Campaign": "Campaña",
"Customer Phone Number": "Número de teléfono del cliente",
"Variables": "Variables",
"Allow Duplicates": "Permitir duplicados",
"Number of Secondary Contacts": "Número de contactos secundarios",
"Secondary Contacts": "Contactos secundarios",
"From Phone Number": "Desde el número de teléfono",
"Recipient Phone Number": "Número de teléfono del destinatario",
"Message": "Mensaje",
"Action": "Accin",
"Assistant": "Asistente",
"Lead": "Plomo",
"Select the campaign": "Seleccione la campaña",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Introduzca el número de teléfono del cliente (formato E.164: +1234567890)",
"Variables to pass to the assistant": "Variables para pasar al asistente",
"Allow the same phone number to be added to the campaign more than once": "Permitir que se añada el mismo número de teléfono a la campaña más de una vez",
"How many secondary contacts do you want to add? (Max: 10)": "¿Cuántos contactos secundarios quieres añadir? (Máximo: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Añadir contactos secundarios para este cliente potencial. Cada contacto puede tener su propio número de teléfono y variables.",
"Select an SMS-capable phone number to send from": "Seleccione un número de teléfono capaz de enviar desde SMS",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Introduzca el número de teléfono del destinatario (formato E.164: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "Contenido de mensajes SMS (máximo 300 caracteres). Los mensajes largos pueden dividirse en múltiples segmentos.",
"Select the action to perform on the campaign": "Seleccione la acción a realizar en la campaña",
"Select the AI assistant to use for the call": "Seleccione el asistente de IA a usar para la llamada",
"Enter the phone number to call (E.164 format: +1234567890)": "Introduzca el número de teléfono a llamar (E.164 formato: +1234567890)",
"Variables to pass to the assistant during the call": "Variables para pasar al asistente durante la llamada",
"Select the lead to delete": "Seleccione el cliente potencial a eliminar",
"Start Campaign": "Iniciar campaña",
"Stop Campaign": "Detener campaña",
"Phone Call Completed": "Llamada telefónica completada",
"New or Updated Assistant": "Asistente nuevo o actualizado",
"Inbound Call Received": "Llamada entrante recibida",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Se activa cuando se completa una llamada telefónica, proporcionando una transcripción completa de la llamada, variables extraídas y metadatos de llamada.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Activadores cuando los asistentes de IA son creados o actualizados en su cuenta de Familiar.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Dispara cuando tu asistente de IA recibe una llamada entrante. Webhook debe estar habilitado para el asistente seleccionado.",
"Assistant Type": "Tipo de Asistente",
"Items Per Page": "Elementos por página",
"Inbound Assistant": "Asistente entrante",
"Select an assistant to receive post-call webhook notifications for": "Seleccione un asistente para recibir notificaciones de webhook postllamada para",
"Filter assistants by type": "Filtrar asistentes por tipo",
"Number of assistants to fetch per page (1-100, default: 10)": "Número de asistentes a buscar por página (1-100, predeterminado: 10)",
"Select an inbound assistant to receive webhook notifications for": "Seleccione un asistente entrante para recibir notificaciones de webhook para",
"All Types": "Todos los tipos",
"Inbound": "Entrante",
"Outbound": "Salida"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "Plateforme dappels et SMS alimentée par lIA. Automatisez les campagnes sortantes, gérez les prospects et obtenez des analyses dappels en temps réel.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Créez une clé API dans votre compte Famulor et collez la valeur ici. Obtenez la clé API ici -> https://app.famulor.de.",
"Add Lead to Campaign": "Ajouter un prospect à la campagne",
"Send SMS": "Envoyer un SMS",
"Start/Stop Campaign": "Démarrer/Arrêter la campagne",
"Make Phone Call": "Passer un appel téléphonique",
"Delete Lead": "Supprimer Prospect",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Ajouter un prospect à une campagne sortante qui sera appelée par un assistant IA.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Envoyez un SMS en utilisant les numéros de téléphone que vous avez achetés. Les frais sont automatiquement déduits de votre compte.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Démarrez ou arrêtez une campagne d'appels sortants. Le démarrage nécessite suffisamment de prospects ; l'arrêt annule les appels en cours.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Lancer un appel téléphonique alimenté par l'IA à un client à l'aide d'un assistant sélectionné.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Supprimer définitivement un prospect du système. Cette action ne peut pas être annulée et annulera tous les appels en cours.",
"Campaign": "Campagnes",
"Customer Phone Number": "Numéro de téléphone du client",
"Variables": "Variables",
"Allow Duplicates": "Autoriser les doublons",
"Number of Secondary Contacts": "Nombre de contacts secondaires",
"Secondary Contacts": "Contacts secondaires",
"From Phone Number": "À partir du numéro de téléphone",
"Recipient Phone Number": "Numéro de téléphone du destinataire",
"Message": "Message",
"Action": "Action",
"Assistant": "Assistant",
"Lead": "Prospect",
"Select the campaign": "Sélectionnez la campagne",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Entrez le numéro de téléphone du client (format E.164: +1234567890)",
"Variables to pass to the assistant": "Variables à passer à l'assistant",
"Allow the same phone number to be added to the campaign more than once": "Autoriser l'ajout du même numéro de téléphone à la campagne plus d'une fois",
"How many secondary contacts do you want to add? (Max: 10)": "Combien de contacts secondaires voulez-vous ajouter ? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Ajouter des contacts secondaires pour ce prospect. Chaque contact peut avoir son propre numéro de téléphone et ses propres variables.",
"Select an SMS-capable phone number to send from": "Sélectionnez un numéro de téléphone compatible avec les SMS à envoyer depuis",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Entrez le numéro de téléphone du destinataire (format E.164) : +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "Contenu du message SMS (max 300 caractères). Les messages longs peuvent être divisés en plusieurs segments.",
"Select the action to perform on the campaign": "Sélectionnez l'action à effectuer sur la campagne",
"Select the AI assistant to use for the call": "Sélectionnez l'assistant IA à utiliser pour l'appel",
"Enter the phone number to call (E.164 format: +1234567890)": "Entrez le numéro de téléphone à appeler (format E.164: +1234567890)",
"Variables to pass to the assistant during the call": "Variables à passer à l'assistant pendant l'appel",
"Select the lead to delete": "Sélectionnez le prospect à supprimer",
"Start Campaign": "Lancer la campagne",
"Stop Campaign": "Arrêter la campagne",
"Phone Call Completed": "Appel terminé",
"New or Updated Assistant": "Nouvel Assistant ou mis à jour",
"Inbound Call Received": "Appel entrant reçu",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Déclenche quand un appel téléphonique est terminé, fournissant une transcription d'appel complet, des variables extraites et des métadonnées d'appel.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Déclenche quand les assistants AI sont créés ou mis à jour dans votre compte Famulor.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Déclenche lorsqu'un appel entrant est reçu par votre assistant IA. Webhook doit être activé pour l'assistant sélectionné.",
"Assistant Type": "Type d'assistant",
"Items Per Page": "Éléments par page",
"Inbound Assistant": "Assistant entrant",
"Select an assistant to receive post-call webhook notifications for": "Sélectionnez un assistant pour recevoir les notifications post-appel webhook pour",
"Filter assistants by type": "Filtrer les assistants par type",
"Number of assistants to fetch per page (1-100, default: 10)": "Nombre d'assistants à récupérer par page (1-100, par défaut: 10)",
"Select an inbound assistant to receive webhook notifications for": "Sélectionnez un assistant entrant pour recevoir les notifications du webhook pour",
"All Types": "Tous les types",
"Inbound": "Entrants",
"Outbound": "Sortant"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "AIによる通話とSMSプラットフォーム。アウトバウンドキャンペーンの自動化、リード管理、リアルタイム通話分析の取得。",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "FamulorアカウントにAPIキーを作成し、ここに値を貼り付けてください。ここでAPIキーを取得してください -> https://app.famulor.de.",
"Add Lead to Campaign": "キャンペーンにリードを追加",
"Send SMS": "SMSの送信",
"Start/Stop Campaign": "キャンペーンの開始/停止",
"Make Phone Call": "電話をかける",
"Delete Lead": "リードを削除",
"Add a lead to an outbound campaign to be called by an AI assistant.": "AIアシスタントによって呼び出されるアウトバウンドキャンペーンにリードを追加します。",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "購入した電話番号を使用して SMS メッセージを送信します。費用は、アカウントから自動的に差し引かれます。",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "発信キャンペーンを開始または停止します。開始するには十分なリードが必要です。進行中の通話をキャンセルします。",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "選択したアシスタントを使用して顧客にAI搭載の電話を開始します。",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ システムからリードを完全に削除します。この操作は取り消すことができず、進行中の通話を中止します。",
"Campaign": "キャンペーン",
"Customer Phone Number": "顧客電話番号",
"Variables": "変数",
"Allow Duplicates": "重複を許可",
"Number of Secondary Contacts": "セカンダリ連絡先の数",
"Secondary Contacts": "セカンダリ連絡先",
"From Phone Number": "電話番号",
"Recipient Phone Number": "受信者電話番号",
"Message": "メッセージ",
"Action": "アクション",
"Assistant": "アシスタント",
"Lead": "リード",
"Select the campaign": "キャンペーンを選択",
"Enter the phone number of the customer (E.164 format: +1234567890)": "顧客の電話番号を入力します (E.164形式: +1234567890)",
"Variables to pass to the assistant": "アシスタントに渡す変数",
"Allow the same phone number to be added to the campaign more than once": "同じ電話番号をキャンペーンに複数回追加することを許可する",
"How many secondary contacts do you want to add? (Max: 10)": "追加するセカンダリコンタクトの数は? (最大: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "このリードの二次連絡先を追加します。各連絡先には独自の電話番号と変数を設定できます。",
"Select an SMS-capable phone number to send from": "送信するSMS対応の電話番号を選択してください",
"Enter the recipient's phone number (E.164 format: +1234567890)": "受信者の電話番号を入力してくださいE.164形式:+1234567890",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "SMSメッセージの内容最大300文字。長いメッセージを複数のセグメントに分割することができます。",
"Select the action to perform on the campaign": "キャンペーンで実行するアクションを選択してください",
"Select the AI assistant to use for the call": "通話に使用するAIアシスタントを選択してください",
"Enter the phone number to call (E.164 format: +1234567890)": "電話番号を入力してください (E.164形式: +1234567890)",
"Variables to pass to the assistant during the call": "通話中にアシスタントに渡す変数",
"Select the lead to delete": "削除するリードを選択してください",
"Start Campaign": "キャンペーンを開始",
"Stop Campaign": "キャンペーンの停止",
"Phone Call Completed": "通話終了",
"New or Updated Assistant": "新規または更新されたアシスタント",
"Inbound Call Received": "着信を受け取りました",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "通話が完了したときにトリガーされ、完全な通話トランスクリプト、抽出された変数、およびメタデータを提供します。",
"Triggers when AI assistants are created or updated in your Famulor account.": "AIアシスタントがFamulorアカウントで作成または更新されたときにトリガーされます。",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "着信がAIアシスタントによって受信されたときにトリガーします。選択したアシスタントでWebhookが有効になっている必要があります。",
"Assistant Type": "アシスタントタイプ",
"Items Per Page": "1ページあたりのアイテム",
"Inbound Assistant": "インバウンドアシスタント",
"Select an assistant to receive post-call webhook notifications for": "通話後の webhook 通知を受信するアシスタントを選択します。",
"Filter assistants by type": "タイプ別フィルターアシスタント",
"Number of assistants to fetch per page (1-100, default: 10)": "ページごとに取得するアシスタントの数1-100、デフォルト10",
"Select an inbound assistant to receive webhook notifications for": "Webhook通知を受信するには、インバウンドアシスタントを選択してください",
"All Types": "すべてのタイプ",
"Inbound": "Inbound",
"Outbound": "Outbound"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "AI-aangedreven oproepen en SMS-platform. Automatiseer uitgaande campagnes, beheer leads, en krijg real-time call analytics.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Maak een API-sleutel aan in je Famulor account en plak de waarde hier. Ontvang hier de API-sleutel -> https://app.famulor.de.",
"Add Lead to Campaign": "Voeg Lead toe aan Campagne",
"Send SMS": "Sms verzenden",
"Start/Stop Campaign": "Start/Stop campagne",
"Make Phone Call": "Telefoon bellen",
"Delete Lead": "Verwijder Lead",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Voeg een leidraad toe aan een uitgaande campagne op te roepen door een AI-assistent.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Stuur een SMS-bericht met de gekochte telefoonnummers. De kosten worden automatisch van je account afgetrokken.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Start of stop een uitgaande belcampagne. Opstarten vereist voldoende lood en stopt lopende oproepen te annuleren.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Start een AI-powered telefoongesprek naar een klant met behulp van een geselecteerde assistent.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Permanent verwijderen van een lead uit het systeem. Deze actie kan niet ongedaan worden gemaakt en zal alle lopende oproepen afbreken.",
"Campaign": "Campagne",
"Customer Phone Number": "Telefoonnummer klant",
"Variables": "Variabelen",
"Allow Duplicates": "Sta duplicaten toe",
"Number of Secondary Contacts": "Aantal secundaire contacten",
"Secondary Contacts": "Secundaire contactpersonen",
"From Phone Number": "Van Telefoonnummer",
"Recipient Phone Number": "Telefoonnummer ontvanger",
"Message": "bericht",
"Action": "actie",
"Assistant": "Assistent",
"Lead": "Lood",
"Select the campaign": "Selecteer de campagne",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Voer het telefoonnummer van de klant (E.164 formaat: +1234567890) in",
"Variables to pass to the assistant": "Variabelen om door te geven aan de assistent",
"Allow the same phone number to be added to the campaign more than once": "Toestaan dat hetzelfde telefoonnummer meer dan één keer aan de campagne wordt toegevoegd",
"How many secondary contacts do you want to add? (Max: 10)": "Hoeveel secundaire contacten wilt u toevoegen? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Voeg secundaire contacten toe voor deze lead. Elk contact kan een eigen telefoonnummer en variabelen hebben.",
"Select an SMS-capable phone number to send from": "Selecteer een telefoonnummer dat in staat is om uit te zenden",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Voer het telefoonnummer van de ontvanger in (E.164 formaat: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "SMS berichtinhoud (max 300 tekens). Lange berichten kunnen in meerdere segmenten worden gesplitst.",
"Select the action to perform on the campaign": "Selecteer de actie om uit te voeren op de campagne",
"Select the AI assistant to use for the call": "Selecteer de AI-assistent om te gebruiken voor het gesprek",
"Enter the phone number to call (E.164 format: +1234567890)": "Voer het telefoonnummer in om te bellen (E.164 formaat: +1234567890)",
"Variables to pass to the assistant during the call": "Variabelen om door te geven aan de assistent tijdens de oproep",
"Select the lead to delete": "Selecteer de te verwijderen lead",
"Start Campaign": "Start Campagne",
"Stop Campaign": "Stoppen campagne",
"Phone Call Completed": "Telefoongesprek voltooid",
"New or Updated Assistant": "Nieuwe of bijgewerkte assistent",
"Inbound Call Received": "Binnenkomende oproep ontvangen",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Triggers wanneer een telefoongesprek is voltooid, geeft volledige transcriptie van gesprekken, uitgepakte variabelen en oproep metadata.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Triggers wanneer AI assistenten worden aangemaakt of bijgewerkt in je Famulor account.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Triggers wanneer een inkomende oproep wordt ontvangen door uw AI-assistent. Webhook moet worden ingeschakeld voor de geselecteerde assistent.",
"Assistant Type": "Type assistent",
"Items Per Page": "Items Per pagina",
"Inbound Assistant": "Inkomende assistent",
"Select an assistant to receive post-call webhook notifications for": "Selecteer een assistent om na oproep webhook meldingen te ontvangen voor",
"Filter assistants by type": "Filter assistenten op type",
"Number of assistants to fetch per page (1-100, default: 10)": "Aantal medewerkers om per pagina op te halen (1-100, standaard: 10)",
"Select an inbound assistant to receive webhook notifications for": "Selecteer een inkomende assistent om webhook meldingen te ontvangen voor",
"All Types": "Alle typen",
"Inbound": "Inkomende",
"Outbound": "Uitgaande"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "Ativar chamadas e enviar SMS. Automatize campanhas de saída, gerencie líderes e obtenha análise de chamadas em tempo real.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Crie uma chave de API na sua conta Famulor e cole o valor aqui. Obtenha a chave de API aqui -> https://app.famulor.de.",
"Add Lead to Campaign": "Adicionar Lead para Campanha",
"Send SMS": "Enviar SMS",
"Start/Stop Campaign": "Iniciar/Parar Campanha",
"Make Phone Call": "Fazer chamada telefônica",
"Delete Lead": "Excluir Lead",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Adicione um lead a uma campanha de saída para ser chamada por um assistente de IA.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Enviar uma mensagem SMS usando os números de telefone comprados. Os custos são automaticamente deduzidos da sua conta.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Iniciar ou interromper uma campanha de chamada de saída. Iniciar requer oportunidades suficientes; interromper cancela chamadas em andamento.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Inicie uma chamada para um cliente usando um assistente selecionado.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Exclua permanentemente um lead do sistema. Esta ação não pode ser desfeita e abortará todas as chamadas em andamento.",
"Campaign": "Campanha",
"Customer Phone Number": "Número de telefone do cliente",
"Variables": "Variáveis",
"Allow Duplicates": "Permitir duplicatas",
"Number of Secondary Contacts": "Número de contatos secundários",
"Secondary Contacts": "Contatos Secundários",
"From Phone Number": "De número de telefone",
"Recipient Phone Number": "Número de telefone destinatário",
"Message": "mensagem",
"Action": "Acão",
"Assistant": "Assistente",
"Lead": "Conduzir",
"Select the campaign": "Selecione a campanha",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Digite o número de telefone do cliente (formato 164: +1234567890)",
"Variables to pass to the assistant": "Variáveis para passar ao assistente",
"Allow the same phone number to be added to the campaign more than once": "Permitir que o mesmo número de telefone seja adicionado à campanha mais de uma vez",
"How many secondary contacts do you want to add? (Max: 10)": "Quantos contatos secundários você deseja adicionar? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Adicione contatos secundários para esse lead. Cada contato pode ter seu próprio número de telefone e variáveis.",
"Select an SMS-capable phone number to send from": "Selecione um número de telefone compatível com SMS para enviar",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Digite o número de telefone do destinatário (formato 164: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "O conteúdo da mensagem SMS (máx. 300 caracteres). Mensagens longas podem ser divididas em vários segmentos.",
"Select the action to perform on the campaign": "Selecione a ação a ser executada na campanha",
"Select the AI assistant to use for the call": "Selecione o assistente de IA para usar a chamada",
"Enter the phone number to call (E.164 format: +1234567890)": "Digite o número de telefone para ligar (formato 164: +1234567890)",
"Variables to pass to the assistant during the call": "Variáveis para passar para o assistente durante a chamada",
"Select the lead to delete": "Selecione o Lead para Apagar",
"Start Campaign": "Iniciar Campanha",
"Stop Campaign": "Parar De Campanha",
"Phone Call Completed": "Chamada Telefônica Concluída",
"New or Updated Assistant": "Assistente novo ou atualizado",
"Inbound Call Received": "Chamada de entrada recebida",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Aciona quando uma chamada é concluída, fornecendo transcrição de chamada completa, variáveis extraídas e metadados de chamada.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Aciona quando assistentes de IA são criados ou atualizados na sua conta de Famulor.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Aciona quando uma chamada recebida pelo seu assistente de Inteligência Artificial. Webhook deve ser ativado para o assistente selecionado.",
"Assistant Type": "Tipo de Assistente",
"Items Per Page": "Itens por página",
"Inbound Assistant": "Assistente de Entrada",
"Select an assistant to receive post-call webhook notifications for": "Selecione um assistente para receber notificações pós-chamada para",
"Filter assistants by type": "Filtrar assistentes por tipo",
"Number of assistants to fetch per page (1-100, default: 10)": "Número de assistentes a buscar por página (1-100, padrão: 10)",
"Select an inbound assistant to receive webhook notifications for": "Selecionar um assistente de entrada para receber notificações de webhook",
"All Types": "Todos os tipos",
"Inbound": "Entrada",
"Outbound": "Saída"
}

View File

@@ -0,0 +1,49 @@
{
"Famulor": "Famulor",
"Automate phone calls using our AI calling platform.": "Автоматизировать телефонные звонки, используя нашу платформу для вызова AI.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.ai.": "Создайте API ключ в вашей учетной записи Famulor и вставьте сюда значение. Получить API ключ здесь -> https://app.famulor.de.",
"Add lead to a campaign": "Добавить провод к кампании",
"Send SMS to Customer": "Отправить SMS клиенту",
"Start/Stop Campaign": "Начать/остановить Кампанию",
"Make Phone Call": "Позвонить по телефону",
"Delete Lead": "Удалить предв. контакт",
"Add lead to an outbound campaign, to be called by an assistant from our platform.": "Добавьте к исходящей кампании, которую будет вызвать помощник с нашей платформы.",
"Send an SMS to a customer using a phone number from our platform.": "Отправьте клиенту SMS по телефону с нашей платформы.",
"Start or stop an outbound campaign from our platform.": "Начать или остановить исходящую кампанию с нашей платформы.",
"Call a customer by it's phone number using an assistant from our platform.": "Позвоните клиенту по номеру телефона, используя ассистент с нашей платформы.",
"Delete a lead from a campaign.": "Удалить свинца из кампании.",
"Campaign": "Кампания",
"Customer phone number": "Телефон клиента",
"Variables": "Переменные",
"Allow duplicates": "Разрешить дубликаты",
"Number of Secondary Contacts": "Количество дополнительных контактов",
"Secondary Contacts": "Вторичные контакты",
"From phone number": "От номера телефона",
"Text message": "Текстовое сообщение",
"Action": "Действие",
"Assistant": "Помощник",
"Lead": "Предв. контакт",
"Select a campaign": "Выберите кампанию",
"Enter the phone number of the customer": "Введите номер телефона клиента",
"Variables to pass to the assistant": "Переменные для передачи помощнику",
"Allow the same phone number to be added to the campaign more than once": "Разрешить добавление одного и того же номера телефона в кампанию более одного раза",
"How many secondary contacts do you want to add?": "Сколько дополнительных контактов вы хотите добавить?",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Добавьте дополнительные контакты для этого провода. Каждый контакт может иметь свой собственный номер телефона и переменные.",
"Select an SMS capable phone number to send the SMS from": "Выберите номер телефона с поддержкой SMS для отправки SMS от",
"Enter the text message to send to the customer (max 300 characters)": "Введите текстовое сообщение для отправки клиенту (не более 300 символов)",
"Select action to perform on the campaign": "Выберите действие для выполнения кампании",
"Select an assistant": "Выберите помощника",
"Select a lead to delete": "Выберите провод для удаления",
"Start Campaign": "Начать кампанию",
"Stop Campaign": "Остановить Кампанию",
"Phone Call Ended": "Телефонный вызов завершен",
"Updated Assistant": "Обновленный помощник",
"Inbound Call": "Входящий вызов",
"Triggers when a phone call ends, with extracted variables.": "Включает при завершении телефонного вызова с извлеченными переменными.",
"Triggers when assistants are fetched or updated in your Famulor account.": "Срабатывает при получении или обновлении ассистентов в вашем аккаунте Famulor.",
"Triggers for variables before connecting an inbound call.": "Триггеры для переменных перед подключением входящего вызова.",
"Start Date": "Дата начала",
"End Date": "Дата окончания",
"Filter assistants created after this date. Example: 2024-01-15T10:30:00Z": "Фильтр помощников, созданных после этой даты. Пример: 2024-01-15T10:30:00Z",
"Filter assistants created before this date. Example: 2024-12-31T23:59:59Z": "Фильтр помощников, созданных до этой даты. Пример: 2024-12-31T23:59:59Z"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.",
"Add Lead to Campaign": "Add Lead to Campaign",
"Send SMS": "Send SMS",
"Start/Stop Campaign": "Start/Stop Campaign",
"Make Phone Call": "Make Phone Call",
"Delete Lead": "Delete Lead",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Add a lead to an outbound campaign to be called by an AI assistant.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Initiate an AI-powered phone call to a customer using a selected assistant.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.",
"Campaign": "Campaign",
"Customer Phone Number": "Customer Phone Number",
"Variables": "Variables",
"Allow Duplicates": "Allow Duplicates",
"Number of Secondary Contacts": "Number of Secondary Contacts",
"Secondary Contacts": "Secondary Contacts",
"From Phone Number": "From Phone Number",
"Recipient Phone Number": "Recipient Phone Number",
"Message": "Message",
"Action": "Action",
"Assistant": "Assistant",
"Lead": "Lead",
"Select the campaign": "Select the campaign",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Enter the phone number of the customer (E.164 format: +1234567890)",
"Variables to pass to the assistant": "Variables to pass to the assistant",
"Allow the same phone number to be added to the campaign more than once": "Allow the same phone number to be added to the campaign more than once",
"How many secondary contacts do you want to add? (Max: 10)": "How many secondary contacts do you want to add? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Add secondary contacts for this lead. Each contact can have its own phone number and variables.",
"Select an SMS-capable phone number to send from": "Select an SMS-capable phone number to send from",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Enter the recipient's phone number (E.164 format: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "SMS message content (max 300 characters). Long messages may be split into multiple segments.",
"Select the action to perform on the campaign": "Select the action to perform on the campaign",
"Select the AI assistant to use for the call": "Select the AI assistant to use for the call",
"Enter the phone number to call (E.164 format: +1234567890)": "Enter the phone number to call (E.164 format: +1234567890)",
"Variables to pass to the assistant during the call": "Variables to pass to the assistant during the call",
"Select the lead to delete": "Select the lead to delete",
"Start Campaign": "Start Campaign",
"Stop Campaign": "Stop Campaign",
"Phone Call Completed": "Phone Call Completed",
"New or Updated Assistant": "New or Updated Assistant",
"Inbound Call Received": "Inbound Call Received",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Triggers when AI assistants are created or updated in your Famulor account.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.",
"Assistant Type": "Assistant Type",
"Items Per Page": "Items Per Page",
"Inbound Assistant": "Inbound Assistant",
"Select an assistant to receive post-call webhook notifications for": "Select an assistant to receive post-call webhook notifications for",
"Filter assistants by type": "Filter assistants by type",
"Number of assistants to fetch per page (1-100, default: 10)": "Number of assistants to fetch per page (1-100, default: 10)",
"Select an inbound assistant to receive webhook notifications for": "Select an inbound assistant to receive webhook notifications for",
"All Types": "All Types",
"Inbound": "Inbound",
"Outbound": "Outbound"
}

View File

@@ -0,0 +1,49 @@
{
"Famulor": "Famulor",
"Automate phone calls using our AI calling platform.": "Automate phone calls using our AI calling platform.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.ai.": "Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.",
"Add lead to a campaign": "Add lead to a campaign",
"Send SMS to Customer": "Send SMS to Customer",
"Start/Stop Campaign": "Start/Stop Campaign",
"Make Phone Call": "Make Phone Call",
"Delete Lead": "Delete Lead",
"Add lead to an outbound campaign, to be called by an assistant from our platform.": "Add lead to an outbound campaign, to be called by an assistant from our platform.",
"Send an SMS to a customer using a phone number from our platform.": "Send an SMS to a customer using a phone number from our platform.",
"Start or stop an outbound campaign from our platform.": "Start or stop an outbound campaign from our platform.",
"Call a customer by it's phone number using an assistant from our platform.": "Call a customer by it's phone number using an assistant from our platform.",
"Delete a lead from a campaign.": "Delete a lead from a campaign.",
"Campaign": "Campaign",
"Customer phone number": "Customer phone number",
"Variables": "Variables",
"Allow duplicates": "Allow duplicates",
"Number of Secondary Contacts": "Number of Secondary Contacts",
"Secondary Contacts": "Secondary Contacts",
"From phone number": "From phone number",
"Text message": "Text message",
"Action": "Action",
"Assistant": "Assistant",
"Lead": "Lead",
"Select a campaign": "Select a campaign",
"Enter the phone number of the customer": "Enter the phone number of the customer",
"Variables to pass to the assistant": "Variables to pass to the assistant",
"Allow the same phone number to be added to the campaign more than once": "Allow the same phone number to be added to the campaign more than once",
"How many secondary contacts do you want to add?": "How many secondary contacts do you want to add?",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Add secondary contacts for this lead. Each contact can have its own phone number and variables.",
"Select an SMS capable phone number to send the SMS from": "Select an SMS capable phone number to send the SMS from",
"Enter the text message to send to the customer (max 300 characters)": "Enter the text message to send to the customer (max 300 characters)",
"Select action to perform on the campaign": "Select action to perform on the campaign",
"Select an assistant": "Select an assistant",
"Select a lead to delete": "Select a lead to delete",
"Start Campaign": "Start Campaign",
"Stop Campaign": "Stop Campaign",
"Phone Call Ended": "Phone Call Ended",
"Updated Assistant": "Updated Assistant",
"Inbound Call": "Inbound Call",
"Triggers when a phone call ends, with extracted variables.": "Triggers when a phone call ends, with extracted variables.",
"Triggers when assistants are fetched or updated in your Famulor account.": "Triggers when assistants are fetched or updated in your Famulor account.",
"Triggers for variables before connecting an inbound call.": "Triggers for variables before connecting an inbound call.",
"Start Date": "Start Date",
"End Date": "End Date",
"Filter assistants created after this date. Example: 2024-01-15T10:30:00Z": "Filter assistants created after this date. Example: 2024-01-15T10:30:00Z",
"Filter assistants created before this date. Example: 2024-12-31T23:59:59Z": "Filter assistants created before this date. Example: 2024-12-31T23:59:59Z"
}

View File

@@ -0,0 +1,58 @@
{
"AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.": "AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.",
"Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.": "Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.",
"Add Lead to Campaign": "Add Lead to Campaign",
"Send SMS": "Send SMS",
"Start/Stop Campaign": "Start/Stop Campaign",
"Make Phone Call": "Make Phone Call",
"Delete Lead": "Delete Lead",
"Add a lead to an outbound campaign to be called by an AI assistant.": "Add a lead to an outbound campaign to be called by an AI assistant.",
"Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.": "Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.",
"Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.": "Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.",
"Initiate an AI-powered phone call to a customer using a selected assistant.": "Initiate an AI-powered phone call to a customer using a selected assistant.",
"⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.": "⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.",
"Campaign": "Campaign",
"Customer Phone Number": "Customer Phone Number",
"Variables": "Variables",
"Allow Duplicates": "Allow Duplicates",
"Number of Secondary Contacts": "Number of Secondary Contacts",
"Secondary Contacts": "Secondary Contacts",
"From Phone Number": "From Phone Number",
"Recipient Phone Number": "Recipient Phone Number",
"Message": "Message",
"Action": "行 动",
"Assistant": "Assistant",
"Lead": "Lead",
"Select the campaign": "Select the campaign",
"Enter the phone number of the customer (E.164 format: +1234567890)": "Enter the phone number of the customer (E.164 format: +1234567890)",
"Variables to pass to the assistant": "Variables to pass to the assistant",
"Allow the same phone number to be added to the campaign more than once": "Allow the same phone number to be added to the campaign more than once",
"How many secondary contacts do you want to add? (Max: 10)": "How many secondary contacts do you want to add? (Max: 10)",
"Add secondary contacts for this lead. Each contact can have its own phone number and variables.": "Add secondary contacts for this lead. Each contact can have its own phone number and variables.",
"Select an SMS-capable phone number to send from": "Select an SMS-capable phone number to send from",
"Enter the recipient's phone number (E.164 format: +1234567890)": "Enter the recipient's phone number (E.164 format: +1234567890)",
"SMS message content (max 300 characters). Long messages may be split into multiple segments.": "SMS message content (max 300 characters). Long messages may be split into multiple segments.",
"Select the action to perform on the campaign": "Select the action to perform on the campaign",
"Select the AI assistant to use for the call": "Select the AI assistant to use for the call",
"Enter the phone number to call (E.164 format: +1234567890)": "Enter the phone number to call (E.164 format: +1234567890)",
"Variables to pass to the assistant during the call": "Variables to pass to the assistant during the call",
"Select the lead to delete": "Select the lead to delete",
"Start Campaign": "Start Campaign",
"Stop Campaign": "Stop Campaign",
"Phone Call Completed": "Phone Call Completed",
"New or Updated Assistant": "New or Updated Assistant",
"Inbound Call Received": "Inbound Call Received",
"Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.": "Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.",
"Triggers when AI assistants are created or updated in your Famulor account.": "Triggers when AI assistants are created or updated in your Famulor account.",
"Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.": "Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.",
"Assistant Type": "Assistant Type",
"Items Per Page": "Items Per Page",
"Inbound Assistant": "Inbound Assistant",
"Select an assistant to receive post-call webhook notifications for": "Select an assistant to receive post-call webhook notifications for",
"Filter assistants by type": "Filter assistants by type",
"Number of assistants to fetch per page (1-100, default: 10)": "Number of assistants to fetch per page (1-100, default: 10)",
"Select an inbound assistant to receive webhook notifications for": "Select an inbound assistant to receive webhook notifications for",
"All Types": "All Types",
"Inbound": "Inbound",
"Outbound": "Outbound"
}

View File

@@ -0,0 +1,61 @@
import { createPiece, PieceAuth } from "@activepieces/pieces-framework";
import { PieceCategory } from '@activepieces/shared';
import { makePhoneCall } from "./lib/actions/make-phone-call";
import { phoneCallEnded } from "./lib/triggers/phone-call-ended";
import { addLead } from "./lib/actions/add-lead";
import { sendSms } from "./lib/actions/send-sms";
import { inboundCall } from "./lib/triggers/inbound-call";
import { getAssistants } from "./lib/triggers/get-assistants";
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { baseApiUrl } from './lib/common';
import { campaignControl } from "./lib/actions/campaign-control";
import { deleteLead } from "./lib/actions/delete-lead";
export const famulorAuth = PieceAuth.SecretText({
displayName: 'API Key',
description: 'Create an API key in your Famulor account and paste the value here. Get API key here -> https://app.famulor.de.',
required: true,
validate: async ({ auth }) => {
try {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: baseApiUrl + 'api/user/me',
headers: {
'Authorization': `Bearer ${auth}`,
'Content-Type': 'application/json',
'Accept': 'application/json'
},
});
if (response.status === 200) {
return {
valid: true,
};
} else {
return {
valid: false,
error: 'Invalid API key or authentication failed'
};
}
} catch (error) {
return {
valid: false,
error: 'Failed to validate API key. Please check your API key and try again.'
};
}
}
})
export const famulor = createPiece({
displayName: "Famulor AI - Voice Agent",
auth:famulorAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/famulor.png",
description: "AI-powered calling and SMS platform. Automate outbound campaigns, manage leads, and get real-time call analytics.",
authors: ['bekservice', 'onyedikachi-david'],
categories: [PieceCategory.SALES_AND_CRM],
actions: [addLead,sendSms,campaignControl,makePhoneCall,deleteLead],
triggers: [phoneCallEnded,getAssistants,inboundCall],
});

View File

@@ -0,0 +1,49 @@
import { createAction } from '@activepieces/pieces-framework';
import { propsValidation } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
export const addLead = createAction({
auth: famulorAuth,
name: 'addLead',
displayName: 'Add Lead to Campaign',
description: 'Add a lead to an outbound campaign to be called by an AI assistant.',
props: famulorCommon.addLeadProperties(),
async run({ auth, propsValue }) {
await propsValidation.validateZod(propsValue, famulorCommon.addLeadSchema);
// Process secondary contacts if provided
let secondaryContacts: Array<{ phone_number: string; variables?: Record<string, any> }> | undefined;
if (propsValue.secondary_contacts && propsValue.num_secondary_contacts) {
const secondaryContactsData = propsValue.secondary_contacts as Record<string, any>;
const numContacts = Math.min(Number(propsValue.num_secondary_contacts) || 0, 10);
const contacts: Array<{ phone_number: string; variables?: Record<string, any> }> = [];
for (let i = 1; i <= numContacts; i++) {
const phoneNumber = secondaryContactsData[`contact_${i}_phone`];
const variables = secondaryContactsData[`contact_${i}_variables`];
if (phoneNumber && phoneNumber.trim() !== '') {
contacts.push({
phone_number: phoneNumber,
variables: variables || { customer_name: '' }
});
}
}
if (contacts.length > 0) {
secondaryContacts = contacts;
}
}
return await famulorCommon.addLead({
auth: auth.secret_text,
campaign_id: propsValue.campaign,
phone_number: propsValue.phone_number!,
variable: propsValue.variables,
allow_dupplicate: propsValue.allow_dupplicate,
secondary_contacts: secondaryContacts,
});
},
});

View File

@@ -0,0 +1,21 @@
import { createAction } from '@activepieces/pieces-framework';
import { propsValidation } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
export const campaignControl = createAction({
auth: famulorAuth,
name: 'campaignControl',
displayName: 'Start/Stop Campaign',
description: 'Start or stop an outbound calling campaign. Starting requires sufficient leads; stopping cancels ongoing calls.',
props: famulorCommon.campaignControlProperties(),
async run({ auth, propsValue }) {
await propsValidation.validateZod(propsValue, famulorCommon.campaignControlSchema);
return await famulorCommon.campaignControl({
auth: auth.secret_text,
campaign_id: propsValue.campaign,
action: propsValue.action as 'start' | 'stop',
});
},
});

View File

@@ -0,0 +1,20 @@
import { createAction } from '@activepieces/pieces-framework';
import { propsValidation } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
export const deleteLead = createAction({
auth: famulorAuth,
name: 'deleteLead',
displayName: 'Delete Lead',
description: '⚠️ Permanently delete a lead from the system. This action cannot be undone and will abort any ongoing calls.',
props: famulorCommon.deleteLeadProperties(),
async run({ auth, propsValue }) {
await propsValidation.validateZod(propsValue, famulorCommon.deleteLeadSchema);
return await famulorCommon.deleteLead({
auth: auth.secret_text,
lead_id: propsValue.lead_id,
});
},
});

View File

@@ -0,0 +1,22 @@
import { createAction } from '@activepieces/pieces-framework';
import { propsValidation } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
export const makePhoneCall = createAction({
auth: famulorAuth,
name: 'makePhoneCall',
displayName: 'Make Phone Call',
description: 'Initiate an AI-powered phone call to a customer using a selected assistant.',
props: famulorCommon.makePhoneCallProperties(),
async run({ auth, propsValue }) {
await propsValidation.validateZod(propsValue, famulorCommon.makePhoneCallSchema);
return await famulorCommon.makePhoneCall({
auth: auth.secret_text,
assistant_id: propsValue.assistant_id as number,
phone_number: propsValue.phone_number!,
variable: propsValue.variable,
});
},
});

View File

@@ -0,0 +1,22 @@
import { createAction } from '@activepieces/pieces-framework';
import { propsValidation } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
export const sendSms = createAction({
auth: famulorAuth,
name: 'sendSms',
displayName: 'Send SMS',
description: 'Send an SMS message using your purchased phone numbers. Costs are automatically deducted from your account.',
props: famulorCommon.sendSmsProperties(),
async run({ auth, propsValue }) {
await propsValidation.validateZod(propsValue, famulorCommon.sendSmsSchema);
return await famulorCommon.sendSms({
auth: auth.secret_text,
from: propsValue.from as number,
to: propsValue.to!,
bodysuit: propsValue.bodysuit!,
});
},
});

View File

@@ -0,0 +1,271 @@
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import * as properties from './properties';
import * as schemas from './schemas';
import {
ListCampaignsResponse,
AddLeadParams,
SendSmsParams,
MakePhoneCallParams,
CampaignControlParams,
DeleteLeadParams,
LeadResponse
} from './types';
export const baseApiUrl = 'https://app.famulor.de/';
export const famulorCommon = {
baseHeaders: (auth: string) => ({
'Authorization': `Bearer ${auth}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
}),
// Properties
addLeadProperties: properties.addLead,
sendSmsProperties: properties.sendSms,
makePhoneCallProperties: properties.makePhoneCall,
campaignControlProperties: properties.campaignControl,
deleteLeadProperties: properties.deleteLead,
// Schemas
addLeadSchema: schemas.addLead,
sendSmsSchema: schemas.sendSms,
makePhoneCallSchema: schemas.makePhoneCall,
campaignControlSchema: schemas.campaignControl,
deleteLeadSchema: schemas.deleteLead,
// Methods
listAllAssistants: async ({ auth, per_page = 10, page = 1, type }: { auth: string; per_page?: number; page?: number; type?: string }) => {
const queryParams: Record<string, string> = {
per_page: per_page.toString(),
page: page.toString(),
};
if (type && type !== '') {
queryParams['type'] = type;
}
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${baseApiUrl}api/user/assistants/get`,
headers: famulorCommon.baseHeaders(auth),
queryParams,
});
if (response.status !== 200) {
throw new Error(`Failed to fetch assistants: ${response.status}`);
}
return response.body;
},
listPhoneNumbers: async ({ auth }: { auth: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${baseApiUrl}api/user/assistants/phone-numbers`,
headers: famulorCommon.baseHeaders(auth),
});
if (response.status !== 200) {
throw new Error(`Failed to fetch phone numbers: ${response.status}`);
}
return response.body || [];
},
listAssistants: async ({ auth }: { auth: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${baseApiUrl}api/user/assistants/outbound`,
headers: famulorCommon.baseHeaders(auth),
});
if (response.status !== 200) {
throw new Error(`Failed to fetch assistants: ${response.status}`);
}
return response.body || [];
},
listLeads: async ({ auth }: { auth: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${baseApiUrl}api/user/leads`,
headers: famulorCommon.baseHeaders(auth),
});
if (response.status !== 200) {
throw new Error(`Failed to fetch leads: ${response.status}`);
}
return response.body.leads || response.body;
},
listCampaigns: async ({ auth }: { auth: string }) => {
const response = await httpClient.sendRequest<ListCampaignsResponse>({
method: HttpMethod.GET,
url: `${baseApiUrl}api/user/campaigns`,
headers: famulorCommon.baseHeaders(auth),
});
if (response.status !== 200) {
throw new Error(`Failed to fetch campaigns: ${response.status}`);
}
return response.body.campaigns || response.body;
},
addLead: async (params: AddLeadParams): Promise<LeadResponse> => {
const { auth, ...body } = params;
const response = await httpClient.sendRequest<LeadResponse>({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/lead`,
headers: famulorCommon.baseHeaders(auth),
body,
});
if (response.status !== 200) {
throw new Error(`Failed to add lead: ${response.status}`);
}
return response.body;
},
sendSms: async (params: SendSmsParams) => {
const { auth, ...body } = params;
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/sms`,
headers: famulorCommon.baseHeaders(auth),
body,
});
if (response.status !== 200) {
throw new Error(`Failed to send SMS: ${response.status}`);
}
return response.body;
},
makePhoneCall: async (params: MakePhoneCallParams) => {
const { auth, ...body } = params;
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/make_call`,
headers: famulorCommon.baseHeaders(auth),
body,
});
if (response.status !== 200) {
throw new Error(`Failed to make phone call: ${response.status}`);
}
return response.body;
},
campaignControl: async (params: CampaignControlParams) => {
const { auth, ...body } = params;
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/campaigns/update-status`,
headers: famulorCommon.baseHeaders(auth),
body,
});
if (response.status !== 200) {
throw new Error(`Failed to control campaign: ${response.status}`);
}
return response.body;
},
deleteLead: async (params: DeleteLeadParams) => {
const { auth, lead_id } = params;
const response = await httpClient.sendRequest({
method: HttpMethod.DELETE,
url: `${baseApiUrl}api/user/leads/${lead_id}`,
headers: famulorCommon.baseHeaders(auth),
});
if (response.status !== 200) {
throw new Error(`Failed to delete lead: ${response.status}`);
}
return response.body;
},
enableInboundWebhook: async ({ auth, assistant_id, webhook_url }: { auth: string; assistant_id: number; webhook_url: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/assistants/enable-inbound-webhook`,
headers: famulorCommon.baseHeaders(auth),
body: {
assistant_id,
webhook_url,
},
});
if (response.status !== 200) {
throw new Error(`Failed to enable inbound webhook: ${response.status}`);
}
return response.body;
},
disableInboundWebhook: async ({ auth, assistant_id }: { auth: string; assistant_id: number }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/assistants/disable-inbound-webhook`,
headers: famulorCommon.baseHeaders(auth),
body: {
assistant_id,
},
});
if (response.status !== 200) {
throw new Error(`Failed to disable inbound webhook: ${response.status}`);
}
return response.body;
},
enablePostCallWebhook: async ({ auth, assistant_id, webhook_url }: { auth: string; assistant_id: number; webhook_url: string }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/assistants/enable-webhook`,
headers: famulorCommon.baseHeaders(auth),
body: {
assistant_id,
webhook_url,
},
});
if (response.status !== 200) {
throw new Error(`Failed to enable post-call webhook: ${response.status}`);
}
return response.body;
},
disablePostCallWebhook: async ({ auth, assistant_id }: { auth: string; assistant_id: number }) => {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${baseApiUrl}api/user/assistants/disable-webhook`,
headers: famulorCommon.baseHeaders(auth),
body: {
assistant_id,
},
});
if (response.status !== 200) {
throw new Error(`Failed to disable post-call webhook: ${response.status}`);
}
return response.body;
},
};

View File

@@ -0,0 +1,281 @@
import { Property } from '@activepieces/pieces-framework';
import { famulorCommon } from '.';
import { famulorAuth } from '../..';
// Dynamic Properties
const campaignDropdown = () =>
Property.Dropdown({
auth: famulorAuth,
displayName: 'Campaign',
description: 'Select the campaign',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
const campaigns = await famulorCommon.listCampaigns({ auth: auth.secret_text });
if (!campaigns || campaigns.length === 0) {
return {
disabled: true,
placeholder: 'No campaigns found. Create one first.',
options: [],
};
}
return {
options: campaigns.map((campaign: any) => ({
label: campaign.name,
value: campaign.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch campaigns',
options: [],
};
}
},
});
const phoneNumberProperty = (displayName: string, description: string, required = true) =>
Property.ShortText({
displayName,
description: `${description} (E.164 format: +1234567890)`,
required,
});
const variablesProperty = (displayName: string, description: string, required = false) =>
Property.Object({
displayName,
description,
required,
defaultValue: {
customer_name: 'John Doe',
},
});
// Action Properties
export const addLead = () => ({
campaign: campaignDropdown(),
phone_number: phoneNumberProperty('Customer Phone Number', 'Enter the phone number of the customer'),
variables: variablesProperty('Variables', 'Variables to pass to the assistant'),
allow_dupplicate: Property.Checkbox({
displayName: 'Allow Duplicates',
description: 'Allow the same phone number to be added to the campaign more than once',
required: false,
defaultValue: false,
}),
num_secondary_contacts: Property.Number({
displayName: 'Number of Secondary Contacts',
description: 'How many secondary contacts do you want to add? (Max: 10)',
required: false,
defaultValue: 0,
}),
secondary_contacts: Property.DynamicProperties({
displayName: 'Secondary Contacts',
description: 'Add secondary contacts for this lead. Each contact can have its own phone number and variables.',
required: false,
refreshers: ['num_secondary_contacts'],
auth: famulorAuth,
props: async ({ num_secondary_contacts }) => {
const contacts: any = {};
const numContacts = Math.min(Number(num_secondary_contacts) || 0, 10);
for (let i = 1; i <= numContacts; i++) {
contacts[`contact_${i}_phone`] = phoneNumberProperty(
`Contact ${i} - Phone Number`,
`Phone number for secondary contact ${i}`
);
contacts[`contact_${i}_variables`] = variablesProperty(
`Contact ${i} - Variables`,
`Variables for secondary contact ${i} as key-value pairs`,
false
);
}
return contacts;
},
}),
});
const phoneNumberDropdown = () =>
Property.Dropdown({
auth: famulorAuth,
displayName: 'From Phone Number',
description: 'Select an SMS-capable phone number to send from',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
const phoneNumbers = await famulorCommon.listPhoneNumbers({ auth: auth.secret_text });
if (!phoneNumbers || phoneNumbers.length === 0) {
return {
disabled: true,
placeholder: 'No phone numbers found. Purchase an SMS-capable phone number first.',
options: [],
};
}
return {
options: phoneNumbers.map((phoneNumber: any) => ({
label: `${phoneNumber.phone_number} (${phoneNumber.country_code})`,
value: phoneNumber.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch phone numbers',
options: [],
};
}
},
});
export const sendSms = () => ({
from: phoneNumberDropdown(),
to: phoneNumberProperty('Recipient Phone Number', 'Enter the recipient\'s phone number'),
bodysuit: Property.LongText({
displayName: 'Message',
description: 'SMS message content (max 300 characters). Long messages may be split into multiple segments.',
required: true,
}),
});
const assistantDropdown = () =>
Property.Dropdown({
auth: famulorAuth,
displayName: 'Assistant',
description: 'Select the AI assistant to use for the call',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
const assistants = await famulorCommon.listAssistants({ auth: auth.secret_text });
if (!assistants || assistants.length === 0) {
return {
disabled: true,
placeholder: 'No outbound assistants found. Create one first.',
options: [],
};
}
return {
options: assistants.map((assistant: any) => ({
label: assistant.name,
value: assistant.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch assistants',
options: [],
};
}
},
});
export const makePhoneCall = () => ({
assistant_id: assistantDropdown(),
phone_number: phoneNumberProperty('Customer Phone Number', 'Enter the phone number to call'),
variable: Property.Object({
displayName: 'Variables',
description: 'Variables to pass to the assistant during the call',
required: false,
defaultValue: {
customer_name: 'John Doe',
email: 'john@example.com',
},
}),
});
export const campaignControl = () => ({
campaign: campaignDropdown(),
action: Property.StaticDropdown({
displayName: 'Action',
description: 'Select the action to perform on the campaign',
required: true,
options: {
options: [
{ label: 'Start Campaign', value: 'start' },
{ label: 'Stop Campaign', value: 'stop' },
],
},
}),
});
const leadDropdown = () =>
Property.Dropdown<number,true,typeof famulorAuth>({
auth: famulorAuth,
displayName: 'Lead',
description: 'Select the lead to delete',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
const leads = await famulorCommon.listLeads({ auth: auth.secret_text });
if (!leads || leads.length === 0) {
return {
disabled: true,
placeholder: 'No leads found.',
options: [],
};
}
return {
options: leads.map((lead: any) => ({
label: `${lead.phone_number} - ${lead.campaign?.name || 'Unknown Campaign'}`,
value: lead.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch leads',
options: [],
};
}
},
});
export const deleteLead = () => ({
lead_id: leadDropdown(),
});

View File

@@ -0,0 +1,36 @@
import z from 'zod';
export const addLead = {
campaign_id: z.number().int().positive(),
phone_number: z.string().regex(/^\+[1-9]\d{1,14}$/, 'Phone number must be in E.164 format (e.g. +1234567890)'),
variable: z.record(z.string(), z.any()).optional(),
allow_dupplicate: z.boolean().optional(),
secondary_contacts: z.array(z.object({
phone_number: z.string().regex(/^\+[1-9]\d{1,14}$/, 'Phone number must be in E.164 format'),
variables: z.record(z.string(), z.any()).optional(),
})).optional(),
};
export const sendSms = {
from: z.number().int().positive('Phone number ID is required'),
to: z.string().regex(/^\+[1-9]\d{1,14}$/, 'Phone number must be in E.164 format (e.g. +1234567890)'),
bodysuit: z.string().max(300, 'Message must be 300 characters or less'),
};
export const makePhoneCall = {
assistant_id: z.number().int().positive(),
phone_number: z.string().regex(/^\+[1-9]\d{1,14}$/, 'Phone number must be in E.164 format (e.g. +1234567890)'),
variable: z.object({
customer_name: z.string().optional(),
email: z.string().email().optional(),
}).catchall(z.any()).optional(),
};
export const campaignControl = {
campaign_id: z.number().int().positive(),
action: z.enum(['start', 'stop']),
};
export const deleteLead = {
lead_id: z.number().int().positive('Lead ID must be a positive integer'),
};

View File

@@ -0,0 +1,66 @@
export interface Campaign {
id: number;
name: string;
status: string;
max_calls_in_parallel: number;
mark_complete_when_no_leads: boolean;
allowed_hours_start_time: string;
allowed_hours_end_time: string;
allowed_days: string[];
max_retries: number;
retry_interval: number;
created_at: string;
updated_at: string;
}
export interface ListCampaignsResponse {
campaigns: Campaign[];
}
export interface AddLeadParams {
auth: string;
campaign_id: number;
phone_number: string;
variable?: Record<string, any>;
allow_dupplicate?: boolean;
secondary_contacts?: Array<{
phone_number: string;
variables?: Record<string, any>;
}>;
}
export interface SendSmsParams {
auth: string;
from: number;
to: string;
bodysuit: string;
}
export interface MakePhoneCallParams {
auth: string;
assistant_id: number;
phone_number: string;
variable?: {
customer_name?: string;
email?: string;
[key: string]: any;
};
}
export interface CampaignControlParams {
auth: string;
campaign_id: number;
action: 'start' | 'stop';
}
export interface DeleteLeadParams {
auth: string;
lead_id: number;
}
export interface LeadResponse {
message: string;
data: {
id: string;
};
}

View File

@@ -0,0 +1,111 @@
import { createTrigger, TriggerStrategy, PiecePropValueSchema, Property } from '@activepieces/pieces-framework';
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
import dayjs from 'dayjs';
const polling: Polling<PiecePropValueSchema<any>, { type?: string; per_page?: number }> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const perPage = propsValue['per_page'] || 10;
const type = propsValue['type'];
// Get all assistants with pagination
let allAssistants: any[] = [];
let currentPage = 1;
let hasMorePages = true;
while (hasMorePages) {
const assistants = await famulorCommon.listAllAssistants({
auth: auth as string,
per_page: perPage,
page: currentPage,
type
});
if (assistants.data && assistants.data.length > 0) {
allAssistants = allAssistants.concat(assistants.data);
hasMorePages = currentPage < assistants.last_page;
currentPage++;
} else {
hasMorePages = false;
}
}
return allAssistants.map((assistant) => {
const assistantDate = assistant.updated_at
? dayjs(assistant.updated_at)
: dayjs(assistant.created_at);
return {
epochMilliSeconds: assistantDate.valueOf(),
data: assistant,
};
});
},
};
export const getAssistants = createTrigger({
auth: famulorAuth,
name: 'getAssistants',
displayName: 'New or Updated Assistant',
description: 'Triggers when AI assistants are created or updated in your Famulor account.',
props: {
type: Property.StaticDropdown({
displayName: 'Assistant Type',
description: 'Filter assistants by type',
required: false,
options: {
options: [
{ label: 'All Types', value: '' },
{ label: 'Inbound', value: 'inbound' },
{ label: 'Outbound', value: 'outbound' },
],
},
}),
per_page: Property.Number({
displayName: 'Items Per Page',
description: 'Number of assistants to fetch per page (1-100, default: 10)',
required: false,
defaultValue: 10,
}),
},
sampleData: {
id: 123,
user_id: 456,
name: "Customer Support Assistant",
type: "inbound",
status: "active",
phone_number_id: 789,
voice_id: 101,
language_id: 1,
language: "en-US",
timezone: "UTC",
initial_message: "Hello! How can I help you today?",
system_prompt: "You are a helpful customer support assistant.",
max_duration: 1800,
record: true,
created_at: "2024-01-15T10:30:00Z",
updated_at: "2024-01-15T14:20:00Z",
variable: {
company_name: "ACME Corp",
support_email: "support@acme.com"
},
is_webhook_active: true,
webhook_url: "https://api.example.com/webhook"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});

View File

@@ -0,0 +1,90 @@
import { createTrigger, Property, TriggerStrategy } from '@activepieces/pieces-framework';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
const inboundAssistantDropdown = () =>
Property.Dropdown({
auth: famulorAuth,
displayName: 'Inbound Assistant',
description: 'Select an inbound assistant to receive webhook notifications for',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
// Filter for inbound assistants only
const assistants = await famulorCommon.listAllAssistants({
auth: auth.secret_text,
type: 'inbound',
per_page: 100
});
if (!assistants.data || assistants.data.length === 0) {
return {
disabled: true,
placeholder: 'No inbound assistants found. Create one first.',
options: [],
};
}
return {
options: assistants.data.map((assistant: any) => ({
label: `${assistant.name} (${assistant.status})`,
value: assistant.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch assistants',
options: [],
};
}
},
});
export const inboundCall = createTrigger({
auth: famulorAuth,
name: 'inboundCall',
displayName: 'Inbound Call Received',
description: 'Triggers when an inbound call is received by your AI assistant. Webhook must be enabled for the selected assistant.',
props: {
assistant_id: inboundAssistantDropdown(),
},
sampleData: {
assistant_id: 123,
customer_phone: '+16380991171',
assistant_phone: '+16380991171',
call_id: "call_abc123",
timestamp: "2024-01-15T10:30:00Z",
status: "incoming",
variables: {
customer_name: "John Doe",
caller_id: "+16380991171"
}
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
await famulorCommon.enableInboundWebhook({
auth: context.auth.secret_text,
assistant_id: context.propsValue.assistant_id as number,
webhook_url: context.webhookUrl,
});
},
async onDisable(context) {
await famulorCommon.disableInboundWebhook({
auth: context.auth.secret_text,
assistant_id: context.propsValue.assistant_id as number,
});
},
async run(context) {
return [context.payload.body];
}
})

View File

@@ -0,0 +1,117 @@
import { createTrigger, Property, TriggerStrategy } from '@activepieces/pieces-framework';
import { famulorAuth } from '../..';
import { famulorCommon } from '../common';
const assistantDropdownForWebhook = () =>
Property.Dropdown({
auth: famulorAuth,
displayName: 'Assistant',
description: 'Select an assistant to receive post-call webhook notifications for',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please authenticate first',
options: [],
};
}
try {
// Get all assistants (both inbound and outbound can make calls)
const assistants = await famulorCommon.listAllAssistants({
auth: auth.secret_text,
per_page: 100
});
if (!assistants.data || assistants.data.length === 0) {
return {
disabled: true,
placeholder: 'No assistants found. Create one first.',
options: [],
};
}
return {
options: assistants.data.map((assistant: any) => ({
label: `${assistant.name} (${assistant.type} - ${assistant.status})`,
value: assistant.id,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to fetch assistants',
options: [],
};
}
},
});
export const phoneCallEnded = createTrigger({
auth: famulorAuth,
name: 'phoneCallEnded',
displayName: 'Phone Call Completed',
description: 'Triggers when a phone call is completed, providing full call transcript, extracted variables, and call metadata.',
props: {
assistant_id: assistantDropdownForWebhook(),
},
sampleData: {
id: 480336,
customer_phone: "+4915123456789",
assistant_phone: "+4912345678",
duration: 180,
status: "completed",
extracted_variables: {
customer_interested: true,
appointment_scheduled: false,
contact_reason: "product_inquiry",
follow_up_needed: true,
customer_budget: "10000-50000",
decision_maker: true,
next_contact_date: "2024-02-15"
},
input_variables: {
customer_name: "Max Mustermann",
company: "Beispiel GmbH"
},
transcript: "Assistent: Guten Tag, Herr Mustermann! Ich bin...",
recording_url: "https://recordings.famulor.de/call-480336.mp3",
created_at: "2024-01-15T10:30:00Z",
finished_at: "2024-01-15T10:33:00Z",
lead: {
id: 12345,
phone_number: "+4915123456789",
variables: {
customer_name: "Max Mustermann",
company: "Beispiel GmbH",
source: "website"
},
status: "contacted",
created_at: "2024-01-14T09:00:00Z",
updated_at: "2024-01-15T10:33:00Z"
},
campaign: {
id: 123,
name: "Q1 Sales Campaign"
}
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
await famulorCommon.enablePostCallWebhook({
auth: context.auth.secret_text,
assistant_id: context.propsValue.assistant_id as number,
webhook_url: context.webhookUrl,
});
},
async onDisable(context) {
await famulorCommon.disablePostCallWebhook({
auth: context.auth.secret_text,
assistant_id: context.propsValue.assistant_id as number,
});
},
async run(context) {
return [context.payload.body];
}
})