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,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Cloud-basierte Messaging-Plattform zum Versenden von SMS, MMS, Voice, E-Mail und mehr.",
"Username": "Benutzername",
"Your ClickSend username": "Ihr ClickSend-Benutzername",
"API Key": "API-Schlüssel",
"Your ClickSend API key": "Ihr ClickSend-API-Schlüssel",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "Sie können Ihre API-Anmeldeinformationen erhalten, indem Sie rechts oben auf dem Dashboard auf 'API-Anmeldeinformationen' klicken.",
"Send SMS": "SMS senden",
"Send MMS": "MMS senden",
"Create Contact": "Kontakt erstellen",
"Update Contact": "Kontakt aktualisieren",
"Delete Contact": "Kontakt löschen",
"Create Contact List": "Kontaktliste erstellen",
"Find Contact by Email": "Kontakt per E-Mail finden",
"Find Contact by Phone": "Kontakt per Telefon suchen",
"Find Contact List": "Kontaktliste suchen",
"Custom API Call": "Eigener API-Aufruf",
"Send one or more SMS messages.": "Senden Sie eine oder mehrere SMS-Nachrichten.",
"Send one or more MMS messages.": "Senden Sie eine oder mehrere MMS-Nachrichten.",
"Creates a new contact in a contact list.": "Erstellt einen neuen Kontakt in einer Kontaktliste.",
"Updates an existing contact in a contact list.": "Aktualisiert einen vorhandenen Kontakt in einer Kontaktliste.",
"Deletes a contact from a contact list.": "Löscht einen Kontakt aus einer Kontaktliste.",
"Creates a new contact list.": "Erstellt eine neue Kontaktliste.",
"Finds contact by email address.": "Findet Kontakt per E-Mail-Adresse.",
"Finds contact by phone number.": "Findet Kontakt per Telefonnummer.",
"Finds for contact list based on name.": "Funde der Kontaktliste basierend auf Namen.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Messages": "Nachrichten",
"To": "An",
"Message Body": "Nachrichtentext",
"Subject": "Betreff",
"From": "Von",
"Media URL": "Medien-URL",
"Contact List ID": "Kontaktliste ID",
"Phone Number": "Telefonnummer",
"Email Address": "E-Mail-Adresse",
"First Name": "Vorname",
"Last Name": "Nachname",
"Company Name": "Firmenname",
"Address Line 1": "Adresszeile 1",
"Address Line 2": "Adresszeile 2",
"City": "Stadt",
"State/Province": "Bundesland/Provinz",
"Postal Code": "Postleitzahl",
"Country": "Land",
"Contact ID": "Kontakt-ID",
"List Name": "Listenname",
"Search": "Suche",
"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)",
"The phone number (with country code, e.g., +1234567890)": "Die Telefonnummer (mit Landesvorwahl, z.B. +1234567890)",
"The body of the message to send": "Der Inhalt der zu sendenden Nachricht",
"The URL of the media file to send (image, video, etc.)": "Die URL der zu sendenden Mediendatei (Bild, Video, etc.)",
"The phone number of the contact": "Die Telefonnummer des Kontakts",
"The email address of the contact": "Die E-Mail-Adresse des Kontakts",
"The first name of the contact": "Der Vorname des Kontakts",
"The last name of the contact": "Der Nachname des Kontakts",
"The company name of the contact": "Der Firmenname des Kontakts",
"The first line of the address": "Die erste Zeile der Adresse",
"The second line of the address": "Die zweite Zeile der Adresse",
"The city of the contact": "Die Stadt des Kontakts",
"The state/province of the contact": "Das Bundesland/Provinz des Kontakts",
"The postal code of the contact": "Die Postleitzahl des Kontakts",
"The country of the contact": "Das Land des Kontakts",
"The email address": "Die E-Mail-Adresse",
"Search by list name.": "Suche nach Listenname.",
"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..",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Incoming SMS": "Neue eingehende SMS",
"Triggers when a new SMS message is received.": "Wird ausgelöst, wenn eine neue SMS empfangen wird."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Plataforma de mensajería basada en la nube para enviar SMS, MMS, voz, correo electrónico y más.",
"Username": "Usuario",
"Your ClickSend username": "Su nombre de usuario ClickSend",
"API Key": "Clave API",
"Your ClickSend API key": "Su clave API ClickSend",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "Puedes obtener tus credenciales API haciendo clic en 'Credenciales de API' en la parte superior derecha del tablero.",
"Send SMS": "Enviar SMS",
"Send MMS": "Enviar MMS",
"Create Contact": "Crear contacto",
"Update Contact": "Actualizar contacto",
"Delete Contact": "Eliminar contacto",
"Create Contact List": "Crear lista de contactos",
"Find Contact by Email": "Buscar contacto por email",
"Find Contact by Phone": "Buscar contacto por teléfono",
"Find Contact List": "Buscar lista de contactos",
"Custom API Call": "Llamada API personalizada",
"Send one or more SMS messages.": "Enviar uno o más mensajes SMS.",
"Send one or more MMS messages.": "Enviar uno o más mensajes MMS.",
"Creates a new contact in a contact list.": "Crea un nuevo contacto en una lista de contactos.",
"Updates an existing contact in a contact list.": "Actualiza un contacto existente en una lista de contactos.",
"Deletes a contact from a contact list.": "Elimina un contacto de una lista de contactos.",
"Creates a new contact list.": "Crea una nueva lista de contactos.",
"Finds contact by email address.": "Encuentra contacto por correo electrónico.",
"Finds contact by phone number.": "Encuentra contacto por número de teléfono.",
"Finds for contact list based on name.": "Encontrados para la lista de contactos basados en el nombre.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Messages": "Mensajes",
"To": "A",
"Message Body": "Cuerpo",
"Subject": "Asunto",
"From": "De",
"Media URL": "URL de medios",
"Contact List ID": "ID de lista de contactos",
"Phone Number": "Número de teléfono",
"Email Address": "Dirección de email",
"First Name": "Nombre",
"Last Name": "Apellido",
"Company Name": "Nombre De La Empresa",
"Address Line 1": "Dirección línea 1",
"Address Line 2": "Dirección línea 2",
"City": "Ciudad",
"State/Province": "Estado/Provenza",
"Postal Code": "Código postal",
"Country": "País",
"Contact ID": "ID de contacto",
"List Name": "Nombre de lista",
"Search": "Buscar",
"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)",
"The phone number (with country code, e.g., +1234567890)": "El número de teléfono (con código de país, por ejemplo, +1234567890)",
"The body of the message to send": "El cuerpo del mensaje a enviar",
"The URL of the media file to send (image, video, etc.)": "La URL del archivo multimedia a enviar (imagen, vídeo, etc.)",
"The phone number of the contact": "El número de teléfono del contacto",
"The email address of the contact": "La dirección de correo electrónico del contacto",
"The first name of the contact": "El nombre del contacto",
"The last name of the contact": "El apellido del contacto",
"The company name of the contact": "El nombre de la empresa del contacto",
"The first line of the address": "La primera línea de la dirección",
"The second line of the address": "La segunda línea de la dirección",
"The city of the contact": "La ciudad del contacto",
"The state/province of the contact": "El estado/provincia del contacto",
"The postal code of the contact": "El código postal del contacto",
"The country of the contact": "El país del contacto",
"The email address": "La dirección de correo",
"Search by list name.": "Buscar por nombre de lista.",
"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.",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Incoming SMS": "Nuevo SMS entrante",
"Triggers when a new SMS message is received.": "Dispara cuando se recibe un nuevo mensaje SMS."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Plateforme de messagerie basée sur le cloud pour envoyer des SMS, MMS, voix, courriels et plus encore.",
"Username": "Nom d'utilisateur",
"Your ClickSend username": "Votre nom d'utilisateur ClickSend",
"API Key": "Clé API",
"Your ClickSend API key": "Votre clé API ClickSend",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "Vous pouvez obtenir vos identifiants API en cliquant sur 'Identifiants API' en haut à droite du tableau de bord.",
"Send SMS": "Envoyer un SMS",
"Send MMS": "Envoyer des MMS",
"Create Contact": "Créer un contact",
"Update Contact": "Mettre à jour le contact",
"Delete Contact": "Supprimer le contact",
"Create Contact List": "Créer une liste de contacts",
"Find Contact by Email": "Trouver un contact par e-mail",
"Find Contact by Phone": "Trouver un contact par téléphone",
"Find Contact List": "Trouver la liste de contacts",
"Custom API Call": "Appel API personnalisé",
"Send one or more SMS messages.": "Envoyer un ou plusieurs messages SMS.",
"Send one or more MMS messages.": "Envoyer un ou plusieurs MMS",
"Creates a new contact in a contact list.": "Crée un nouveau contact dans une liste de contacts.",
"Updates an existing contact in a contact list.": "Met à jour un contact existant dans une liste de contacts.",
"Deletes a contact from a contact list.": "Supprime un contact d'une liste de contacts.",
"Creates a new contact list.": "Crée une nouvelle liste de contacts.",
"Finds contact by email address.": "Trouve le contact par adresse e-mail.",
"Finds contact by phone number.": "Trouve le contact par numéro de téléphone.",
"Finds for contact list based on name.": "Trouvées pour la liste de contacts basée sur le nom.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Messages": "Messages",
"To": "À",
"Message Body": "Corps du message",
"Subject": "Sujet",
"From": "A partir de",
"Media URL": "URL du média",
"Contact List ID": "ID de la liste de contacts",
"Phone Number": "Numéro de téléphone",
"Email Address": "Adresse e-mail",
"First Name": "First Name",
"Last Name": "Last Name",
"Company Name": "Nom de lentreprise",
"Address Line 1": "Adresse ligne 1",
"Address Line 2": "Adresse ligne 2",
"City": "Ville",
"State/Province": "État/Province",
"Postal Code": "Code postal",
"Country": "Pays",
"Contact ID": "ID du contact",
"List Name": "Nom de la liste",
"Search": "Rechercher",
"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)",
"The phone number (with country code, e.g., +1234567890)": "Le numéro de téléphone (avec l'indicatif du pays, p. ex. +1234567890)",
"The body of the message to send": "Le corps du message à envoyer",
"The URL of the media file to send (image, video, etc.)": "L'URL du fichier média à envoyer (image, vidéo, etc.)",
"The phone number of the contact": "Le numéro de téléphone du contact",
"The email address of the contact": "L'adresse e-mail du contact",
"The first name of the contact": "Le prénom du contact",
"The last name of the contact": "Le nom de famille du contact",
"The company name of the contact": "Le nom de la société du contact",
"The first line of the address": "La première ligne de l'adresse",
"The second line of the address": "La deuxième ligne de l'adresse",
"The city of the contact": "La ville du contact",
"The state/province of the contact": "L'état/province du contact",
"The postal code of the contact": "Le code postal du contact",
"The country of the contact": "Le pays du contact",
"The email address": "L'adresse e-mail",
"Search by list name.": "Recherche par nom de liste.",
"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.",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Incoming SMS": "Nouveau SMS entrant",
"Triggers when a new SMS message is received.": "Déclenche quand un nouveau SMS est reçu."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "SMS、MMS、音声、電子メールなどを送信するためのクラウドベースのメッセージングプラットフォーム。",
"Username": "ユーザー名",
"Your ClickSend username": "ClickSend ユーザー名",
"API Key": "API キー",
"Your ClickSend API key": "ClickSend API キー",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "ダッシュボードの右上にある「API Credentials」をクリックすると、API 資格情報を取得できます。",
"Send SMS": "SMSの送信",
"Send MMS": "MMSを送信",
"Create Contact": "連絡先を作成",
"Update Contact": "連絡先を更新",
"Delete Contact": "連絡先を削除",
"Create Contact List": "連絡先リストを作成",
"Find Contact by Email": "電子メールで連絡先を検索",
"Find Contact by Phone": "電話で連絡先を検索",
"Find Contact List": "連絡先リストを検索",
"Custom API Call": "カスタムAPI通話",
"Send one or more SMS messages.": "1 つ以上の SMS メッセージを送信します。",
"Send one or more MMS messages.": "1つまたは複数のMMSメッセージを送信します。",
"Creates a new contact in a contact list.": "連絡先リストに新しい連絡先を作成します。",
"Updates an existing contact in a contact list.": "連絡先リストに既存の連絡先を更新します。",
"Deletes a contact from a contact list.": "連絡先リストから連絡先を削除します。",
"Creates a new contact list.": "新しい連絡先リストを作成します。",
"Finds contact by email address.": "メールアドレスで連絡先を検索します。",
"Finds contact by phone number.": "電話番号で連絡先を検索します。",
"Finds for contact list based on name.": "名前に基づいて連絡先リストを検索します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Messages": "メッセージ",
"To": "終了日",
"Message Body": "メッセージ本文",
"Subject": "件名",
"From": "差出人:",
"Media URL": "メディア URL",
"Contact List ID": "連絡先リストID",
"Phone Number": "電話番号",
"Email Address": "メールアドレス",
"First Name": "名",
"Last Name": "姓",
"Company Name": "会社名",
"Address Line 1": "住所1",
"Address Line 2": "住所2",
"City": "市区町村名",
"State/Province": "都道府県:",
"Postal Code": "郵便番号",
"Country": "国",
"Contact ID": "連絡先ID",
"List Name": "リスト名",
"Search": "検索",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The phone number (with country code, e.g., +1234567890)": "電話番号(例:+1234567890",
"The body of the message to send": "送信するメッセージの本文",
"The URL of the media file to send (image, video, etc.)": "送信するメディアファイルのURL画像、動画など",
"The phone number of the contact": "連絡先の電話番号",
"The email address of the contact": "連絡先のメールアドレス",
"The first name of the contact": "連絡先の名",
"The last name of the contact": "連絡先の姓",
"The company name of the contact": "連絡先の会社名",
"The first line of the address": "アドレスの最初の行",
"The second line of the address": "The second line of the address",
"The city of the contact": "連絡先の都市",
"The state/province of the contact": "連絡先の州/州",
"The postal code of the contact": "連絡先の郵便番号",
"The country of the contact": "連絡先の国",
"The email address": "メールアドレス",
"Search by list name.": "リスト名で検索",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Incoming SMS": "新しいSMS着信",
"Triggers when a new SMS message is received.": "新しいSMSメッセージを受信したときにトリガーします."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Cloud-gebaseerd berichtenplatform voor het verzenden van SMS, MMS, voice, e-mail en meer.",
"Username": "Gebruikersnaam",
"Your ClickSend username": "Uw gebruikersnaam ClickSend",
"API Key": "API Sleutel",
"Your ClickSend API key": "Uw ClickSend API-sleutel",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "U kunt uw API-referenties krijgen door te klikken op 'API Credentials' rechtsboven in het dashboard.",
"Send SMS": "Sms verzenden",
"Send MMS": "MMS verzenden",
"Create Contact": "Contactpersoon aanmaken",
"Update Contact": "Contactpersoon bijwerken",
"Delete Contact": "Contactpersoon verwijderen",
"Create Contact List": "Lijst met contactpersonen aanmaken",
"Find Contact by Email": "Zoek contact per e-mail",
"Find Contact by Phone": "Zoek contact per telefoon",
"Find Contact List": "Vind contactpersonen lijst",
"Custom API Call": "Custom API Call",
"Send one or more SMS messages.": "Stuur een of meer SMS-berichten.",
"Send one or more MMS messages.": "Stuur een of meer MMS-berichten.",
"Creates a new contact in a contact list.": "Maakt een nieuwe contactpersoon aan in een adresboek.",
"Updates an existing contact in a contact list.": "Werkt een bestaand contact in een adresboek bij.",
"Deletes a contact from a contact list.": "Verwijdert een contactpersoon uit een contactenlijst.",
"Creates a new contact list.": "Maakt een nieuw adresboek aan.",
"Finds contact by email address.": "Zoekt een contactpersoon per e-mailadres.",
"Finds contact by phone number.": "Gevonden contacten per telefoonnummer.",
"Finds for contact list based on name.": "Gevonden caches voor de lijst met contactpersonen gebaseerd op naam.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Messages": "berichten",
"To": "tot",
"Message Body": "Bericht Body",
"Subject": "Onderwerp",
"From": "van",
"Media URL": "Media URL",
"Contact List ID": "Contactlijst ID",
"Phone Number": "Telefoon nummer",
"Email Address": "Uw e-mailadres",
"First Name": "Voornaam",
"Last Name": "Achternaam",
"Company Name": "Bedrijfsnaam",
"Address Line 1": "Adresregel 1",
"Address Line 2": "Adresregel 2",
"City": "Woonplaats",
"State/Province": "Staat/provincie",
"Postal Code": "Postcode - Postcode",
"Country": "Land:",
"Contact ID": "Contact ID",
"List Name": "Lijst Naam",
"Search": "Zoeken",
"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)",
"The phone number (with country code, e.g., +1234567890)": "Het telefoonnummer (met landcode, b.v. +1234567890)",
"The body of the message to send": "De inhoud van het te verzenden bericht",
"The URL of the media file to send (image, video, etc.)": "De URL van het mediabestand om te verzenden (afbeelding, video, etc.)",
"The phone number of the contact": "Het telefoonnummer van de contactpersoon",
"The email address of the contact": "Het e-mailadres van de contactpersoon",
"The first name of the contact": "De voornaam van het contact",
"The last name of the contact": "De achternaam van de contactpersoon",
"The company name of the contact": "De bedrijfsnaam van de contactpersoon",
"The first line of the address": "De eerste regel van het adres",
"The second line of the address": "De tweede regel van het adres",
"The city of the contact": "De stad van het contact",
"The state/province of the contact": "De staat/provincie van het contact",
"The postal code of the contact": "De postcode van de contactpersoon",
"The country of the contact": "Het land van de contactpersoon",
"The email address": "Het e-mailadres",
"Search by list name.": "Zoeken op lijstnaam.",
"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..",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Incoming SMS": "Nieuwe inkomende SMS",
"Triggers when a new SMS message is received.": "Triggert wanneer een nieuw SMS-bericht wordt ontvangen."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Plataforma de mensagens baseada na nuvem para o envio de SMS, MMS, voz, e-mail e muito mais.",
"Username": "Usuário:",
"Your ClickSend username": "Seu nome no ClickSend",
"API Key": "Chave de API",
"Your ClickSend API key": "Sua chave API no ClickSend",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "Você pode obter suas credenciais de API clicando em 'Credenciais de API' no canto superior direito do painel.",
"Send SMS": "Enviar SMS",
"Send MMS": "Enviar MMS",
"Create Contact": "Criar contato",
"Update Contact": "Atualizar contato",
"Delete Contact": "Excluir contato",
"Create Contact List": "Criar lista de contatos",
"Find Contact by Email": "Localizar contato por e-mail",
"Find Contact by Phone": "Encontrar contato por telefone",
"Find Contact List": "Localizar Lista de Contatos",
"Custom API Call": "Chamada de API personalizada",
"Send one or more SMS messages.": "Envie uma ou mais mensagens SMS.",
"Send one or more MMS messages.": "Envie uma ou mais mensagens MMS.",
"Creates a new contact in a contact list.": "Cria um novo contato em uma lista de contatos.",
"Updates an existing contact in a contact list.": "Atualiza um contato existente em uma lista de contatos.",
"Deletes a contact from a contact list.": "Exclui um contato de uma lista de contatos.",
"Creates a new contact list.": "Cria uma nova lista de contatos.",
"Finds contact by email address.": "Localiza contato por endereço de e-mail.",
"Finds contact by phone number.": "Localiza contatos por número de telefone.",
"Finds for contact list based on name.": "Localiza a lista de contatos com base no nome.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Messages": "mensagens",
"To": "Para",
"Message Body": "Corpo da Mensagem",
"Subject": "Cargo",
"From": "De",
"Media URL": "URL da Mídia",
"Contact List ID": "ID da Lista de Contatos",
"Phone Number": "Número de telefone",
"Email Address": "Endereço de e-mail",
"First Name": "Nome",
"Last Name": "Sobrenome",
"Company Name": "Nome da Empresa",
"Address Line 1": "Linha de Endereço 1",
"Address Line 2": "Linha de Endereço 2",
"City": "cidade",
"State/Province": "Estado/província",
"Postal Code": "Código Postal",
"Country": "País/região",
"Contact ID": "ID do contato",
"List Name": "Lista de nomes",
"Search": "Pesquisar",
"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)",
"The phone number (with country code, e.g., +1234567890)": "O número de telefone (com código de país, por exemplo, +1234567890)",
"The body of the message to send": "O corpo da mensagem a enviar",
"The URL of the media file to send (image, video, etc.)": "A URL do arquivo de mídia a ser enviado (imagem, vídeo, etc.)",
"The phone number of the contact": "O número de telefone do contato",
"The email address of the contact": "O endereço de e-mail do contato",
"The first name of the contact": "O primeiro nome do contato",
"The last name of the contact": "O último nome do contato",
"The company name of the contact": "O nome da empresa do contato",
"The first line of the address": "A primeira linha do endereço",
"The second line of the address": "A segunda linha do endereço",
"The city of the contact": "A cidade do contato",
"The state/province of the contact": "O estado/província do contato",
"The postal code of the contact": "O CEP do contato",
"The country of the contact": "O país do contato",
"The email address": "O endereço de e-mail",
"Search by list name.": "Pesquisar por nome da lista.",
"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..",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Incoming SMS": "Novo SMS de entrada",
"Triggers when a new SMS message is received.": "Aciona quando uma nova mensagem SMS é recebida."
}

View File

@@ -0,0 +1,81 @@
{
"ClickSend SMS": "Клик-Отправить SMS",
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Облачная коммуникационная платформа для отправки SMS, MMS, голосовой и электронной почты и многое другое.",
"Username": "Имя пользователя",
"Your ClickSend username": "Ваше имя пользователя ClickSend",
"API Key": "Ключ API",
"Your ClickSend API key": "Ваш ключ ClickSend API",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "Вы можете получить ваши API учетные данные, нажав \"API Credentials\" в правом верхнем углу панели.",
"Send SMS": "Отправить СМС",
"Send MMS": "Отправить MMS",
"Create Contact": "Создать контакт",
"Update Contact": "Обновить контакт",
"Delete Contact": "Удалить контакт",
"Create Contact List": "Создать список контактов",
"Find Contact by Email": "Найти контакт по электронной почте",
"Find Contact by Phone": "Найти контакт по телефону",
"Find Contact List": "Найти список контактов",
"Custom API Call": "Пользовательский вызов API",
"Send one or more SMS messages.": "Отправлять одно или несколько SMS-сообщений.",
"Send one or more MMS messages.": "Отправить одно или несколько MMS-сообщений.",
"Creates a new contact in a contact list.": "Создает новый контакт в списке контактов.",
"Updates an existing contact in a contact list.": "Обновляет существующий контакт в списке контактов.",
"Deletes a contact from a contact list.": "Удаляет контакт из списка контактов.",
"Creates a new contact list.": "Создает новый список контактов.",
"Finds contact by email address.": "Поиск контакта по адресу электронной почты.",
"Finds contact by phone number.": "Поиск контакта по номеру телефона.",
"Finds for contact list based on name.": "Поиск списка контактов на основе имени.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Messages": "Сообщения",
"To": "Кому",
"Message Body": "Тело сообщения",
"Subject": "Тема",
"From": "От",
"Media URL": "URL-адрес медиа",
"Contact List ID": "ID списка контактов",
"Phone Number": "Номер телефона",
"Email Address": "Email Address",
"First Name": "First Name",
"Last Name": "Last Name",
"Company Name": "Название компании",
"Address Line 1": "Адрес, строка 1",
"Address Line 2": "Адрес, строка 2",
"City": "Город",
"State/Province": "Штат/провинция",
"Postal Code": "Почтовый индекс",
"Country": "Страна",
"Contact ID": "ID контакта",
"List Name": "Название списка",
"Search": "Search",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"The phone number (with country code, e.g., +1234567890)": "Телефон (с кодом страны, например, +1234567890)",
"The body of the message to send": "Тело сообщения для отправки",
"The URL of the media file to send (image, video, etc.)": "URL медиа-файла для отправки (изображение, видео, и т. д.)",
"The phone number of the contact": "Номер телефона контакта",
"The email address of the contact": "Адрес электронной почты контакта",
"The first name of the contact": "Имя контакта",
"The last name of the contact": "Фамилия контакта",
"The company name of the contact": "Название компании контакта",
"The first line of the address": "Первая строка адреса",
"The second line of the address": "Вторая строка адреса",
"The city of the contact": "Город контакта",
"The state/province of the contact": "Штат/провинция контакта",
"The postal code of the contact": "Индекс контакта",
"The country of the contact": "Страна контакта",
"The email address": "Адрес электронной почты",
"Search by list name.": "Поиск по названию списка.",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Incoming SMS": "Новые входящие SMS",
"Triggers when a new SMS message is received.": "Включает при получении нового SMS-сообщения."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.",
"Username": "Username",
"Your ClickSend username": "Your ClickSend username",
"API Key": "API Key",
"Your ClickSend API key": "Your ClickSend API key",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.",
"Send SMS": "Send SMS",
"Send MMS": "Send MMS",
"Create Contact": "Create Contact",
"Update Contact": "Update Contact",
"Delete Contact": "Delete Contact",
"Create Contact List": "Create Contact List",
"Find Contact by Email": "Find Contact by Email",
"Find Contact by Phone": "Find Contact by Phone",
"Find Contact List": "Find Contact List",
"Custom API Call": "Custom API Call",
"Send one or more SMS messages.": "Send one or more SMS messages.",
"Send one or more MMS messages.": "Send one or more MMS messages.",
"Creates a new contact in a contact list.": "Creates a new contact in a contact list.",
"Updates an existing contact in a contact list.": "Updates an existing contact in a contact list.",
"Deletes a contact from a contact list.": "Deletes a contact from a contact list.",
"Creates a new contact list.": "Creates a new contact list.",
"Finds contact by email address.": "Finds contact by email address.",
"Finds contact by phone number.": "Finds contact by phone number.",
"Finds for contact list based on name.": "Finds for contact list based on name.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Messages": "Messages",
"To": "To",
"Message Body": "Message Body",
"Subject": "Subject",
"From": "From",
"Media URL": "Media URL",
"Contact List ID": "Contact List ID",
"Phone Number": "Phone Number",
"Email Address": "Email Address",
"First Name": "First Name",
"Last Name": "Last Name",
"Company Name": "Company Name",
"Address Line 1": "Address Line 1",
"Address Line 2": "Address Line 2",
"City": "City",
"State/Province": "State/Province",
"Postal Code": "Postal Code",
"Country": "Country",
"Contact ID": "Contact ID",
"List Name": "List Name",
"Search": "Search",
"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)",
"The phone number (with country code, e.g., +1234567890)": "The phone number (with country code, e.g., +1234567890)",
"The body of the message to send": "The body of the message to send",
"The URL of the media file to send (image, video, etc.)": "The URL of the media file to send (image, video, etc.)",
"The phone number of the contact": "The phone number of the contact",
"The email address of the contact": "The email address of the contact",
"The first name of the contact": "The first name of the contact",
"The last name of the contact": "The last name of the contact",
"The company name of the contact": "The company name of the contact",
"The first line of the address": "The first line of the address",
"The second line of the address": "The second line of the address",
"The city of the contact": "The city of the contact",
"The state/province of the contact": "The state/province of the contact",
"The postal code of the contact": "The postal code of the contact",
"The country of the contact": "The country of the contact",
"The email address": "The email address",
"Search by list name.": "Search by list name.",
"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..",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Incoming SMS": "New Incoming SMS",
"Triggers when a new SMS message is received.": "Triggers when a new SMS message is received."
}

View File

@@ -0,0 +1,81 @@
{
"ClickSend SMS": "ClickSend SMS",
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.",
"Username": "Username",
"Your ClickSend username": "Your ClickSend username",
"API Key": "API Key",
"Your ClickSend API key": "Your ClickSend API key",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.",
"Send SMS": "Send SMS",
"Send MMS": "Send MMS",
"Create Contact": "Create Contact",
"Update Contact": "Update Contact",
"Delete Contact": "Delete Contact",
"Create Contact List": "Create Contact List",
"Find Contact by Email": "Find Contact by Email",
"Find Contact by Phone": "Find Contact by Phone",
"Find Contact List": "Find Contact List",
"Custom API Call": "Custom API Call",
"Send one or more SMS messages.": "Send one or more SMS messages.",
"Send one or more MMS messages.": "Send one or more MMS messages.",
"Creates a new contact in a contact list.": "Creates a new contact in a contact list.",
"Updates an existing contact in a contact list.": "Updates an existing contact in a contact list.",
"Deletes a contact from a contact list.": "Deletes a contact from a contact list.",
"Creates a new contact list.": "Creates a new contact list.",
"Finds contact by email address.": "Finds contact by email address.",
"Finds contact by phone number.": "Finds contact by phone number.",
"Finds for contact list based on name.": "Finds for contact list based on name.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Messages": "Messages",
"To": "To",
"Message Body": "Message Body",
"Subject": "Subject",
"From": "From",
"Media URL": "Media URL",
"Contact List ID": "Contact List ID",
"Phone Number": "Phone Number",
"Email Address": "Email Address",
"First Name": "First Name",
"Last Name": "Last Name",
"Company Name": "Tên công ty",
"Address Line 1": "Address Line 1",
"Address Line 2": "Address Line 2",
"City": "City",
"State/Province": "State/Province",
"Postal Code": "Postal Code",
"Country": "Country",
"Contact ID": "Contact ID",
"List Name": "List Name",
"Search": "Search",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The phone number (with country code, e.g., +1234567890)": "The phone number (with country code, e.g., +1234567890)",
"The body of the message to send": "The body of the message to send",
"The URL of the media file to send (image, video, etc.)": "The URL of the media file to send (image, video, etc.)",
"The phone number of the contact": "The phone number of the contact",
"The email address of the contact": "The email address of the contact",
"The first name of the contact": "The first name of the contact",
"The last name of the contact": "The last name of the contact",
"The company name of the contact": "The company name of the contact",
"The first line of the address": "The first line of the address",
"The second line of the address": "The second line of the address",
"The city of the contact": "The city of the contact",
"The state/province of the contact": "The state/province of the contact",
"The postal code of the contact": "The postal code of the contact",
"The country of the contact": "The country of the contact",
"The email address": "The email address",
"Search by list name.": "Search by list name.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Incoming SMS": "New Incoming SMS",
"Triggers when a new SMS message is received.": "Triggers when a new SMS message is received."
}

View File

@@ -0,0 +1,82 @@
{
"Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.": "Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.",
"Username": "用户名",
"Your ClickSend username": "Your ClickSend username",
"API Key": "API 密钥",
"Your ClickSend API key": "Your ClickSend API key",
"You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.": "You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.",
"Send SMS": "Send SMS",
"Send MMS": "Send MMS",
"Create Contact": "Create Contact",
"Update Contact": "Update Contact",
"Delete Contact": "Delete Contact",
"Create Contact List": "Create Contact List",
"Find Contact by Email": "Find Contact by Email",
"Find Contact by Phone": "Find Contact by Phone",
"Find Contact List": "Find Contact List",
"Custom API Call": "自定义 API 呼叫",
"Send one or more SMS messages.": "Send one or more SMS messages.",
"Send one or more MMS messages.": "Send one or more MMS messages.",
"Creates a new contact in a contact list.": "Creates a new contact in a contact list.",
"Updates an existing contact in a contact list.": "Updates an existing contact in a contact list.",
"Deletes a contact from a contact list.": "Deletes a contact from a contact list.",
"Creates a new contact list.": "Creates a new contact list.",
"Finds contact by email address.": "Finds contact by email address.",
"Finds contact by phone number.": "Finds contact by phone number.",
"Finds for contact list based on name.": "Finds for contact list based on name.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Messages": "Messages",
"To": "To",
"Message Body": "Message Body",
"Subject": "Subject",
"From": "From",
"Media URL": "Media URL",
"Contact List ID": "Contact List ID",
"Phone Number": "Phone Number",
"Email Address": "Email Address",
"First Name": "名字",
"Last Name": "名字",
"Company Name": "Company Name",
"Address Line 1": "Address Line 1",
"Address Line 2": "Address Line 2",
"City": "City",
"State/Province": "State/Province",
"Postal Code": "Postal Code",
"Country": "Country",
"Contact ID": "Contact ID",
"List Name": "List Name",
"Search": "搜索",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The phone number (with country code, e.g., +1234567890)": "The phone number (with country code, e.g., +1234567890)",
"The body of the message to send": "The body of the message to send",
"The URL of the media file to send (image, video, etc.)": "The URL of the media file to send (image, video, etc.)",
"The phone number of the contact": "The phone number of the contact",
"The email address of the contact": "The email address of the contact",
"The first name of the contact": "The first name of the contact",
"The last name of the contact": "The last name of the contact",
"The company name of the contact": "The company name of the contact",
"The first line of the address": "The first line of the address",
"The second line of the address": "The second line of the address",
"The city of the contact": "The city of the contact",
"The state/province of the contact": "The state/province of the contact",
"The postal code of the contact": "The postal code of the contact",
"The country of the contact": "The country of the contact",
"The email address": "The email address",
"Search by list name.": "Search by list name.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Incoming SMS": "New Incoming SMS",
"Triggers when a new SMS message is received.": "Triggers when a new SMS message is received."
}

View File

@@ -0,0 +1,77 @@
import {
createCustomApiCallAction,
HttpMethod,
} from '@activepieces/pieces-common';
import { PieceAuth, createPiece } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { clicksendSendSmsAction } from './lib/action/send-sms';
import { clicksendSendMms } from './lib/action/send-mms';
import { clicksendCreateContactAction } from './lib/action/create-contact';
import { clicksendUpdateContactAction } from './lib/action/update-contact';
import { clicksendDeleteContactAction } from './lib/action/delete-contact';
import { clicksendCreateContactListAction } from './lib/action/create-contact-list';
import { clicksendFindContactByEmailAction } from './lib/action/search-contact-by-email';
import { clicksendFindContactByPhoneAction } from './lib/action/search-contact-by-phone';
import { clicksendFindContactListAction } from './lib/action/search-contact-lists';
import { clicksendNewIncomingSms } from './lib/trigger/new-incoming-sms';
import { callClickSendApi } from './lib/common';
export const clicksendAuth = PieceAuth.BasicAuth({
description: `You can get your API credentials by clicking 'API Credentials' on the top right of the dashboard.`,
required: true,
username: {
displayName: 'Username',
description: 'Your ClickSend username',
},
password: {
displayName: 'API Key',
description: 'Your ClickSend API key',
},
validate: async ({ auth }) => {
try {
await callClickSendApi({
method: HttpMethod.GET,
path: '/account',
username: auth.username,
password: auth.password,
});
return { valid: true };
} catch {
return { valid: false, error: 'Invalid Credentials.' };
}
},
});
export const clicksend = createPiece({
displayName: 'ClickSend SMS',
description:
'Cloud-based messaging platform for sending SMS, MMS, voice, email, and more.',
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/clicksend.png',
auth: clicksendAuth,
categories: [PieceCategory.COMMUNICATION],
actions: [
clicksendSendSmsAction,
clicksendSendMms,
clicksendCreateContactAction,
clicksendUpdateContactAction,
clicksendDeleteContactAction,
clicksendCreateContactListAction,
clicksendFindContactByEmailAction,
clicksendFindContactByPhoneAction,
clicksendFindContactListAction,
createCustomApiCallAction({
baseUrl: () => 'https://rest.clicksend.com/v3',
auth: clicksendAuth,
authMapping: async (auth) => ({
Authorization: `Basic ${Buffer.from(
`${(auth as { username: string }).username}:${
(auth as { password: string }).password
}`
).toString('base64')}`,
}),
}),
],
authors: ['sparkybug'],
triggers: [clicksendNewIncomingSms],
});

View File

@@ -0,0 +1,43 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi } from '../common';
import { clicksendAuth } from '../..';
export const clicksendCreateContactListAction = createAction({
auth: clicksendAuth,
name: 'create_contact_list',
description: 'Creates a new contact list.',
displayName: 'Create Contact List',
props: {
list_name: Property.ShortText({
displayName: 'List Name',
required: true,
}),
},
async run(context) {
const { list_name } = context.propsValue;
if (!list_name || list_name.trim().length === 0) {
throw new Error('List name must not be empty.');
}
const username = context.auth.username;
const password = context.auth.password;
const listData = {
list_name: list_name,
};
try {
const response = await callClickSendApi({
method: HttpMethod.POST,
path: '/lists',
username,
password,
body: listData,
});
return response.body;
} catch (error: any) {
if (error?.response?.body?.response_code === 'ALREADY_EXISTS') {
throw new Error('A contact list with this name already exists.');
}
throw error;
}
},
});

View File

@@ -0,0 +1,128 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
function isValidPhone(phone: string) {
return /^\+?[1-9]\d{1,14}$/.test(phone);
}
function isValidEmail(email: string) {
return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email);
}
export const clicksendCreateContactAction = createAction({
auth: clicksendAuth,
name: 'create_contact',
description: 'Creates a new contact in a contact list.',
displayName: 'Create Contact',
props: {
contact_list_id: clicksendCommon.contact_list_id,
phone_number: Property.ShortText({
description: 'The phone number of the contact',
displayName: 'Phone Number',
required: true,
}),
email: Property.ShortText({
description: 'The email address of the contact',
displayName: 'Email Address',
required: false,
}),
first_name: Property.ShortText({
description: 'The first name of the contact',
displayName: 'First Name',
required: false,
}),
last_name: Property.ShortText({
description: 'The last name of the contact',
displayName: 'Last Name',
required: false,
}),
company_name: Property.ShortText({
description: 'The company name of the contact',
displayName: 'Company Name',
required: false,
}),
address_line_1: Property.ShortText({
description: 'The first line of the address',
displayName: 'Address Line 1',
required: false,
}),
address_line_2: Property.ShortText({
description: 'The second line of the address',
displayName: 'Address Line 2',
required: false,
}),
city: Property.ShortText({
description: 'The city of the contact',
displayName: 'City',
required: false,
}),
state: Property.ShortText({
description: 'The state/province of the contact',
displayName: 'State/Province',
required: false,
}),
postal_code: Property.ShortText({
description: 'The postal code of the contact',
displayName: 'Postal Code',
required: false,
}),
country: Property.ShortText({
description: 'The country of the contact',
displayName: 'Country',
required: false,
}),
},
async run(context) {
const {
contact_list_id,
phone_number,
email,
first_name,
last_name,
company_name,
address_line_1,
address_line_2,
city,
state,
postal_code,
country,
} = context.propsValue;
if (!phone_number || !isValidPhone(phone_number)) {
throw new Error('A valid phone number is required.');
}
if (email && !isValidEmail(email)) {
throw new Error('Invalid email address.');
}
const username = context.auth.username;
const password = context.auth.password;
const contactData = {
phone_number,
...(email && { email }),
...(first_name && { first_name }),
...(last_name && { last_name }),
...(company_name && { company_name }),
...(address_line_1 && { address_line_1 }),
...(address_line_2 && { address_line_2 }),
...(city && { city }),
...(state && { state }),
...(postal_code && { postal_code }),
...(country && { country }),
};
try {
const response = await callClickSendApi({
method: HttpMethod.POST,
path: `/lists/${contact_list_id}/contacts`,
username,
password,
body: contactData,
});
return response.body;
} catch (error: any) {
if (error?.response?.body?.response_code === 'ALREADY_EXISTS') {
throw new Error('Contact already exists in this list.');
}
throw error;
}
},
});

View File

@@ -0,0 +1,37 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
export const clicksendDeleteContactAction = createAction({
auth: clicksendAuth,
name: 'delete_contact',
description: 'Deletes a contact from a contact list.',
displayName: 'Delete Contact',
props: {
contact_list_id: clicksendCommon.contact_list_id,
contact_id: clicksendCommon.contact_id,
},
async run(context) {
const { contact_id,contact_list_id } = context.propsValue;
const username = context.auth.username;
const password = context.auth.password;
try {
await callClickSendApi({
method: HttpMethod.DELETE,
path: `/lists/${contact_list_id}/contacts/${contact_id}`,
username,
password,
});
return { success: true, message: 'Contact deleted.' };
} catch (error: any) {
if (error?.response?.status === 404) {
throw new Error('Contact not found.');
}
if (error?.response?.status === 403) {
throw new Error('Permission denied.');
}
throw error;
}
},
});

View File

@@ -0,0 +1,64 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
function isValidEmail(email: string) {
return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email);
}
export const clicksendFindContactByEmailAction = createAction({
auth: clicksendAuth,
name: 'find_contact_by_email',
description: 'Finds contact by email address.',
displayName: 'Find Contact by Email',
props: {
contact_list_id: clicksendCommon.contact_list_id,
email: clicksendCommon.email,
},
async run(context) {
const { contact_list_id, email } = context.propsValue;
if (!isValidEmail(email)) {
throw new Error('Invalid email address.');
}
const username = context.auth.username;
const password = context.auth.password;
let currentPage = 1;
let hasNext = true;
do {
const response = await callClickSendApi<{
data: {
next_page_url?: string;
data: { email: string }[];
};
}>({
method: HttpMethod.GET,
username,
password,
path: `/lists/${contact_list_id}/contacts`,
query: { page: currentPage.toString(), limit: '100' },
});
const items = response.body.data?.data ?? [];
const matched = items.find((item) => item.email === email);
if (matched) {
return {
found: true,
data: matched,
};
}
currentPage++;
hasNext = !!response.body.data?.next_page_url;
} while (hasNext);
return {
found: false,
data: {},
};
},
});

View File

@@ -0,0 +1,63 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
function isValidPhone(phone: string) {
return /^\+?[1-9]\d{1,14}$/.test(phone);
}
export const clicksendFindContactByPhoneAction = createAction({
auth: clicksendAuth,
name: 'find_contact_by_phone',
description: 'Finds contact by phone number.',
displayName: 'Find Contact by Phone',
props: {
contact_list_id: clicksendCommon.contact_list_id,
phone_number: clicksendCommon.phone_number,
},
async run(context) {
const { contact_list_id, phone_number } = context.propsValue;
if (!isValidPhone(phone_number)) {
throw new Error('Invalid phone number.');
}
const username = context.auth.username;
const password = context.auth.password;
let currentPage = 1;
let hasNext = true;
do {
const response = await callClickSendApi<{
data: {
next_page_url?: string;
data: { phone_number: string }[];
};
}>({
method: HttpMethod.GET,
username,
password,
path: `/lists/${contact_list_id}/contacts`,
query: { page: currentPage.toString(), limit: '100' },
});
const items = response.body.data?.data ?? [];
const matched = items.find((item) => item.phone_number === phone_number);
if (matched) {
return {
found: true,
data: matched,
};
}
currentPage++;
hasNext = !!response.body.data?.next_page_url;
} while (hasNext);
return {
found: false,
data: {},
};
},
});

View File

@@ -0,0 +1,59 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi } from '../common';
import { clicksendAuth } from '../..';
export const clicksendFindContactListAction = createAction({
auth: clicksendAuth,
name: 'find_contact_lists',
description: 'Finds for contact list based on name.',
displayName: 'Find Contact List',
props: {
search: Property.ShortText({
displayName: 'Search',
description: 'Search by list name.',
required: true,
}),
},
async run(context) {
const { search } = context.propsValue;
const username = context.auth.username;
const password = context.auth.password;
let currentPage = 1;
let hasNext = true;
do {
const response = await callClickSendApi<{
data: {
next_page_url?: string;
data: { list_id: number; list_name: string }[];
};
}>({
method: HttpMethod.GET,
username,
password,
path: '/lists',
query: { page: currentPage.toString(), limit: '100' },
});
const items = response.body.data?.data ?? [];
const matched = items.find((item) => item.list_name === search);
if (matched) {
return {
found: true,
data: matched,
};
}
currentPage++;
hasNext = !!response.body.data?.next_page_url;
} while (hasNext);
return {
found: false,
data: {},
};
},
});

View File

@@ -0,0 +1,81 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
export const clicksendSendMms = createAction({
auth: clicksendAuth,
name: 'send_mms',
description: 'Send one or more MMS messages.',
displayName: 'Send MMS',
props: {
to: Property.ShortText({
description: 'The phone number (with country code, e.g., +1234567890)',
displayName: 'To',
required: true,
}),
body: Property.ShortText({
description: 'The body of the message to send',
displayName: 'Message Body',
required: true,
}),
subject: Property.ShortText({
displayName: 'Subject',
required: true,
}),
from: clicksendCommon.sender_id,
media_url: Property.ShortText({
description: 'The URL of the media file to send (image, video, etc.)',
displayName: 'Media URL',
required: true,
}),
},
async run(context) {
const {
to,
body,
from,
media_url,
subject,
} = context.propsValue;
const username = context.auth.username;
const password = context.auth.password;
// Validate each message
if (!to || !body || !media_url) {
throw new Error(
'Each message must have a recipient (to), body, and media_url.'
);
}
try {
const response = await callClickSendApi({
method: HttpMethod.POST,
path: '/mms/send',
username,
password,
body: {
media_file:media_url,
messages:[{
subject,
from,
body,
to}
]
},
});
return response.body;
} catch (error: any) {
// Handle ClickSend API errors and provide meaningful feedback
if (error?.response?.body?.response_msg) {
throw new Error(
`ClickSend API error: ${error.response.body.response_msg}`
);
}
throw error;
}
},
});

View File

@@ -0,0 +1,109 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi } from '../common';
import { clicksendAuth } from '../..';
export const clicksendSendSmsAction = createAction({
auth: clicksendAuth,
name: 'send_sms',
description: 'Send one or more SMS messages.',
displayName: 'Send SMS',
props: {
messages: Property.Array({
displayName: 'Messages',
required: true,
properties: {
to: Property.ShortText({
description:
'The phone number (with country code, e.g., +1234567890)',
displayName: 'To',
required: true,
}),
body: Property.ShortText({
description: 'The body of the message to send',
displayName: 'Message Body',
required: true,
}),
from: Property.ShortText({
description:
'The sender name or number (must be approved in ClickSend).',
displayName: 'From',
required: false,
}),
custom_string: Property.ShortText({
description: 'A custom string for tracking the message',
displayName: 'Custom String',
required: false,
}),
country: Property.ShortText({
description: 'Country code (for compliance)',
displayName: 'Country',
required: false,
}),
message_expiry: Property.Number({
description: 'How long (in minutes) the message is valid for.',
displayName: 'Message Expiry (minutes)',
required: false,
}),
priority: Property.Checkbox({
description: 'Send as high priority',
displayName: 'Priority',
required: false,
})
},
}),
},
async run(context) {
const messages = (context.propsValue.messages as Message[]) ?? [];
if (!Array.isArray(messages) || messages.length === 0) {
throw new Error('At least one message must be provided.');
}
const username = context.auth.username;
const password = context.auth.password;
// Map messages to ClickSend API format, ensuring all optional fields are included if provided
const messageData = {
messages: messages.map((msg: Message) => {
const {
to,
body,
from,
custom_string,
country,
message_expiry,
priority,
} = msg;
return {
to,
body,
...(from && { from }),
...(custom_string && { custom_string }),
...(country && { country }),
...(message_expiry && { message_expiry }),
...(priority !== undefined ? { priority } : {}),
};
}),
};
const response = await callClickSendApi({
method: HttpMethod.POST,
path: '/sms/send',
username,
password,
body: messageData,
});
return response.body;
},
});
type Message = {
to: string;
body: string;
from?: string;
custom_string?: string;
country?: string;
message_expiry?: number;
priority?: boolean;
list_id?: number;
};

View File

@@ -0,0 +1,134 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi, clicksendCommon } from '../common';
import { clicksendAuth } from '../..';
function isValidPhone(phone: string) {
return /^\+?[1-9]\d{1,14}$/.test(phone);
}
function isValidEmail(email: string) {
return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email);
}
export const clicksendUpdateContactAction = createAction({
auth: clicksendAuth,
name: 'update_contact',
description: 'Updates an existing contact in a contact list.',
displayName: 'Update Contact',
props: {
contact_list_id: clicksendCommon.contact_list_id,
contact_id: clicksendCommon.contact_id,
phone_number: Property.ShortText({
description: 'The phone number of the contact',
displayName: 'Phone Number',
required: false,
}),
email: Property.ShortText({
description: 'The email address of the contact',
displayName: 'Email Address',
required: false,
}),
first_name: Property.ShortText({
description: 'The first name of the contact',
displayName: 'First Name',
required: false,
}),
last_name: Property.ShortText({
description: 'The last name of the contact',
displayName: 'Last Name',
required: false,
}),
company_name: Property.ShortText({
description: 'The company name of the contact',
displayName: 'Company Name',
required: false,
}),
address_line_1: Property.ShortText({
description: 'The first line of the address',
displayName: 'Address Line 1',
required: false,
}),
address_line_2: Property.ShortText({
description: 'The second line of the address',
displayName: 'Address Line 2',
required: false,
}),
city: Property.ShortText({
description: 'The city of the contact',
displayName: 'City',
required: false,
}),
state: Property.ShortText({
description: 'The state/province of the contact',
displayName: 'State/Province',
required: false,
}),
postal_code: Property.ShortText({
description: 'The postal code of the contact',
displayName: 'Postal Code',
required: false,
}),
country: Property.ShortText({
description: 'The country of the contact',
displayName: 'Country',
required: false,
}),
},
async run(context) {
const {
contact_id,
phone_number,
email,
first_name,
last_name,
company_name,
address_line_1,
address_line_2,
city,
state,
postal_code,
contact_list_id,
country,
} = context.propsValue;
if (phone_number && !isValidPhone(phone_number)) {
throw new Error('Invalid phone number.');
}
if (email && !isValidEmail(email)) {
throw new Error('Invalid email address.');
}
const username = context.auth.username;
const password = context.auth.password;
const contactData = {
...(phone_number && { phone_number }),
...(email && { email }),
...(first_name && { first_name }),
...(last_name && { last_name }),
...(company_name && { company_name }),
...(address_line_1 && { address_line_1 }),
...(address_line_2 && { address_line_2 }),
...(city && { city }),
...(state && { state }),
...(postal_code && { postal_code }),
...(country && { country }),
};
try {
const response= await callClickSendApi({
method: HttpMethod.PUT,
path: `/lists/${contact_list_id}/contacts/${contact_id}`,
username,
password,
body: contactData,
});
return response.body;
} catch (error: any) {
if (error?.response?.status === 404) {
throw new Error('Contact not found.');
}
if (error?.response?.status === 403) {
throw new Error('Permission denied.');
}
throw error;
}
},
});

View File

@@ -0,0 +1,193 @@
import {
Property,
PiecePropValueSchema,
DropdownOption,
} from '@activepieces/pieces-framework';
import {
HttpMethod,
HttpMessageBody,
httpClient,
AuthenticationType,
QueryParams,
} from '@activepieces/pieces-common';
import { clicksendAuth } from '../..';
export const clicksendCommon = {
phone_number: Property.ShortText({
description: 'The phone number (with country code, e.g., +1234567890)',
displayName: 'Phone Number',
required: true,
}),
email: Property.ShortText({
description: 'The email address',
displayName: 'Email Address',
required: true,
}),
contact_list_id: Property.Dropdown({
auth: clicksendAuth,
displayName: 'Contact List ID',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const authValue = auth;
const options: DropdownOption<number>[] = [];
let currentPage = 1;
let hasNext = true;
do {
const response = await callClickSendApi<{
data: {
next_page_url?: string;
data: { list_id: number; list_name: string }[];
};
}>({
method: HttpMethod.GET,
username: authValue.username,
password: authValue.password,
path: '/lists',
query: { page: currentPage.toString(), limit: '100' },
});
const items = response.body.data?.data ?? [];
for (const list of items) {
options.push({ label: list.list_name, value: list.list_id });
}
currentPage++;
hasNext = !!response.body.data?.next_page_url;
} while (hasNext);
return {
disabled: false,
options,
};
},
}),
contact_id: Property.Dropdown({
auth: clicksendAuth,
displayName: 'Contact ID',
required: true,
refreshers: ['contact_list_id'],
options: async ({ auth, contact_list_id }) => {
if (!auth || !contact_list_id) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const authValue = auth;
const options: DropdownOption<number>[] = [];
let currentPage = 1;
let hasNext = true;
do {
const response = await callClickSendApi<{
data: {
next_page_url?: string;
data: { contact_id: number; email: string }[];
};
}>({
method: HttpMethod.GET,
username: authValue.username,
password: authValue.password,
path: `/lists/${contact_list_id}/contacts`,
query: { page: currentPage.toString(), limit: '100' },
});
const items = response.body.data?.data ?? [];
for (const contact of items) {
options.push({ label: contact.email, value: contact.contact_id });
}
currentPage++;
hasNext = !!response.body.data?.next_page_url;
} while (hasNext);
return {
disabled: false,
options,
};
},
}),
sender_id: Property.Dropdown({
auth: clicksendAuth,
displayName: 'From',
refreshers: [],
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const authValue = auth;
const response = await callClickSendApi<{
data: { user_id: number; username: string };
}>({
method: HttpMethod.GET,
path: '/account',
username: authValue.username,
password: authValue.password,
});
return {
disabled: false,
options: [
{
label: response.body.data.username,
value: response.body.data.user_id,
},
],
};
},
}),
};
interface clickSendApiParams {
method: HttpMethod;
username: string;
password: string;
path: string;
query?: QueryParams;
body?: any;
}
export async function callClickSendApi<T extends HttpMessageBody>(
params: clickSendApiParams
) {
return await httpClient.sendRequest<T>({
method: params.method,
url: `https://rest.clicksend.com/v3${params.path}`,
authentication: {
type: AuthenticationType.BASIC,
username: params.username,
password: params.password,
},
headers: {
'Content-Type': 'application/json',
},
body: params.body,
queryParams: params.query,
});
}

View File

@@ -0,0 +1,86 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { callClickSendApi } from '../common';
import { clicksendAuth } from '../..';
import { isNil } from '@activepieces/shared';
const TRIGGER_KEY = 'new_incoming_sms_trigger';
export const clicksendNewIncomingSms = createTrigger({
auth: clicksendAuth,
name: 'new_incoming_sms',
displayName: 'New Incoming SMS',
description: 'Triggers when a new SMS message is received.',
props: {},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const username = context.auth.username;
const password = context.auth.password;
const response = await callClickSendApi<{
data: { inbound_rule_id: number };
}>({
method: HttpMethod.POST,
username,
password,
path: '/automations/sms/inbound',
body: {
dedicated_number: '*',
rule_name: 'AP Incoming SMS',
message_search_type: 0,
message_search_term: null,
action: 'URL',
action_address: context.webhookUrl,
enabled: 1,
webhook_type: 'json',
},
});
await context.store.put<number>(
TRIGGER_KEY,
response.body.data.inbound_rule_id
);
},
async onDisable(context) {
const username = context.auth.username;
const password = context.auth.password;
const webhookId = await context.store.get<number>(TRIGGER_KEY);
if (!isNil(webhookId)) {
await callClickSendApi({
method: HttpMethod.DELETE,
username,
password,
path: `/automations/sms/inbound/${webhookId}`,
});
}
},
async run(context) {
return [context.payload.body];
},
sampleData: {
message_id: '12345678',
status: 'RECEIVED',
message_timestamp: 1644321600,
message_time: '2022-02-08 01:00:00',
message_to: '+1234567890',
message_from: '+0987654321',
message_body: 'Hello from ClickSend!',
message_direction: 'in',
message_type: 'sms',
message_parts: 1,
message_cost: '0.0250',
from_email: null,
list_id: null,
custom_string: null,
contact_id: null,
user_id: 12345,
subaccount_id: null,
country: 'US',
carrier: 'Verizon',
first_name: 'John',
last_name: 'Doe',
email: 'john.doe@example.com',
},
});