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,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Erstellen Sie interaktive Formulare und automatisieren Sie Workflows mit Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Um Ihren API-Schlüssel zu erhalten:\n1. Gehen Sie zu Ihren Fillout-Kontoeinstellungen.\n2. Klicken Sie auf \"Entwicklereinstellungen\".\n3. Generieren und kopieren Sie Ihren API-Schlüssel.\n4. Fügen Sie ihn hier ein.",
"Get Form Responses": "Formularantworten erhalten",
"Get Single Response": "Einzelantwort erhalten",
"Find Form by Title": "Formular nach Titel suchen",
"Custom API Call": "Eigener API-Aufruf",
"Fetch all responses for a Fillout form, with optional filters.": "Rufe alle Antworten für ein Fillout-Formular mit optionalen Filtern ab.",
"Retrieves a specific submission from a form.": "Ruft eine bestimmte Abgabe von einem Formular ab.",
"Finds an existing forms by title.": "Findet ein vorhandenes Formular nach Titel.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Form": "Formular",
"Limit": "Limit",
"After Date": "Nach Datum",
"Before Date": "Vor Datum",
"Offset": "Versatz",
"Status": "Status",
"Include Edit Link": "Edit-Link einbeziehen",
"Include Preview": "Vorschau einbeziehen",
"Sort": "Sortieren",
"Search": "Suche",
"Submission": "Einreichung",
"Form Title": "Formulartitel",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"Max number of submissions to retrieve (1-150).": "Max. Anzahl der abzurufenden Einreichungen (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtern Sie die Einreichungen nach diesem Datum (JJJ-MM-TDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtern Sie Einreichungen vor diesem Datum (JJJJ-MM-TDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Startposition für das Abrufen von Einreichungen.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "Standardmäßig werden nur fertige Einreichungen zurückgegeben. Wählen Sie \"In Bearbeitung\", um stattdessen unfertige Einreichungen zu erhalten.",
"Include a link to edit the submission.": "Fügen Sie einen Link ein, um den Beitrag zu bearbeiten.",
"Include preview responses.": "Vorschau-Antworten einschließen.",
"Sort order.": "Sortierung.",
"Filter for submissions containing this text.": "Filter für Einreichungen, die diesen Text enthalten.",
"Select from the 50 most recent submissions for the chosen form.": "Wählen Sie aus den 50 letzten Einreichungen für das gewählte Formular aus.",
"The (partial or full) title of the form to search for.": "Der (teilweise oder vollständig) Titel des zu suchenden Formulars.",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"In Progress (unfinished)": "In Bearbeitung (unvollständig)",
"Ascending": "Aufsteigend",
"Descending": "Absteigend",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Form Response": "Neue Formular-Antwort",
"Triggers when a new submission is received for a selected Fillout form.": "Wird ausgelöst, wenn eine neue Einreichung für ein ausgewähltes Fillout-Formular empfangen wird."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Crear formularios interactivos y automatizar flujos de trabajo con Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Para obtener tu clave API:\n1. Ve a la configuración de tu cuenta de Fillout.\n2. Haz clic en \"Configuración del desarrollador\".\n3. Genera y copia tu clave API.\n4. Pégala aquí.",
"Get Form Responses": "Obtener respuestas de forma",
"Get Single Response": "Obtener una respuesta individual",
"Find Form by Title": "Buscar Formulario por Título",
"Custom API Call": "Llamada API personalizada",
"Fetch all responses for a Fillout form, with optional filters.": "Obtener todas las respuestas para un formulario de relleno, con filtros opcionales.",
"Retrieves a specific submission from a form.": "Recuperar un envío específico de un formulario.",
"Finds an existing forms by title.": "Encuentra un formulario existente por título.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Form": "Forma",
"Limit": "Límite",
"After Date": "Después de la fecha",
"Before Date": "Antes de la fecha",
"Offset": "Desplazamiento",
"Status": "Estado",
"Include Edit Link": "Incluye Editar Enlace",
"Include Preview": "Incluye vista previa",
"Sort": "Ordenar",
"Search": "Buscar",
"Submission": "Envío",
"Form Title": "Título del formulario",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"Max number of submissions to retrieve (1-150).": "Número máximo de envíos a recuperar (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrar envíos después de esta fecha (AA-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrar envíos antes de esta fecha (AA-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Posición inicial para la obtención de sumisiones.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "De forma predeterminada, sólo se devuelven los envíos finalizados. Seleccione \"En progreso\" para obtener en su lugar los envíos sin finalizar.",
"Include a link to edit the submission.": "Incluye un enlace para editar el envío.",
"Include preview responses.": "Incluye la vista previa de respuestas.",
"Sort order.": "Ordenar.",
"Filter for submissions containing this text.": "Filtro para envíos que contengan este texto.",
"Select from the 50 most recent submissions for the chosen form.": "Seleccione entre los 50 envíos más recientes para el formulario elegido.",
"The (partial or full) title of the form to search for.": "El título (parcial o completo) del formulario a buscar.",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"In Progress (unfinished)": "En progreso (sin finalizar)",
"Ascending": "Ascendiente",
"Descending": "Descendiente",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Form Response": "Nueva respuesta de formulario",
"Triggers when a new submission is received for a selected Fillout form.": "Se activa cuando se recibe un nuevo envío para un formulario de rellenado seleccionado."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Créer des formulaires interactifs et automatiser les workflows avec le remplissage",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Pour obtenir votre clé API :\n1. Allez dans les paramètres de votre compte de remplissage.\n2. Cliquez sur \"Paramètres du développeur\".\n3. Générez et copiez votre clé API.\n4. Collez-la ici.",
"Get Form Responses": "Obtenir les réponses du formulaire",
"Get Single Response": "Obtenir une réponse unique",
"Find Form by Title": "Rechercher le formulaire par titre",
"Custom API Call": "Appel API personnalisé",
"Fetch all responses for a Fillout form, with optional filters.": "Récupère toutes les réponses pour un formulaire de remplissage, avec des filtres facultatifs.",
"Retrieves a specific submission from a form.": "Récupère une soumission spécifique à partir d'un formulaire.",
"Finds an existing forms by title.": "Trouve un formulaire existant par titre.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Form": "Forme",
"Limit": "Limite",
"After Date": "Après la date",
"Before Date": "Avant la date",
"Offset": "Décalage",
"Status": "Statut",
"Include Edit Link": "Inclure le lien d'édition",
"Include Preview": "Inclure l'aperçu",
"Sort": "Trier",
"Search": "Rechercher",
"Submission": "Soumission",
"Form Title": "Titre du formulaire",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'attente (en secondes)",
"Max number of submissions to retrieve (1-150).": "Nombre maximum de soumissions à récupérer (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrer les soumissions après cette date (AAAAA-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrer les soumissions avant cette date (AAAAA-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Position de départ pour la récupération des soumissions.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "Par défaut, seules les soumissions terminées sont retournées. Sélectionnez \"En cours\" pour obtenir des soumissions inachevées à la place.",
"Include a link to edit the submission.": "Inclure un lien pour modifier la soumission.",
"Include preview responses.": "Inclure les réponses de prévisualisation.",
"Sort order.": "Ordre de tri.",
"Filter for submissions containing this text.": "Filtrer les soumissions contenant ce texte.",
"Select from the 50 most recent submissions for the chosen form.": "Sélectionnez parmi les 50 soumissions les plus récentes pour le formulaire choisi.",
"The (partial or full) title of the form to search for.": "Le titre (partiel ou complet) du formulaire à rechercher.",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"In Progress (unfinished)": "En cours (inachevé)",
"Ascending": "Ascendant",
"Descending": "Descendant",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Form Response": "Nouveau formulaire de réponse",
"Triggers when a new submission is received for a selected Fillout form.": "Déclenche quand une nouvelle soumission est reçue pour un formulaire de remplissage sélectionné."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Fillout でインタラクティブなフォームを作成し、ワークフローを自動化します",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.",
"Get Form Responses": "フォーム応答を取得する",
"Get Single Response": "単一の応答を取得",
"Find Form by Title": "タイトルでフォームを検索",
"Custom API Call": "カスタムAPI通話",
"Fetch all responses for a Fillout form, with optional filters.": "Fillout フォームのすべての応答を、任意のフィルターで取得します。",
"Retrieves a specific submission from a form.": "フォームから特定の提出物を取得します。",
"Finds an existing forms by title.": "タイトルで既存のフォームを検索します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Form": "フォーム",
"Limit": "制限",
"After Date": "終了日",
"Before Date": "終了日",
"Offset": "オフセット",
"Status": "ステータス",
"Include Edit Link": "編集リンクを含める",
"Include Preview": "プレビューを含める",
"Sort": "並べ替え",
"Search": "検索",
"Submission": "提出",
"Form Title": "フォームタイトル",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Max number of submissions to retrieve (1-150).": "取得する提出物の最大数 (1-150)。",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "この日付(YYYY-MM-DDTHH:mm:sssZ)の後に提出物をフィルタリングします。",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "この日付(YYYY-MM-DDTHH:mm:sssZ)の前に提出物をフィルタリングします。",
"Starting position for fetching submissions.": "提出物を取得する位置を開始しています。",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "デフォルトでは、終了した提出物のみが返されます。代わりに未完了の提出物を取得するには、「進行中」を選択してください。",
"Include a link to edit the submission.": "提出物を編集するためのリンクを含めます.",
"Include preview responses.": "プレビュー応答を含めます。",
"Sort order.": "並び順.",
"Filter for submissions containing this text.": "このテキストを含む提出物のフィルター",
"Select from the 50 most recent submissions for the chosen form.": "選択したフォームの最新の投稿50件から選択します。",
"The (partial or full) title of the form to search for.": "検索するフォームの(部分的または完全な)タイトル。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"In Progress (unfinished)": "進行中 (未完了)",
"Ascending": "昇順",
"Descending": "降順",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Form Response": "新しいフォームの回答",
"Triggers when a new submission is received for a selected Fillout form.": "選択した塗りつぶしフォームに対して新しい提出物が受信されたときにトリガーします。"
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Maak interactieve formulieren en automatiseer de workflows met Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Om je API-sleutel te verkrijgen:\n1. Ga naar je Fillout account instellingen.\n2. Klik op \"Ontwikkelaarsinstellingen\".\n3. Genereer en kopieer de API-sleutel.\n4. Plak deze hier.",
"Get Form Responses": "Formulierantwoorden ophalen",
"Get Single Response": "Krijg Single Response",
"Find Form by Title": "Formulier zoeken op titel",
"Custom API Call": "Custom API Call",
"Fetch all responses for a Fillout form, with optional filters.": "Ophalen van alle antwoorden voor een Fillout formulier, met optionele filters.",
"Retrieves a specific submission from a form.": "Haal een specifieke uitwerking op vanuit een formulier.",
"Finds an existing forms by title.": "Vindt een bestaande formulieren op titel.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Form": "Vorm",
"Limit": "Limiet",
"After Date": "Na datum",
"Before Date": "Voor de datum",
"Offset": "Verschuiving",
"Status": "status",
"Include Edit Link": "Voeg link voor bewerken toe",
"Include Preview": "Voorvertoning opnemen",
"Sort": "Sorteren",
"Search": "Zoeken",
"Submission": "Inzending",
"Form Title": "Formulier titel",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"Max number of submissions to retrieve (1-150).": "Max aantal op te halen uitwerkingen (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter uitwerkingen na deze datum (YYYY-MM-DDDH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter op inzendingen voor deze datum (YYYY-MM-DDDH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Beginpositie voor het ophalen van uitwerkingen.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "Standaard worden alleen voltooide inzendingen teruggegeven. Selecteer \"In uitvoering\" om in plaats daarvan onvoltooide inzendingen te krijgen.",
"Include a link to edit the submission.": "Voeg een link toe om de uitwerking te bewerken.",
"Include preview responses.": "Inclusief preview reacties.",
"Sort order.": "Sorteer bestelling.",
"Filter for submissions containing this text.": "Filter op inzendingen die deze tekst bevatten.",
"Select from the 50 most recent submissions for the chosen form.": "Selecteer uit de 50 meest recente uitwerkingen voor het gekozen formulier.",
"The (partial or full) title of the form to search for.": "De (gedeeltelijke of volledige) titel van het te zoeken formulier.",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"In Progress (unfinished)": "In uitvoering (onvoltooid)",
"Ascending": "Oplopend",
"Descending": "Aflopend",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Form Response": "Nieuw formulierantwoord",
"Triggers when a new submission is received for a selected Fillout form.": "Activeert wanneer een nieuwe uitwerking wordt ontvangen voor een geselecteerd Fillout formulier."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Criar formas interativas e automatizar fluxos de trabalho com o Preenchimento",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Para obter sua chave de API:\n1. Vá para suas configurações de conta Fillout.\n2. Clique em \"Configurações do Desenvolvedor\".\n3. Gerar e copiar a sua chave de API.\n4. Cole-o aqui.",
"Get Form Responses": "Obter respostas de formulário",
"Get Single Response": "Obter Resposta Única",
"Find Form by Title": "Encontrar formulário por título",
"Custom API Call": "Chamada de API personalizada",
"Fetch all responses for a Fillout form, with optional filters.": "Procurar todas as respostas de um formulário de preenchimento, com filtros opcionais.",
"Retrieves a specific submission from a form.": "Recupera uma submissão específica de um formulário.",
"Finds an existing forms by title.": "Localiza um formulário existente por título.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Form": "Formulário",
"Limit": "Limitar",
"After Date": "Data posterior",
"Before Date": "Data anterior",
"Offset": "Deslocamento",
"Status": "Estado",
"Include Edit Link": "Incluir link para edição",
"Include Preview": "Incluir pré-visualização",
"Sort": "Ordenar",
"Search": "Pesquisar",
"Submission": "Submissão",
"Form Title": "Título do formulário",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"Max number of submissions to retrieve (1-150).": "Número máximo de submissões para recuperar (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrar submissões após esta data (AAAA-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filtrar submissões antes desta data (AAAA-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Posição inicial para buscar submissões.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "Por padrão, apenas submissões terminadas são retornadas. Selecione \"Em curso\" para obter submissões não concluídas.",
"Include a link to edit the submission.": "Inclua um link para editar a submissão.",
"Include preview responses.": "Incluir respostas de pré-visualização.",
"Sort order.": "Ordem de classificação.",
"Filter for submissions containing this text.": "Filtrar por submissões que contêm este texto.",
"Select from the 50 most recent submissions for the chosen form.": "Selecione uma das 50 submissões mais recentes para o formulário escolhido.",
"The (partial or full) title of the form to search for.": "O título (parcial ou total) do formulário a ser pesquisado.",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"In Progress (unfinished)": "Em Progresso (não finalizado)",
"Ascending": "Crescente",
"Descending": "Decrescente",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Form Response": "Nova resposta ao formulário",
"Triggers when a new submission is received for a selected Fillout form.": "Aciona quando uma nova submissão for recebida para um formulário de Fillout selecionado."
}

View File

@@ -0,0 +1,54 @@
{
"Fillout Forms": "Формы заполнения",
"Create interactive forms and automate workflows with Fillout": "Создавайте интерактивные формы и автоматизируйте рабочие процессы с Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "Чтобы получить ключ API:\n1. Перейдите к настройкам аккаунта Fillout.\n2. Нажмите на \"Настройки разработчика\".\n3. Сгенерируйте и скопируйте ключ API.\n4. Вставьте его здесь.",
"Get Form Responses": "Получить ответы на форму",
"Get Single Response": "Получить один ответ",
"Find Form by Title": "Поиск формы по названию",
"Custom API Call": "Пользовательский вызов API",
"Fetch all responses for a Fillout form, with optional filters.": "Получить все ответы для формы заполнения, с дополнительными фильтрами.",
"Retrieves a specific submission from a form.": "Получает определённую запись из формы.",
"Finds an existing forms by title.": "Ищет существующие формы по названию.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Form": "Форма",
"Limit": "Лимит",
"After Date": "После даты",
"Before Date": "До даты",
"Offset": "Смещение",
"Status": "Status",
"Include Edit Link": "Включить ссылку редактирования",
"Include Preview": "Включить предпросмотр",
"Sort": "Сортировка",
"Search": "Search",
"Submission": "Представление",
"Form Title": "Заголовок формы",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"Max number of submissions to retrieve (1-150).": "Максимальное количество попыток получения (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Фильтровать сабмиты после этой даты (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Фильтровать сабмиты до этой даты (ГГГГ-ММ-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Начальная позиция для выборки представлений.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "По умолчанию возвращаются только завершенные сообщения. Выберите \"В процессе\", чтобы вместо этого получить незавершенные сообщения.",
"Include a link to edit the submission.": "Включите ссылку для редактирования сданной работы.",
"Include preview responses.": "Включить ответы предварительного просмотра.",
"Sort order.": "Порядок сортировки.",
"Filter for submissions containing this text.": "Фильтр для сабмитов, содержащих этот текст.",
"Select from the 50 most recent submissions for the chosen form.": "Выберите из 50 самых последних сообщений для выбранной формы.",
"The (partial or full) title of the form to search for.": "Заголовок (частичный) формы для поиска.",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"In Progress (unfinished)": "В процессе (незавершено)",
"Ascending": "По возрастанию",
"Descending": "По убыванию",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Form Response": "Новый ответ в форме",
"Triggers when a new submission is received for a selected Fillout form.": "Включает при получении новой заявки для выбранной формы заполнения."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Create interactive forms and automate workflows with Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.",
"Get Form Responses": "Get Form Responses",
"Get Single Response": "Get Single Response",
"Find Form by Title": "Find Form by Title",
"Custom API Call": "Custom API Call",
"Fetch all responses for a Fillout form, with optional filters.": "Fetch all responses for a Fillout form, with optional filters.",
"Retrieves a specific submission from a form.": "Retrieves a specific submission from a form.",
"Finds an existing forms by title.": "Finds an existing forms by title.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Form": "Form",
"Limit": "Limit",
"After Date": "After Date",
"Before Date": "Before Date",
"Offset": "Offset",
"Status": "Status",
"Include Edit Link": "Include Edit Link",
"Include Preview": "Include Preview",
"Sort": "Sort",
"Search": "Search",
"Submission": "Submission",
"Form Title": "Form Title",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Max number of submissions to retrieve (1-150).": "Max number of submissions to retrieve (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Starting position for fetching submissions.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.",
"Include a link to edit the submission.": "Include a link to edit the submission.",
"Include preview responses.": "Include preview responses.",
"Sort order.": "Sort order.",
"Filter for submissions containing this text.": "Filter for submissions containing this text.",
"Select from the 50 most recent submissions for the chosen form.": "Select from the 50 most recent submissions for the chosen form.",
"The (partial or full) title of the form to search for.": "The (partial or full) title of the form to search for.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"In Progress (unfinished)": "In Progress (unfinished)",
"Ascending": "Ascending",
"Descending": "Descending",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Form Response": "New Form Response",
"Triggers when a new submission is received for a selected Fillout form.": "Triggers when a new submission is received for a selected Fillout form."
}

View File

@@ -0,0 +1,54 @@
{
"Fillout Forms": "Fillout Forms",
"Create interactive forms and automate workflows with Fillout": "Create interactive forms and automate workflows with Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.",
"Get Form Responses": "Get Form Responses",
"Get Single Response": "Get Single Response",
"Find Form by Title": "Find Form by Title",
"Custom API Call": "Custom API Call",
"Fetch all responses for a Fillout form, with optional filters.": "Fetch all responses for a Fillout form, with optional filters.",
"Retrieves a specific submission from a form.": "Retrieves a specific submission from a form.",
"Finds an existing forms by title.": "Finds an existing forms by title.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Form": "Form",
"Limit": "Limit",
"After Date": "After Date",
"Before Date": "Before Date",
"Offset": "Offset",
"Status": "Status",
"Include Edit Link": "Include Edit Link",
"Include Preview": "Include Preview",
"Sort": "Sort",
"Search": "Search",
"Submission": "Submission",
"Form Title": "Form Title",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Max number of submissions to retrieve (1-150).": "Max number of submissions to retrieve (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Starting position for fetching submissions.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.",
"Include a link to edit the submission.": "Include a link to edit the submission.",
"Include preview responses.": "Include preview responses.",
"Sort order.": "Sort order.",
"Filter for submissions containing this text.": "Filter for submissions containing this text.",
"Select from the 50 most recent submissions for the chosen form.": "Select from the 50 most recent submissions for the chosen form.",
"The (partial or full) title of the form to search for.": "The (partial or full) title of the form to search for.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"In Progress (unfinished)": "In Progress (unfinished)",
"Ascending": "Tăng dần",
"Descending": "Giảm dần",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Form Response": "New Form Response",
"Triggers when a new submission is received for a selected Fillout form.": "Triggers when a new submission is received for a selected Fillout form."
}

View File

@@ -0,0 +1,55 @@
{
"Create interactive forms and automate workflows with Fillout": "Create interactive forms and automate workflows with Fillout",
"To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.": "To get your API key:\n1. Go to your Fillout account settings.\n2. Click on \"Developer settings\".\n3. Generate and copy your API key.\n4. Paste it here.",
"Get Form Responses": "Get Form Responses",
"Get Single Response": "Get Single Response",
"Find Form by Title": "Find Form by Title",
"Custom API Call": "自定义 API 呼叫",
"Fetch all responses for a Fillout form, with optional filters.": "Fetch all responses for a Fillout form, with optional filters.",
"Retrieves a specific submission from a form.": "Retrieves a specific submission from a form.",
"Finds an existing forms by title.": "Finds an existing forms by title.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Form": "Form",
"Limit": "Limit",
"After Date": "After Date",
"Before Date": "Before Date",
"Offset": "Offset",
"Status": "状态",
"Include Edit Link": "Include Edit Link",
"Include Preview": "Include Preview",
"Sort": "Sort",
"Search": "搜索",
"Submission": "Submission",
"Form Title": "Form Title",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Max number of submissions to retrieve (1-150).": "Max number of submissions to retrieve (1-150).",
"Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).": "Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).",
"Starting position for fetching submissions.": "Starting position for fetching submissions.",
"By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.": "By default, only finished submissions are returned. Select \"In Progress\" to get unfinished submissions instead.",
"Include a link to edit the submission.": "Include a link to edit the submission.",
"Include preview responses.": "Include preview responses.",
"Sort order.": "Sort order.",
"Filter for submissions containing this text.": "Filter for submissions containing this text.",
"Select from the 50 most recent submissions for the chosen form.": "Select from the 50 most recent submissions for the chosen form.",
"The (partial or full) title of the form to search for.": "The (partial or full) title of the form to search for.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"In Progress (unfinished)": "In Progress (unfinished)",
"Ascending": "升序",
"Descending": "降序",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Form Response": "New Form Response",
"Triggers when a new submission is received for a selected Fillout form.": "Triggers when a new submission is received for a selected Fillout form."
}

View File

@@ -0,0 +1,55 @@
import { createPiece } from '@activepieces/pieces-framework';
import { getFormResponses } from './lib/actions/get-form-responses';
import { getSingleResponse } from './lib/actions/get-single-response';
import { findFormByTitle } from './lib/actions/find-form-by-title';
import { newFormResponse } from './lib/triggers/new-form-response';
import { createCustomApiCallAction, HttpMethod } from '@activepieces/pieces-common';
import { PieceAuth } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { makeRequest } from './lib/common';
export const filloutFormsAuth = PieceAuth.SecretText({
displayName: 'API Key',
required: true,
description: `To get your API key:
1. Go to your Fillout account settings.
2. Click on "Developer settings".
3. Generate and copy your API key.
4. Paste it here.`,
validate: async ({ auth }) => {
try {
await makeRequest(auth, HttpMethod.GET, '/forms', undefined);
return { valid: true };
} catch (error: any) {
return {
valid: false,
error: error.message || 'Invalid API Key. Please check your API key and try again.',
};
}
},
});
export const filloutForms = createPiece({
displayName: 'Fillout Forms',
description: 'Create interactive forms and automate workflows with Fillout',
auth: filloutFormsAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/fillout-forms.png',
categories: [PieceCategory.FORMS_AND_SURVEYS],
authors: ['Sanket6652', 'onyedikachi-david'],
actions: [
getFormResponses,
getSingleResponse,
findFormByTitle,
createCustomApiCallAction({
auth: filloutFormsAuth,
baseUrl: () => 'https://api.fillout.com/v1/api',
authMapping: async (auth) => {
return {
Authorization: `Bearer ${auth.secret_text}`,
};
},
}),
],
triggers: [newFormResponse],
});

View File

@@ -0,0 +1,32 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { makeRequest } from '../common';
import { filloutFormsAuth } from '../../index';
export const findFormByTitle = createAction({
auth: filloutFormsAuth,
name: 'findFormByTitle',
displayName: 'Find Form by Title',
description: 'Finds an existing forms by title.',
props: {
title: Property.ShortText({
displayName: 'Form Title',
required: true,
description: 'The (partial or full) title of the form to search for.'
})
},
async run(context) {
const apiKey = context.auth.secret_text;
const response = await makeRequest(apiKey, HttpMethod.GET, `/forms`, undefined);
const forms = response as Array<{ name: string; formId: string }>;
const searchTitle = context.propsValue['title'].toLowerCase();
const matches = forms.filter((f) =>
f.name.toLowerCase().includes(searchTitle)
);
return {
found:matches.length>0,
result:matches
};
},
});

View File

@@ -0,0 +1,104 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { makeRequest } from '../common';
import { formIdDropdown } from '../common/props';
import { filloutFormsAuth } from '../../index';
export const getFormResponses = createAction({
auth: filloutFormsAuth,
name: 'getFormResponses',
displayName: 'Get Form Responses',
description: 'Fetch all responses for a Fillout form, with optional filters.',
props: {
formId: formIdDropdown,
limit: Property.Number({
displayName: 'Limit',
required: false,
description: 'Max number of submissions to retrieve (1-150).'
}),
afterDate: Property.DateTime({
displayName: 'After Date',
required: false,
description: 'Filter submissions after this date (YYYY-MM-DDTHH:mm:ss.sssZ).'
}),
beforeDate: Property.DateTime({
displayName: 'Before Date',
required: false,
description: 'Filter submissions before this date (YYYY-MM-DDTHH:mm:ss.sssZ).'
}),
offset: Property.Number({
displayName: 'Offset',
required: false,
description: 'Starting position for fetching submissions.'
}),
status: Property.StaticDropdown({
displayName: 'Status',
required: false,
options: {
options: [
{ label: 'In Progress (unfinished)', value: 'in_progress' }
]
},
description: 'By default, only finished submissions are returned. Select "In Progress" to get unfinished submissions instead.'
}),
includeEditLink: Property.Checkbox({
displayName: 'Include Edit Link',
required: false,
description: 'Include a link to edit the submission.'
}),
includePreview: Property.Checkbox({
displayName: 'Include Preview',
required: false,
description: 'Include preview responses.'
}),
sort: Property.StaticDropdown({
displayName: 'Sort',
required: false,
options: {
options: [
{ label: 'Ascending', value: 'asc' },
{ label: 'Descending', value: 'desc' }
]
},
description: 'Sort order.'
}),
search: Property.ShortText({
displayName: 'Search',
required: false,
description: 'Filter for submissions containing this text.'
})
},
async run(context) {
const apiKey = context.auth.secret_text;
const formId = context.propsValue['formId'];
const queryParams: Record<string, any> = {};
if (context.propsValue['limit'] !== undefined)
queryParams['limit'] = context.propsValue['limit'];
if (context.propsValue['afterDate'] !== undefined)
queryParams['afterDate'] = context.propsValue['afterDate'];
if (context.propsValue['beforeDate'] !== undefined)
queryParams['beforeDate'] = context.propsValue['beforeDate'];
if (context.propsValue['offset'] !== undefined)
queryParams['offset'] = context.propsValue['offset'];
if (context.propsValue['status'] !== undefined)
queryParams['status'] = context.propsValue['status'];
if (context.propsValue['includeEditLink'] !== undefined)
queryParams['includeEditLink'] = context.propsValue['includeEditLink'];
if (context.propsValue['includePreview'] !== undefined)
queryParams['includePreview'] = context.propsValue['includePreview'];
if (context.propsValue['sort'] !== undefined)
queryParams['sort'] = context.propsValue['sort'];
if (context.propsValue['search'] !== undefined)
queryParams['search'] = context.propsValue['search'];
const response = await makeRequest(
apiKey,
HttpMethod.GET,
`/forms/${formId}/submissions`,
queryParams
);
return response;
},
});

View File

@@ -0,0 +1,39 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { makeRequest } from '../common';
import { formIdDropdown, submissionIdDropdown } from '../common/props';
import { filloutFormsAuth } from '../../index';
export const getSingleResponse = createAction({
auth: filloutFormsAuth,
name: 'getSingleResponse',
displayName: 'Get Single Response',
description: 'Retrieves a specific submission from a form.',
props: {
formId: formIdDropdown,
submissionId: submissionIdDropdown,
includeEditLink: Property.Checkbox({
displayName: 'Include Edit Link',
required: false,
description: 'Include a link to edit the submission.',
}),
},
async run(context) {
const apiKey = context.auth.secret_text;
const { formId, submissionId } = context.propsValue;
const queryParams: Record<string, any> = {};
if (context.propsValue['includeEditLink'] !== undefined) {
queryParams['includeEditLink'] = context.propsValue['includeEditLink'];
}
const response = await makeRequest(
apiKey,
HttpMethod.GET,
`/forms/${formId}/submissions/${submissionId}`,
queryParams,
);
return response;
},
});

View File

@@ -0,0 +1,39 @@
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
export const BASE_URL = 'https://api.fillout.com/v1/api';
export async function makeRequest(
apiKey: string,
method: HttpMethod,
path: string,
queryParams?: Record<string, any>,
body?: unknown
) {
try {
const response = await httpClient.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers: {
Authorization: `Bearer ${apiKey}`,
},
queryParams,
body,
});
return response.body;
} catch (error: any) {
if (error.response?.status === 401) {
throw new Error('Invalid API Key. Please check your authentication credentials.');
}
if (error.response?.status === 403) {
throw new Error('Access denied. Please check your API key permissions.');
}
if (error.response?.status === 404) {
throw new Error('Resource not found. Please check the form ID or submission ID.');
}
if (error.response?.status >= 500) {
throw new Error('Fillout service error. Please try again later.');
}
throw new Error(`Request failed: ${error.message || 'Unknown error'}`);
}
}

View File

@@ -0,0 +1,93 @@
import { DropdownOption, Property } from '@activepieces/pieces-framework';
import { makeRequest } from '.';
import { HttpMethod } from '@activepieces/pieces-common';
import { filloutFormsAuth } from '../..';
export const formIdDropdown = Property.Dropdown({
auth: filloutFormsAuth,
displayName: 'Form',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your Fillout Forms account.',
options: [],
};
}
const apiKey = auth.secret_text;
const forms = await makeRequest(apiKey, HttpMethod.GET, '/forms', undefined);
const options: DropdownOption<string>[] = forms.map((form: any) => ({
label: form.name,
value: form.formId,
}));
return {
disabled: false,
options,
};
},
});
export const submissionIdDropdown = Property.Dropdown({
auth: filloutFormsAuth,
displayName: 'Submission',
description: 'Select from the 50 most recent submissions for the chosen form.',
required: true,
refreshers: ['formId'],
options: async ({ auth, formId }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your Fillout Forms account',
options: [],
};
}
if (!formId) {
return {
disabled: true,
placeholder: 'Please select a form first',
options: [],
};
}
try {
const apiKey = auth.secret_text;
const response = await makeRequest(
apiKey,
HttpMethod.GET,
`/forms/${formId}/submissions`,
{ limit: 50 }
);
const submissions = response.responses || [];
const options: DropdownOption<string>[] = submissions.map((submission: any) => {
const firstQuestion = submission.questions && submission.questions[0];
const firstValue = firstQuestion ? firstQuestion.value : 'No data';
const submissionTime = new Date(submission.submissionTime).toLocaleString();
return {
label: `${submissionTime} - ${firstValue}`,
value: submission.submissionId,
};
});
return {
disabled: false,
options,
placeholder: options.length === 0 ? 'No submissions found' : 'Select a submission',
};
} catch (error) {
return {
disabled: true,
placeholder: 'Error loading submissions',
options: [],
};
}
},
});

View File

@@ -0,0 +1,111 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { formIdDropdown } from '../common/props';
import { filloutFormsAuth } from '../../index';
import { makeRequest } from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
const TRIGGER_KEY = 'new-form-response-trigger';
export const newFormResponse = createTrigger({
auth: filloutFormsAuth,
name: 'new-form-response',
displayName: 'New Form Response',
description:
'Triggers when a new submission is received for a selected Fillout form.',
props: {
formId: formIdDropdown,
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const { formId } = context.propsValue;
const apiKey = context.auth.secret_text;
const response = (await makeRequest(
apiKey,
HttpMethod.POST,
'/webhook/create',
undefined,
{
formId,
url: context.webhookUrl,
}
)) as { id: number };
await context.store.put<number>(TRIGGER_KEY, response.id);
},
async onDisable(context) {
const apiKey = context.auth.secret_text;
const webhookId = await context.store.get<number>(TRIGGER_KEY);
if (!isNil(webhookId)) {
await makeRequest(apiKey, HttpMethod.POST, '/webhook/delete', undefined, {
webhookId,
});
}
},
async test(context) {
const { formId } = context.propsValue;
const apiKey = context.auth.secret_text;
const response = await makeRequest(
apiKey,
HttpMethod.GET,
`/forms/${formId}/submissions`,
{
limit: '10',
sort: 'desc',
}
);
const submissions = response as { responses: Record<string, any>[] };
return submissions.responses;
},
async run(context) {
const payload = JSON.parse(context.payload.body as string) as {
submission: Record<string, any>;
};
return [payload.submission];
},
sampleData: {
questions: [
{
id: '5AtgG35AAZVcrSVfRubvp1',
name: 'What is your name?',
type: 'ShortAnswer',
value: 'John Doe',
},
{
id: 'gRBWVbE2fut2oiAMprdZpY',
name: 'What is your email?',
type: 'Email',
value: 'john@example.com',
},
{
id: 'hP4bHA1CgvyD2LKhBnnGHy',
name: 'Pick your favorite color',
type: 'MultipleChoice',
value: 'Blue',
},
],
calculations: [
{
id: 'abcdef',
name: 'Price',
type: 'number',
value: '12.50',
},
],
urlParameters: [
{
id: 'email',
name: 'email',
value: 'john@example.com',
},
],
submissionId: 'abc123',
submissionTime: '2024-05-16T23:20:05.324Z',
},
});