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:
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Twilio": "Twilio",
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"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 to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud-Kommunikationsplattform zum Erstellen von SMS, Voice & Messaging-Anwendungen",
|
||||
"Account SID": "SID Konto",
|
||||
"The account SID to use to connect to Twilio": "Die SID zum Verbinden mit Twilio",
|
||||
"Auth token": "Auth Token",
|
||||
"The auth token to use to connect to Twilio": "Das Authentifizierungs-Token zum Verbinden mit Twilio",
|
||||
"The authentication to use to connect to Twilio": "Die Authentifizierung zum Verbinden mit Twilio",
|
||||
"Send SMS": "SMS senden",
|
||||
"Phone Number Lookup": "Telefonnummersuche",
|
||||
"Call Phone": "Telefon anrufen",
|
||||
"Get Message": "Nachricht erhalten",
|
||||
"Download Recording Media": "Aufzeichnungsmedien herunterladen",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Send a new SMS message": "Eine neue SMS-Nachricht senden",
|
||||
"Lookup information about a phone number.": "Suchen Sie Informationen über eine Telefonnummer.",
|
||||
"Call a number and say a message.": "Rufen Sie eine Nummer an und sagen Sie eine Nachricht.",
|
||||
"Retrieves the details of a specific message.": "Ruft die Details einer bestimmten Nachricht ab.",
|
||||
"Download the media file for a specific recording.": "Laden Sie die Mediendatei für eine bestimmte Aufnahme herunter.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"From": "Von",
|
||||
"Message Body": "Nachrichtentext",
|
||||
"To": "An",
|
||||
"Phone Number": "Telefonnummer",
|
||||
"Message to Say": "Zu sagende Nachricht",
|
||||
"Voice": "Stimme",
|
||||
"Language": "Sprache",
|
||||
"Send DTMF Tones": "DTMF Töne senden",
|
||||
"Timeout (seconds)": "Timeout (Sekunden)",
|
||||
"Message SID": "Nachricht SID",
|
||||
"Recording SID": "Aufzeichnung SID",
|
||||
"Format": "Format",
|
||||
"Channels": "Kanäle",
|
||||
"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 to send the message from": "Die Telefonnummer, von der die Nachricht gesendet wird",
|
||||
"The body of the message to send": "Der Inhalt der zu sendenden Nachricht",
|
||||
"The phone number to send the message to": "Die Telefonnummer, an die die Nachricht gesendet werden soll",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "Die zu anrufende Telefonnummer. Muss im E.164-Format sein (z.B. +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "Die Textnachricht wird in Sprache umgewandelt und mit dem Empfänger gesprochen.",
|
||||
"The voice to use for the text-to-speech message.": "Die zu verwendende Stimme für die Text-zu-Sprach-Nachricht.",
|
||||
"The language to use for the text-to-speech message.": "Die Sprache, die für die Text-zu-Sprache verwendet werden soll.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "Eine Zeichenfolge von Tasten, die nach dem Anruf gewählt werden soll. Verwenden Sie 'w' für eine halbe Sekunde Pause.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "Die Anzahl der Sekunden, um den Telefonring zu lassen, bevor keine Antwort angenommen wird. Standard ist 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "Der eindeutige Identifikator (SID) der zu holenden Nachricht. Er beginnt mit \"SM\" oder \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "Der eindeutige Identifikator (SID) der zu ladenden Aufzeichnung. Er beginnt mit \"RE\".",
|
||||
"The desired audio format for the download file.": "Das gewünschte Audioformat für die Downloaddatei.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Legen Sie fest, ob eine Mono-oder Zwei-Kanal-Datei heruntergeladen werden soll. Hinweis: Dual-Channel ist möglicherweise nicht für alle Aufnahmen verfügbar.",
|
||||
"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..",
|
||||
"Alice (Default)": "Alice (Standard)",
|
||||
"Man": "Mann",
|
||||
"Woman": "Frau",
|
||||
"English (US)": "Englisch (USA)",
|
||||
"English (UK)": "Englisch (UK)",
|
||||
"Spanish": "Spanisch",
|
||||
"French": "Französisch",
|
||||
"German": "Deutsch",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Mono",
|
||||
"Dual": "Duell",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New Incoming SMS": "Neue eingehende SMS",
|
||||
"New Phone Number": "Neue Telefonnummer",
|
||||
"New Recording": "Neue Aufnahme",
|
||||
"New Transcription": "Neue Transkription",
|
||||
"New Call": "Neuer Anruf",
|
||||
"Triggers when a new SMS message is received": "Wird ausgelöst, wenn eine neue SMS empfangen wird",
|
||||
"Triggers when you add a new phone number to your account.": "Wird ausgelöst, wenn Sie Ihrem Konto eine neue Telefonnummer hinzufügen.",
|
||||
"Triggers when a new call recording is completed and available.": "Wird ausgelöst, wenn eine neue Anrufaufnahme abgeschlossen und verfügbar ist.",
|
||||
"Triggers when a new call recording transcription is completed.": "Wird ausgelöst, wenn eine neue Transkription der Anrufaufzeichnung abgeschlossen ist.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Wird ausgelöst, wenn ein Anruf abgeschlossen ist (ein- oder ausgehend)."
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Plataforma de comunicaciones en la nube para construir aplicaciones SMS, Voz y mensajería",
|
||||
"Account SID": "Cuenta SID",
|
||||
"The account SID to use to connect to Twilio": "El SID de la cuenta a usar para conectarse a Twilio",
|
||||
"Auth token": "Token Auth",
|
||||
"The auth token to use to connect to Twilio": "El token de autenticación a usar para conectarse a Twilio",
|
||||
"The authentication to use to connect to Twilio": "La autenticación a usar para conectarse a Twilio",
|
||||
"Send SMS": "Enviar SMS",
|
||||
"Phone Number Lookup": "Búsqueda de número de teléfono",
|
||||
"Call Phone": "Llamar al teléfono",
|
||||
"Get Message": "Obtener mensaje",
|
||||
"Download Recording Media": "Descargar medios de grabación",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Send a new SMS message": "Enviar un nuevo mensaje SMS",
|
||||
"Lookup information about a phone number.": "Información de búsqueda sobre un número de teléfono.",
|
||||
"Call a number and say a message.": "Llamar a un número y decir un mensaje.",
|
||||
"Retrieves the details of a specific message.": "Devuelve los detalles de un mensaje específico.",
|
||||
"Download the media file for a specific recording.": "Descargue el archivo multimedia para una grabación específica.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"From": "De",
|
||||
"Message Body": "Cuerpo",
|
||||
"To": "A",
|
||||
"Phone Number": "Número de teléfono",
|
||||
"Message to Say": "Mensaje a decir",
|
||||
"Voice": "Voz",
|
||||
"Language": "Idioma",
|
||||
"Send DTMF Tones": "Enviar tonos DTMF",
|
||||
"Timeout (seconds)": "Tiempo agotado (segundos)",
|
||||
"Message SID": "Mensaje SID",
|
||||
"Recording SID": "Grabando SID",
|
||||
"Format": "Formatear",
|
||||
"Channels": "Canales",
|
||||
"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 to send the message from": "El número de teléfono desde el que enviar el mensaje",
|
||||
"The body of the message to send": "El cuerpo del mensaje a enviar",
|
||||
"The phone number to send the message to": "El número de teléfono al que enviar el mensaje",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "El número de teléfono para llamar. Debe estar en formato E.164 (por ejemplo, +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "El mensaje de texto que se convertirá en voz y se hablará con el destinatario.",
|
||||
"The voice to use for the text-to-speech message.": "La voz a usar para el mensaje de texto a voz.",
|
||||
"The language to use for the text-to-speech message.": "El idioma a usar para el mensaje de texto a voz.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "Una cadena de teclas para marcar después de la llamada está conectada. Use 'w' para una pausa de medio segundo.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "El número de segundos para dejar que el teléfono llame antes de asumir ninguna respuesta. Por defecto es 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "El identificador único (SID) del mensaje a recuperar. Comienza con \"SM\" o \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "El identificador único (SID) de la grabación a descargar. Empieza con \"RE\".",
|
||||
"The desired audio format for the download file.": "El formato de audio deseado para el archivo de descarga.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Especifique si desea descargar un archivo mono o de canal dual. Nota: es posible que el doble canal no esté disponible para todas las grabaciones.",
|
||||
"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.",
|
||||
"Alice (Default)": "Alicia (por defecto)",
|
||||
"Man": "Hombre",
|
||||
"Woman": "Mujer",
|
||||
"English (US)": "Inglés (US)",
|
||||
"English (UK)": "Inglés (UK)",
|
||||
"Spanish": "Español",
|
||||
"French": "Francés",
|
||||
"German": "Alemán",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Mono",
|
||||
"Dual": "Doble",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New Incoming SMS": "Nuevo SMS entrante",
|
||||
"New Phone Number": "Nuevo número de teléfono",
|
||||
"New Recording": "Nueva grabación",
|
||||
"New Transcription": "Nueva Transcripción",
|
||||
"New Call": "Nueva llamada",
|
||||
"Triggers when a new SMS message is received": "Dispara cuando se recibe un nuevo mensaje SMS",
|
||||
"Triggers when you add a new phone number to your account.": "Desencadena cuando agregas un nuevo número de teléfono a tu cuenta.",
|
||||
"Triggers when a new call recording is completed and available.": "Se activa cuando una nueva grabación de llamadas se completa y está disponible.",
|
||||
"Triggers when a new call recording transcription is completed.": "Se activa cuando se completa una nueva transcripción de la grabación de llamadas.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Se activa cuando se completa una llamada (entrante o saliente)."
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Plateforme de communication dans le Cloud pour construire des applications SMS, Voix et Messagerie",
|
||||
"Account SID": "SID du compte client",
|
||||
"The account SID to use to connect to Twilio": "Le compte SID à utiliser pour se connecter à Twilio",
|
||||
"Auth token": "Jeton d'authentification",
|
||||
"The auth token to use to connect to Twilio": "Le jeton d'authentification à utiliser pour se connecter à Twilio",
|
||||
"The authentication to use to connect to Twilio": "L'authentification à utiliser pour se connecter à Twilio",
|
||||
"Send SMS": "Envoyer un SMS",
|
||||
"Phone Number Lookup": "Recherche de numéro de téléphone",
|
||||
"Call Phone": "Appelez le téléphone",
|
||||
"Get Message": "Obtenir le message",
|
||||
"Download Recording Media": "Télécharger le média d’enregistrement",
|
||||
"Custom API Call": "Appel d'API personnalisé",
|
||||
"Send a new SMS message": "Envoyer un nouveau message SMS",
|
||||
"Lookup information about a phone number.": "Rechercher des informations sur un numéro de téléphone.",
|
||||
"Call a number and say a message.": "Appelez un numéro et dites un message.",
|
||||
"Retrieves the details of a specific message.": "Récupère les détails d'un message spécifique.",
|
||||
"Download the media file for a specific recording.": "Télécharger le fichier média pour un enregistrement spécifique.",
|
||||
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
|
||||
"From": "A partir de",
|
||||
"Message Body": "Corps du message",
|
||||
"To": "À",
|
||||
"Phone Number": "Numéro de téléphone",
|
||||
"Message to Say": "Message à Say",
|
||||
"Voice": "Voix",
|
||||
"Language": "Langue",
|
||||
"Send DTMF Tones": "Envoyer des tonalités DTMF",
|
||||
"Timeout (seconds)": "Délai d'attente (secondes)",
|
||||
"Message SID": "SID du message",
|
||||
"Recording SID": "SID d'enregistrement",
|
||||
"Format": "Formater",
|
||||
"Channels": "Canaux",
|
||||
"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'expiration (en secondes)",
|
||||
"The phone number to send the message from": "Le numéro de téléphone depuis lequel envoyer le message",
|
||||
"The body of the message to send": "Le corps du message à envoyer",
|
||||
"The phone number to send the message to": "Le numéro de téléphone pour envoyer le message à",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "Le numéro de téléphone à appeler. Doit être au format E.164 (par exemple, +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "Le message texte à convertir en discours et à parler au destinataire.",
|
||||
"The voice to use for the text-to-speech message.": "La voix à utiliser pour le message de synthèse vocale.",
|
||||
"The language to use for the text-to-speech message.": "La langue à utiliser pour le message de synthèse vocale.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "Une chaîne de touches à composer après la connexion de l'appel. Utilisez 'w' pour une pause d'une demi-seconde.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "Le nombre de secondes pour laisser sonner le téléphone avant d'assumer aucune réponse. La valeur par défaut est 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "L'identifiant unique (SID) du message à récupérer. Il commence par \"SM\" ou \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "L'identifiant unique (SID) de l'enregistrement à télécharger. Il commence par \"RE\".",
|
||||
"The desired audio format for the download file.": "Le format audio souhaité pour le fichier de téléchargement.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Indique si vous voulez télécharger un fichier mono ou dual-canal. Note : Il est possible que le double canal ne soit pas disponible pour tous les enregistrements.",
|
||||
"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.",
|
||||
"Alice (Default)": "Alice (par défaut)",
|
||||
"Man": "Homme",
|
||||
"Woman": "Femme",
|
||||
"English (US)": "Anglais (US)",
|
||||
"English (UK)": "Anglais (Royaume-Uni)",
|
||||
"Spanish": "Espagnol",
|
||||
"French": "Français",
|
||||
"German": "Allemand",
|
||||
"MP3": "Mp3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Mono",
|
||||
"Dual": "Dual",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Incoming SMS": "Nouveau SMS entrant",
|
||||
"New Phone Number": "Nouveau numéro de téléphone",
|
||||
"New Recording": "Nouvel enregistrement",
|
||||
"New Transcription": "Nouvelle transcription",
|
||||
"New Call": "Nouvel appel",
|
||||
"Triggers when a new SMS message is received": "Déclenche quand un nouveau SMS est reçu",
|
||||
"Triggers when you add a new phone number to your account.": "Déclenche lorsque vous ajoutez un nouveau numéro de téléphone à votre compte.",
|
||||
"Triggers when a new call recording is completed and available.": "Déclenche quand un nouvel enregistrement d'appel est terminé et disponible.",
|
||||
"Triggers when a new call recording transcription is completed.": "Déclenche quand une nouvelle transcription d'enregistrement d'appel est terminée.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Déclenche quand un appel se termine (entrant ou sortant)."
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Twilio": "Twilio",
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"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 to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Twilio": "Twilio",
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"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 to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "SMS、音声およびメッセージングアプリケーションを構築するためのクラウド通信プラットフォーム",
|
||||
"Account SID": "アカウント SID",
|
||||
"The account SID to use to connect to Twilio": "Twilio に接続するために使用するアカウント SID",
|
||||
"Auth token": "認証トークン",
|
||||
"The auth token to use to connect to Twilio": "Twilio に接続するために使用する認証トークン",
|
||||
"The authentication to use to connect to Twilio": "Twilio に接続するために使用する認証",
|
||||
"Send SMS": "SMSの送信",
|
||||
"Phone Number Lookup": "電話番号検索",
|
||||
"Call Phone": "電話に発信",
|
||||
"Get Message": "メッセージを受け取る",
|
||||
"Download Recording Media": "録画メディアをダウンロード",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Send a new SMS message": "新しいSMSメッセージを送信",
|
||||
"Lookup information about a phone number.": "電話番号に関する情報を検索します。",
|
||||
"Call a number and say a message.": "電話番号を呼んでメッセージを言う。",
|
||||
"Retrieves the details of a specific message.": "特定のメッセージの詳細を取得します。",
|
||||
"Download the media file for a specific recording.": "特定の録画用のメディア ファイルをダウンロードします。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"From": "差出人:",
|
||||
"Message Body": "メッセージ本文",
|
||||
"To": "終了日",
|
||||
"Phone Number": "電話番号",
|
||||
"Message to Say": "メッセージを送信する",
|
||||
"Voice": "音声",
|
||||
"Language": "言語",
|
||||
"Send DTMF Tones": "DTMFトーンを送信",
|
||||
"Timeout (seconds)": "タイムアウト (秒)",
|
||||
"Message SID": "Message SID",
|
||||
"Recording SID": "録音SID(録音)",
|
||||
"Format": "書式",
|
||||
"Channels": "チャンネル",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"The phone number to send the message from": "メッセージを送信する電話番号",
|
||||
"The body of the message to send": "送信するメッセージの本文",
|
||||
"The phone number to send the message to": "メッセージを送信する電話番号",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "電話番号。E.164形式(例:+15558675310)でなければなりません。",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "テキストメッセージは、スピーチに変換され、受信者に話されます。",
|
||||
"The voice to use for the text-to-speech message.": "テキスト読み上げメッセージに使用する音声。",
|
||||
"The language to use for the text-to-speech message.": "テキスト読み上げメッセージに使用する言語",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "通話が接続された後にダイヤルするキーの文字列。半秒の一時停止には「w」を使用してください。",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "電話に応答を出さないようにする秒数。既定値は 60 です。",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "取得するメッセージの一意の識別子 (SID) 。「SM」または「MM」で始まります。",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "ダウンロードする記録の一意の識別子 (SID) 。「RE」で始まります。",
|
||||
"The desired audio format for the download file.": "ダウンロードファイルに必要なオーディオ形式。",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "モノラルファイルまたはデュアルチャンネルファイルをダウンロードするかどうかを指定します。注意: デュアル・チャンネルはすべての録音で使用できない場合があります。",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"Alice (Default)": "アリス(デフォルト)",
|
||||
"Man": "男",
|
||||
"Woman": "女性",
|
||||
"English (US)": "英語 (米国)",
|
||||
"English (UK)": "英語 (英国)",
|
||||
"Spanish": "スペイン語",
|
||||
"French": "フランス語",
|
||||
"German": "ドイツ語",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "モノラル",
|
||||
"Dual": "Dual",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New Incoming SMS": "新しいSMS着信",
|
||||
"New Phone Number": "新しい電話番号",
|
||||
"New Recording": "新しい録音",
|
||||
"New Transcription": "新しい表記記号",
|
||||
"New Call": "新しい通話",
|
||||
"Triggers when a new SMS message is received": "新しいSMSメッセージを受信したときにトリガーします",
|
||||
"Triggers when you add a new phone number to your account.": "アカウントに新しい電話番号を追加するとトリガーします。",
|
||||
"Triggers when a new call recording is completed and available.": "新しい通話録音が完了し、利用可能になったときにトリガーします。",
|
||||
"Triggers when a new call recording transcription is completed.": "新しい通話録音が完了したときにトリガーします。",
|
||||
"Triggers when a call completes (incoming or outgoing).": "呼び出しが完了したとき(着信または発信)にトリガーします。"
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communicatie platform voor het maken van SMS, Voice & Messaging applicaties",
|
||||
"Account SID": "Klant SID",
|
||||
"The account SID to use to connect to Twilio": "De account SID om te gebruiken om te verbinden met Twilio",
|
||||
"Auth token": "Authenticatie token",
|
||||
"The auth token to use to connect to Twilio": "De authenticatietoken die gebruikt moet worden om te verbinden met Twilio",
|
||||
"The authentication to use to connect to Twilio": "De authenticatie om te gebruiken om verbinding te maken met Twilio",
|
||||
"Send SMS": "Sms verzenden",
|
||||
"Phone Number Lookup": "Telefoonnummer opzoeken",
|
||||
"Call Phone": "Telefoon bellen",
|
||||
"Get Message": "Bericht opvragen",
|
||||
"Download Recording Media": "Opname van media downloaden",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Een nieuw SMS-bericht verzenden",
|
||||
"Lookup information about a phone number.": "Zoek informatie over een telefoonnummer.",
|
||||
"Call a number and say a message.": "Bel een nummer en zeg een bericht.",
|
||||
"Retrieves the details of a specific message.": "Ophalen van de details van een specifiek bericht.",
|
||||
"Download the media file for a specific recording.": "Download het mediabestand voor een specifieke opname.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"From": "van",
|
||||
"Message Body": "Bericht Body",
|
||||
"To": "tot",
|
||||
"Phone Number": "Telefoon nummer",
|
||||
"Message to Say": "Bericht naar Zeg",
|
||||
"Voice": "Stem",
|
||||
"Language": "Taal",
|
||||
"Send DTMF Tones": "Stuur DTMF Tonen",
|
||||
"Timeout (seconds)": "Time-out (seconden)",
|
||||
"Message SID": "Bericht SID",
|
||||
"Recording SID": "Opname SID",
|
||||
"Format": "Formatteren",
|
||||
"Channels": "Kanalen",
|
||||
"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 to send the message from": "Het telefoonnummer van waaruit een bericht moet worden verstuurd",
|
||||
"The body of the message to send": "De inhoud van het te verzenden bericht",
|
||||
"The phone number to send the message to": "Het telefoonnummer waar het bericht naartoe moet worden gestuurd",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "Het telefoonnummer om te bellen. Moet in E.164-formaat zijn (bijv. +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "Het tekstbericht dat naar spraak moet worden omgezet en naar de ontvanger wordt gesproken.",
|
||||
"The voice to use for the text-to-speech message.": "De stem die moet worden gebruikt voor het tekst-naar-spraak bericht.",
|
||||
"The language to use for the text-to-speech message.": "De taal die moet worden gebruikt voor het tekst-naar-spraak bericht.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "Een reeks sleutels om te bellen nadat de oproep is verbonden. Gebruik 'w' voor een halve pauze.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "Het aantal seconden om de telefoon te laten bellen voor het aannemen van geen antwoord. Standaard is 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "De unieke id van het op te halen bericht. Het begint met \"SM\" of \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "De unieke id van de te downloaden opname (SID). Het begint met \"RE\".",
|
||||
"The desired audio format for the download file.": "Het gewenste audioformaat voor het downloadbestand.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Specificeer of een mono of dual-kanaal bestand moet worden gedownload. Opmerking: Dual-kanaal is mogelijk niet beschikbaar voor alle opnames.",
|
||||
"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..",
|
||||
"Alice (Default)": "Alice (standaard)",
|
||||
"Man": "Handmatig",
|
||||
"Woman": "Vrouw",
|
||||
"English (US)": "Engels (VS)",
|
||||
"English (UK)": "Engels (UK)",
|
||||
"Spanish": "Spaans",
|
||||
"French": "Frans",
|
||||
"German": "Duits",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WV",
|
||||
"Mono": "Monochroom",
|
||||
"Dual": "Dubbel",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New Incoming SMS": "Nieuwe inkomende SMS",
|
||||
"New Phone Number": "Nieuw telefoonnummer",
|
||||
"New Recording": "Nieuwe opname",
|
||||
"New Transcription": "Nieuwe transcriptie",
|
||||
"New Call": "Nieuwe oproep",
|
||||
"Triggers when a new SMS message is received": "Triggert wanneer een nieuw SMS-bericht wordt ontvangen",
|
||||
"Triggers when you add a new phone number to your account.": "Triggert wanneer je een nieuw telefoonnummer aan je account toevoegt.",
|
||||
"Triggers when a new call recording is completed and available.": "Triggert wanneer een nieuwe gespreksopname is voltooid en beschikbaar.",
|
||||
"Triggers when a new call recording transcription is completed.": "Activeert wanneer een nieuwe gespreksopname is voltooid.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Triggert wanneer een oproep wordt uitgevoerd (binnenkomende of uitgaande oproep)."
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Plataforma de comunicações na nuvem para construir aplicativos de SMS, voz e mensagens",
|
||||
"Account SID": "SID da Conta",
|
||||
"The account SID to use to connect to Twilio": "O SID da conta a ser usada para conectar ao Twilio",
|
||||
"Auth token": "Token de autenticação",
|
||||
"The auth token to use to connect to Twilio": "O token de autenticação para conectar ao Twilio",
|
||||
"The authentication to use to connect to Twilio": "A autenticação para conectar ao Twilio",
|
||||
"Send SMS": "Enviar SMS",
|
||||
"Phone Number Lookup": "Pesquisar números de telefone",
|
||||
"Call Phone": "Telefone de Chamada",
|
||||
"Get Message": "Obter mensagem",
|
||||
"Download Recording Media": "Baixar Mídia de Gravação",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Send a new SMS message": "Enviar uma nova mensagem SMS",
|
||||
"Lookup information about a phone number.": "Procurar informações sobre um número de telefone.",
|
||||
"Call a number and say a message.": "Ligue para um número e diga uma mensagem.",
|
||||
"Retrieves the details of a specific message.": "Recupera os detalhes de uma mensagem específica.",
|
||||
"Download the media file for a specific recording.": "Baixe o arquivo de mídia para uma gravação específica.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"From": "De",
|
||||
"Message Body": "Corpo da Mensagem",
|
||||
"To": "Para",
|
||||
"Phone Number": "Número de telefone",
|
||||
"Message to Say": "Mensagem a enviar",
|
||||
"Voice": "Voz",
|
||||
"Language": "IDIOMA",
|
||||
"Send DTMF Tones": "Enviar Tons DTMF",
|
||||
"Timeout (seconds)": "Tempo limite (segundos)",
|
||||
"Message SID": "SID da mensagem",
|
||||
"Recording SID": "Gravando SID",
|
||||
"Format": "Formato",
|
||||
"Channels": "Canais",
|
||||
"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 to send the message from": "Número de telefone de onde enviar a mensagem",
|
||||
"The body of the message to send": "O corpo da mensagem a enviar",
|
||||
"The phone number to send the message to": "Número de telefone para enviar a mensagem",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "O número de telefone a ser chamado. Deve estar no formato E.164 (ex: +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "A mensagem de texto a ser convertida em fala e falada com o destinatário.",
|
||||
"The voice to use for the text-to-speech message.": "A voz a ser usada para a mensagem de conversão de texto.",
|
||||
"The language to use for the text-to-speech message.": "O idioma a ser usado na mensagem de conversão de texto.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "Uma sequência de caracteres de teclas para discar após a chamada ser conectada. Use 'w' para uma meia segunda pausa.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "O número de segundos para deixar o telefone tocar antes de não responder. O padrão é 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "O identificador único (SID) da mensagem para recuperar. Começa com \"SM\" ou \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "O identificador único (SID) da gravação para download. Ele começa com \"RE\".",
|
||||
"The desired audio format for the download file.": "Formato de áudio desejado para o arquivo de download.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Especifique se deseja baixar um arquivo de canal duplo ou mono. Nota: canal duplo pode não estar disponível para todas as gravações.",
|
||||
"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..",
|
||||
"Alice (Default)": "Alice (Padrão)",
|
||||
"Man": "Homem",
|
||||
"Woman": "Mulher",
|
||||
"English (US)": "Português Brasileiro (pt-BR)",
|
||||
"English (UK)": "Inglês (Reino Unido)",
|
||||
"Spanish": "espanhol",
|
||||
"French": "francês",
|
||||
"German": "alemão",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Monocromático",
|
||||
"Dual": "Duplo",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New Incoming SMS": "Novo SMS de entrada",
|
||||
"New Phone Number": "Novo número de telefone",
|
||||
"New Recording": "Nova Gravação",
|
||||
"New Transcription": "Nova Transcrição",
|
||||
"New Call": "Nova Ligação",
|
||||
"Triggers when a new SMS message is received": "Aciona quando uma nova mensagem SMS é recebida",
|
||||
"Triggers when you add a new phone number to your account.": "Aciona quando você adiciona um novo número de telefone à sua conta.",
|
||||
"Triggers when a new call recording is completed and available.": "Dispara quando uma nova gravação de chamadas for concluída e disponível.",
|
||||
"Triggers when a new call recording transcription is completed.": "Dispara quando uma nova transcrição da gravação de chamadas for concluída.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Dispara quando uma chamada é concluída (entrada ou saída)."
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Twilio": "Твилио",
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Облачная платформа связи для создания приложений, связанных с SMS, голосовой связью и сообщениями",
|
||||
"Account SID": "SID клиента",
|
||||
"The account SID to use to connect to Twilio": "SID аккаунта для подключения к Twilio",
|
||||
"Auth token": "Токен аутентификации",
|
||||
"The auth token to use to connect to Twilio": "Токен авторизации, используемый для подключения к Twilio",
|
||||
"The authentication to use to connect to Twilio": "Аутентификация, используемая для подключения к Twilio",
|
||||
"Send SMS": "Отправить СМС",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Send a new SMS message": "Отправить новое SMS-сообщение",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"From": "От",
|
||||
"Message Body": "Тело сообщения",
|
||||
"To": "Кому",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"The phone number to send the message from": "Номер телефона для отправки сообщения от",
|
||||
"The body of the message to send": "Тело сообщения для отправки",
|
||||
"The phone number to send the message to": "Номер телефона для отправки сообщения",
|
||||
"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-сообщения"
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Phone Number Lookup": "Phone Number Lookup",
|
||||
"Call Phone": "Call Phone",
|
||||
"Get Message": "Get Message",
|
||||
"Download Recording Media": "Download Recording Media",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Lookup information about a phone number.": "Lookup information about a phone number.",
|
||||
"Call a number and say a message.": "Call a number and say a message.",
|
||||
"Retrieves the details of a specific message.": "Retrieves the details of a specific message.",
|
||||
"Download the media file for a specific recording.": "Download the media file for a specific recording.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"Phone Number": "Phone Number",
|
||||
"Message to Say": "Message to Say",
|
||||
"Voice": "Voice",
|
||||
"Language": "Language",
|
||||
"Send DTMF Tones": "Send DTMF Tones",
|
||||
"Timeout (seconds)": "Timeout (seconds)",
|
||||
"Message SID": "Message SID",
|
||||
"Recording SID": "Recording SID",
|
||||
"Format": "Format",
|
||||
"Channels": "Channels",
|
||||
"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 to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "The phone number to call. Must be in E.164 format (e.g., +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "The text message to be converted to speech and spoken to the recipient.",
|
||||
"The voice to use for the text-to-speech message.": "The voice to use for the text-to-speech message.",
|
||||
"The language to use for the text-to-speech message.": "The language to use for the text-to-speech message.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "A string of keys to dial after the call is connected. Use 'w' for a half-second pause.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "The number of seconds to let the phone ring before assuming no answer. Default is 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "The unique identifier (SID) of the recording to download. It starts with \"RE\".",
|
||||
"The desired audio format for the download file.": "The desired audio format for the download file.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.",
|
||||
"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..",
|
||||
"Alice (Default)": "Alice (Default)",
|
||||
"Man": "Man",
|
||||
"Woman": "Woman",
|
||||
"English (US)": "English (US)",
|
||||
"English (UK)": "English (UK)",
|
||||
"Spanish": "Spanish",
|
||||
"French": "French",
|
||||
"German": "German",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Mono",
|
||||
"Dual": "Dual",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Incoming SMS": "New Incoming SMS",
|
||||
"New Phone Number": "New Phone Number",
|
||||
"New Recording": "New Recording",
|
||||
"New Transcription": "New Transcription",
|
||||
"New Call": "New Call",
|
||||
"Triggers when a new SMS message is received": "Triggers when a new SMS message is received",
|
||||
"Triggers when you add a new phone number to your account.": "Triggers when you add a new phone number to your account.",
|
||||
"Triggers when a new call recording is completed and available.": "Triggers when a new call recording is completed and available.",
|
||||
"Triggers when a new call recording transcription is completed.": "Triggers when a new call recording transcription is completed.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Triggers when a call completes (incoming or outgoing)."
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Twilio": "Twilio",
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"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 to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"Cloud communications platform for building SMS, Voice & Messaging applications": "Cloud communications platform for building SMS, Voice & Messaging applications",
|
||||
"Account SID": "Account SID",
|
||||
"The account SID to use to connect to Twilio": "The account SID to use to connect to Twilio",
|
||||
"Auth token": "Auth token",
|
||||
"The auth token to use to connect to Twilio": "The auth token to use to connect to Twilio",
|
||||
"The authentication to use to connect to Twilio": "The authentication to use to connect to Twilio",
|
||||
"Send SMS": "Send SMS",
|
||||
"Phone Number Lookup": "Phone Number Lookup",
|
||||
"Call Phone": "Call Phone",
|
||||
"Get Message": "Get Message",
|
||||
"Download Recording Media": "Download Recording Media",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Send a new SMS message": "Send a new SMS message",
|
||||
"Lookup information about a phone number.": "Lookup information about a phone number.",
|
||||
"Call a number and say a message.": "Call a number and say a message.",
|
||||
"Retrieves the details of a specific message.": "Retrieves the details of a specific message.",
|
||||
"Download the media file for a specific recording.": "Download the media file for a specific recording.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"From": "From",
|
||||
"Message Body": "Message Body",
|
||||
"To": "To",
|
||||
"Phone Number": "Phone Number",
|
||||
"Message to Say": "Message to Say",
|
||||
"Voice": "Voice",
|
||||
"Language": "Language",
|
||||
"Send DTMF Tones": "Send DTMF Tones",
|
||||
"Timeout (seconds)": "Timeout (seconds)",
|
||||
"Message SID": "Message SID",
|
||||
"Recording SID": "Recording SID",
|
||||
"Format": "Format",
|
||||
"Channels": "Channels",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"The phone number to send the message from": "The phone number to send the message from",
|
||||
"The body of the message to send": "The body of the message to send",
|
||||
"The phone number to send the message to": "The phone number to send the message to",
|
||||
"The phone number to call. Must be in E.164 format (e.g., +15558675310).": "The phone number to call. Must be in E.164 format (e.g., +15558675310).",
|
||||
"The text message to be converted to speech and spoken to the recipient.": "The text message to be converted to speech and spoken to the recipient.",
|
||||
"The voice to use for the text-to-speech message.": "The voice to use for the text-to-speech message.",
|
||||
"The language to use for the text-to-speech message.": "The language to use for the text-to-speech message.",
|
||||
"A string of keys to dial after the call is connected. Use 'w' for a half-second pause.": "A string of keys to dial after the call is connected. Use 'w' for a half-second pause.",
|
||||
"The number of seconds to let the phone ring before assuming no answer. Default is 60.": "The number of seconds to let the phone ring before assuming no answer. Default is 60.",
|
||||
"The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".": "The unique identifier (SID) of the message to retrieve. It starts with \"SM\" or \"MM\".",
|
||||
"The unique identifier (SID) of the recording to download. It starts with \"RE\".": "The unique identifier (SID) of the recording to download. It starts with \"RE\".",
|
||||
"The desired audio format for the download file.": "The desired audio format for the download file.",
|
||||
"Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.": "Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Alice (Default)": "Alice (Default)",
|
||||
"Man": "Man",
|
||||
"Woman": "Woman",
|
||||
"English (US)": "English (US)",
|
||||
"English (UK)": "English (UK)",
|
||||
"Spanish": "Spanish",
|
||||
"French": "French",
|
||||
"German": "German",
|
||||
"MP3": "MP3",
|
||||
"WAV": "WAV",
|
||||
"Mono": "Mono",
|
||||
"Dual": "Dual",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New Incoming SMS": "New Incoming SMS",
|
||||
"New Phone Number": "New Phone Number",
|
||||
"New Recording": "New Recording",
|
||||
"New Transcription": "New Transcription",
|
||||
"New Call": "New Call",
|
||||
"Triggers when a new SMS message is received": "Triggers when a new SMS message is received",
|
||||
"Triggers when you add a new phone number to your account.": "Triggers when you add a new phone number to your account.",
|
||||
"Triggers when a new call recording is completed and available.": "Triggers when a new call recording is completed and available.",
|
||||
"Triggers when a new call recording transcription is completed.": "Triggers when a new call recording transcription is completed.",
|
||||
"Triggers when a call completes (incoming or outgoing).": "Triggers when a call completes (incoming or outgoing)."
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
import { PieceAuth, createPiece } from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { twilioSendSms } from './lib/action/send-sms';
|
||||
import { twilioNewIncomingSms } from './lib/trigger/new-incoming-sms';
|
||||
import { twilioPhoneNumberLookup } from './lib/action/phone-number-lookup';
|
||||
import { twilioMakeCall } from './lib/action/make-call';
|
||||
import { twilioGetMessage } from './lib/action/get-message';
|
||||
import { twilioDownloadRecordingMedia } from './lib/action/download-recording-media';
|
||||
import { twilioNewPhoneNumber } from './lib/trigger/new-phone-number';
|
||||
import { twilioNewRecording } from './lib/trigger/new-recording';
|
||||
import { twilioNewTranscription } from './lib/trigger/new-transcription';
|
||||
import { twilioNewCall } from './lib/trigger/new-call';
|
||||
|
||||
export const twilioAuth = PieceAuth.BasicAuth({
|
||||
description: 'The authentication to use to connect to Twilio',
|
||||
|
||||
required: true,
|
||||
username: {
|
||||
displayName: 'Account SID',
|
||||
description: 'The account SID to use to connect to Twilio',
|
||||
},
|
||||
password: {
|
||||
displayName: 'Auth token',
|
||||
description: 'The auth token to use to connect to Twilio',
|
||||
},
|
||||
});
|
||||
|
||||
export const twilio = createPiece({
|
||||
displayName: 'Twilio',
|
||||
description:
|
||||
'Cloud communications platform for building SMS, Voice & Messaging applications',
|
||||
|
||||
minimumSupportedRelease: '0.30.0',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/twilio.png',
|
||||
auth: twilioAuth,
|
||||
categories: [PieceCategory.COMMUNICATION],
|
||||
actions: [
|
||||
twilioSendSms,
|
||||
twilioPhoneNumberLookup,
|
||||
twilioMakeCall,
|
||||
twilioGetMessage,
|
||||
twilioDownloadRecordingMedia,
|
||||
createCustomApiCallAction({
|
||||
baseUrl: () => 'https://api.twilio.com/2010-04-01',
|
||||
auth: twilioAuth,
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Basic ${Buffer.from(
|
||||
`${auth.username}:${
|
||||
auth.password
|
||||
}`
|
||||
).toString('base64')}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
authors: ["kishanprmr","MoShizzle","khaledmashaly","abuaboud"],
|
||||
triggers: [twilioNewIncomingSms,
|
||||
twilioNewPhoneNumber,
|
||||
twilioNewRecording,
|
||||
twilioNewTranscription,
|
||||
twilioNewCall
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod, httpClient, AuthenticationType, QueryParams } from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioDownloadRecordingMedia = createAction({
|
||||
auth: twilioAuth,
|
||||
name: 'download_recording_media',
|
||||
displayName: 'Download Recording Media',
|
||||
description: 'Download the media file for a specific recording.',
|
||||
props: {
|
||||
recording_sid: Property.ShortText({
|
||||
displayName: 'Recording SID',
|
||||
description: 'The unique identifier (SID) of the recording to download. It starts with "RE".',
|
||||
required: true,
|
||||
}),
|
||||
format: Property.StaticDropdown({
|
||||
displayName: 'Format',
|
||||
description: 'The desired audio format for the download file.',
|
||||
required: false,
|
||||
defaultValue: 'mp3',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'MP3', value: 'mp3' },
|
||||
{ label: 'WAV', value: 'wav' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
channels: Property.StaticDropdown({
|
||||
displayName: 'Channels',
|
||||
description: 'Specify whether to download a mono or dual-channel file. Note: Dual-channel may not be available for all recordings.',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Mono', value: 1 },
|
||||
{ label: 'Dual', value: 2 },
|
||||
]
|
||||
}
|
||||
})
|
||||
},
|
||||
async run(context) {
|
||||
const { recording_sid, format, channels } = context.propsValue;
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
|
||||
const fileFormat = format ?? 'mp3';
|
||||
const path = `Recordings/${recording_sid}.${fileFormat}`;
|
||||
|
||||
const queryParams: QueryParams = {};
|
||||
if (channels) {
|
||||
queryParams['RequestedChannels'] = channels.toString();
|
||||
}
|
||||
|
||||
const response = await httpClient.sendRequest<ArrayBuffer>({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com/2010-04-01/Accounts/${account_sid}/${path}`,
|
||||
queryParams: queryParams,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
responseType: 'arraybuffer',
|
||||
});
|
||||
|
||||
const fileData = Buffer.from(response.body);
|
||||
|
||||
return await context.files.write({
|
||||
fileName: `${recording_sid}.${fileFormat}`,
|
||||
data: fileData,
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,33 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { callTwilioApi } from '../common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioGetMessage = createAction({
|
||||
auth: twilioAuth,
|
||||
name: 'get_message',
|
||||
description: 'Retrieves the details of a specific message.',
|
||||
displayName: 'Get Message',
|
||||
props: {
|
||||
message_sid: Property.ShortText({
|
||||
displayName: 'Message SID',
|
||||
description: 'The unique identifier (SID) of the message to retrieve. It starts with "SM" or "MM".',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { message_sid } = context.propsValue;
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
|
||||
const path = `Messages/${message_sid}.json`;
|
||||
|
||||
const response = await callTwilioApi(
|
||||
HttpMethod.GET,
|
||||
path,
|
||||
{ account_sid, auth_token }
|
||||
);
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,99 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { callTwilioApi, twilioCommon } from '../common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioMakeCall = createAction({
|
||||
auth: twilioAuth,
|
||||
name: 'make_call',
|
||||
description: 'Call a number and say a message.',
|
||||
displayName: 'Call Phone',
|
||||
props: {
|
||||
from: twilioCommon.phone_number,
|
||||
to: Property.ShortText({
|
||||
displayName: 'To',
|
||||
description: 'The phone number to call. Must be in E.164 format (e.g., +15558675310).',
|
||||
required: true,
|
||||
}),
|
||||
message: Property.LongText({
|
||||
displayName: 'Message to Say',
|
||||
description: 'The text message to be converted to speech and spoken to the recipient.',
|
||||
required: true,
|
||||
}),
|
||||
voice: Property.StaticDropdown({
|
||||
displayName: 'Voice',
|
||||
description: 'The voice to use for the text-to-speech message.',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Alice (Default)', value: 'alice' },
|
||||
{ label: 'Man', value: 'man' },
|
||||
{ label: 'Woman', value: 'woman' },
|
||||
]
|
||||
}
|
||||
}),
|
||||
language: Property.StaticDropdown({
|
||||
displayName: 'Language',
|
||||
description: 'The language to use for the text-to-speech message.',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'English (US)', value: 'en-US' },
|
||||
{ label: 'English (UK)', value: 'en-GB' },
|
||||
{ label: 'Spanish', value: 'es-ES' },
|
||||
{ label: 'French', value: 'fr-FR' },
|
||||
{ label: 'German', value: 'de-DE' },
|
||||
]
|
||||
}
|
||||
}),
|
||||
sendDigits: Property.ShortText({
|
||||
displayName: 'Send DTMF Tones',
|
||||
description: "A string of keys to dial after the call is connected. Use 'w' for a half-second pause.",
|
||||
required: false,
|
||||
}),
|
||||
timeout: Property.Number({
|
||||
displayName: 'Timeout (seconds)',
|
||||
description: 'The number of seconds to let the phone ring before assuming no answer. Default is 60.',
|
||||
required: false,
|
||||
})
|
||||
},
|
||||
async run(context) {
|
||||
const { from, to, message, voice, language, sendDigits, timeout } = context.propsValue;
|
||||
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
|
||||
// Construct TwiML for the <Say> verb
|
||||
const voiceAttr = voice ? ` voice="${voice}"` : '';
|
||||
const langAttr = language ? ` language="${language}"` : '';
|
||||
const escapedMessage = message
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
const twiml = `<Response><Say${voiceAttr}${langAttr}>${escapedMessage}</Say></Response>`;
|
||||
|
||||
const bodyParams: Record<string, unknown> = {
|
||||
From: from,
|
||||
To: to,
|
||||
Twiml: twiml,
|
||||
};
|
||||
|
||||
if (sendDigits) {
|
||||
bodyParams['SendDigits'] = sendDigits;
|
||||
}
|
||||
if (timeout) {
|
||||
bodyParams['Timeout'] = timeout;
|
||||
}
|
||||
|
||||
const response = await callTwilioApi(
|
||||
HttpMethod.POST,
|
||||
'Calls.json',
|
||||
{ account_sid, auth_token },
|
||||
bodyParams
|
||||
);
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,37 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioPhoneNumberLookup = createAction({
|
||||
auth: twilioAuth,
|
||||
name: 'phone_number_lookup',
|
||||
description: 'Lookup information about a phone number.',
|
||||
displayName: 'Phone Number Lookup',
|
||||
props: {
|
||||
phone_number:Property.ShortText({
|
||||
displayName:'Phone Number',
|
||||
required:true
|
||||
})
|
||||
},
|
||||
async run(context) {
|
||||
const { phone_number } = context.propsValue;
|
||||
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method:HttpMethod.GET,
|
||||
url:`https://lookups.twilio.com/v2/PhoneNumbers/${encodeURIComponent(phone_number)}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
queryParams:{
|
||||
Fields:'line_type_intelligence'
|
||||
}
|
||||
})
|
||||
|
||||
return response.body
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { callTwilioApi, twilioCommon } from '../common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioSendSms = createAction({
|
||||
auth: twilioAuth,
|
||||
name: 'send_sms',
|
||||
description: 'Send a new SMS message',
|
||||
displayName: 'Send SMS',
|
||||
props: {
|
||||
from: twilioCommon.phone_number,
|
||||
body: Property.ShortText({
|
||||
description: 'The body of the message to send',
|
||||
displayName: 'Message Body',
|
||||
required: true,
|
||||
}),
|
||||
to: Property.ShortText({
|
||||
description: 'The phone number to send the message to',
|
||||
displayName: 'To',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { body, to, from } = context.propsValue;
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
return await callTwilioApi(
|
||||
HttpMethod.POST,
|
||||
'Messages.json',
|
||||
{ account_sid, auth_token },
|
||||
{
|
||||
From: from,
|
||||
Body: body,
|
||||
To: to,
|
||||
}
|
||||
);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,69 @@
|
||||
import {
|
||||
Property,
|
||||
BasicAuthPropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
HttpMethod,
|
||||
HttpMessageBody,
|
||||
httpClient,
|
||||
AuthenticationType,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioCommon = {
|
||||
phone_number: Property.Dropdown({
|
||||
auth: twilioAuth,
|
||||
description: 'The phone number to send the message from',
|
||||
displayName: 'From',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'connect your account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
const basicAuthProperty = auth;
|
||||
const response = await callTwilioApi<{
|
||||
incoming_phone_numbers: {
|
||||
phone_number: string;
|
||||
friendly_name: string;
|
||||
}[];
|
||||
}>(HttpMethod.GET, 'IncomingPhoneNumbers.json', {
|
||||
account_sid: basicAuthProperty.username,
|
||||
auth_token: basicAuthProperty.password,
|
||||
});
|
||||
return {
|
||||
disabled: false,
|
||||
options: response.body.incoming_phone_numbers.map((number: any) => ({
|
||||
value: number.phone_number,
|
||||
label: number.friendly_name,
|
||||
})),
|
||||
};
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
export const callTwilioApi = async <T extends HttpMessageBody>(
|
||||
method: HttpMethod,
|
||||
path: string,
|
||||
auth: { account_sid: string; auth_token: string },
|
||||
body?: any
|
||||
) => {
|
||||
return await httpClient.sendRequest<T>({
|
||||
method,
|
||||
url: `https://api.twilio.com/2010-04-01/Accounts/${auth.account_sid}/${path}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: auth.account_sid,
|
||||
password: auth.auth_token,
|
||||
},
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: body,
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,153 @@
|
||||
import { createTrigger, TriggerStrategy, PiecePropValueSchema, AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
|
||||
import { twilioAuth } from '../..';
|
||||
import { AuthenticationType, DedupeStrategy, httpClient, HttpMethod, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
|
||||
interface Call {
|
||||
sid: string;
|
||||
status: string;
|
||||
direction: string;
|
||||
from: string;
|
||||
to: string;
|
||||
start_time: string;
|
||||
end_time: string;
|
||||
duration: string;
|
||||
price: string;
|
||||
price_unit: string;
|
||||
date_created:string
|
||||
}
|
||||
|
||||
interface CallsResponse {
|
||||
calls: Call[];
|
||||
next_page_uri:string
|
||||
|
||||
}
|
||||
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof twilioAuth>,
|
||||
Record<string, unknown>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
async items({ auth, lastFetchEpochMS }) {
|
||||
const isTest = lastFetchEpochMS === 0;
|
||||
const account_sid = auth.username;
|
||||
const auth_token = auth.password;
|
||||
|
||||
let currentUri:
|
||||
| string
|
||||
| null = `/2010-04-01/Accounts/${account_sid}/Calls.json?PageSize=${
|
||||
isTest ? 1 : 1000
|
||||
}`;
|
||||
|
||||
const results = [];
|
||||
let stop = false;
|
||||
|
||||
do {
|
||||
const response: any = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com${currentUri}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
});
|
||||
|
||||
const payload = response.body as CallsResponse;
|
||||
|
||||
const calls = payload.calls ?? [];
|
||||
|
||||
for (const call of calls) {
|
||||
const ts = new Date(call.date_created).getTime();
|
||||
|
||||
if(call.status !== 'completed') continue;
|
||||
|
||||
if (isTest || ts > lastFetchEpochMS) {
|
||||
results.push(call);
|
||||
} else {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isTest) break;
|
||||
currentUri = payload?.next_page_uri ?? null;
|
||||
} while (currentUri && !stop);
|
||||
|
||||
return results.map((call) => {
|
||||
return {
|
||||
epochMilliSeconds: new Date(call.date_created).getTime(),
|
||||
data: call,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export const twilioNewCall = createTrigger({
|
||||
auth: twilioAuth,
|
||||
name: 'new_call',
|
||||
displayName: 'New Call',
|
||||
description: 'Triggers when a call completes (incoming or outgoing).',
|
||||
props: {},
|
||||
sampleData:{
|
||||
"account_sid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"answered_by": "machine_start",
|
||||
"api_version": "2010-04-01",
|
||||
"caller_name": "callerid1",
|
||||
"date_created": "Fri, 18 Oct 2019 17:00:00 +0000",
|
||||
"date_updated": "Fri, 18 Oct 2019 17:01:00 +0000",
|
||||
"direction": "outbound-api",
|
||||
"duration": "4",
|
||||
"end_time": "Fri, 18 Oct 2019 17:03:00 +0000",
|
||||
"forwarded_from": "calledvia1",
|
||||
"from": "+13051416799",
|
||||
"from_formatted": "(305) 141-6799",
|
||||
"group_sid": "GPdeadbeefdeadbeefdeadbeefdeadbeef",
|
||||
"parent_call_sid": "CAdeadbeefdeadbeefdeadbeefdeadbeef",
|
||||
"phone_number_sid": "PNdeadbeefdeadbeefdeadbeefdeadbeef",
|
||||
"price": "-0.200",
|
||||
"price_unit": "USD",
|
||||
"sid": "CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"start_time": "Fri, 18 Oct 2019 17:02:00 +0000",
|
||||
"status": "completed",
|
||||
"subresource_uris": {
|
||||
"notifications": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Notifications.json",
|
||||
"recordings": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings.json",
|
||||
"payments": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Payments.json",
|
||||
"events": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Events.json",
|
||||
"siprec": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Siprec.json",
|
||||
"streams": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Streams.json",
|
||||
"transcriptions": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Transcriptions.json",
|
||||
"user_defined_message_subscriptions": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/UserDefinedMessageSubscriptions.json",
|
||||
"user_defined_messages": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/UserDefinedMessages.json"
|
||||
},
|
||||
"to": "+13051913581",
|
||||
"to_formatted": "(305) 191-3581",
|
||||
"trunk_sid": "TKdeadbeefdeadbeefdeadbeefdeadbeef",
|
||||
"uri": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json",
|
||||
"queue_time": "1000"
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,120 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
HttpMethod,
|
||||
HttpResponse,
|
||||
httpClient,
|
||||
AuthenticationType,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { callTwilioApi, twilioCommon } from '../common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
export const twilioNewIncomingSms = createTrigger({
|
||||
auth: twilioAuth,
|
||||
name: 'new_incoming_sms',
|
||||
displayName: 'New Incoming SMS',
|
||||
description: 'Triggers when a new SMS message is received',
|
||||
props: {
|
||||
phone_number: twilioCommon.phone_number,
|
||||
},
|
||||
sampleData: {
|
||||
body: 'Hello',
|
||||
num_segments: '1',
|
||||
direction: 'inbound',
|
||||
from: '+12184191735',
|
||||
date_updated: 'Wed, 08 Feb 2023 01:40:51 +0000',
|
||||
price: null,
|
||||
error_message: null,
|
||||
uri: '/2010-04-01/Accounts/ACc0ea1238d61fe90d78a69a3de71d45619/Messages/SM8c3920d3f2ac481ba83e639a69dadd63.json',
|
||||
account_sid: 'ACc0ea716d61fe90d78a123a3de71d45619',
|
||||
num_media: '0',
|
||||
to: '+12184191735',
|
||||
date_created: 'Wed, 08 Feb 2023 01:40:50 +0000',
|
||||
status: 'failed',
|
||||
sid: 'SM8c3920d3f2ac481ba83e639a69dadd63',
|
||||
date_sent: 'Wed, 08 Feb 2023 01:40:51 +0000',
|
||||
messaging_service_sid: 'MG88e323e6a88ce67ba3bf12e1bcb7e0b8',
|
||||
error_code: 21211,
|
||||
price_unit: 'USD',
|
||||
api_version: '2010-04-01',
|
||||
subresource_uris: {
|
||||
media:
|
||||
'/2010-04-01/Accounts/ACc0ea716d61fe90d78a69a3de71d45619/Messages/SM8c3920d3f2ac481ba83e639a69dadd63/Media.json',
|
||||
feedback:
|
||||
'/2010-04-01/Accounts/ACc0ea716d61fe90d78a69a3de71d45619/Messages/SM8c3920d3f2ac481ba83e639a69dadd63/Feedback.json',
|
||||
},
|
||||
},
|
||||
// Twilio API only allows one webhook per phone number, so we need to poll
|
||||
type: TriggerStrategy.POLLING,
|
||||
async onEnable(context) {
|
||||
const { phone_number } = context.propsValue;
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
const response = await callTwilioApi<MessagePaginationResponse>(
|
||||
HttpMethod.GET,
|
||||
`Messages.json?PageSize=20&To=${phone_number}`,
|
||||
{ account_sid, auth_token },
|
||||
{}
|
||||
);
|
||||
await context.store.put<LastMessage>('_new_incoming_sms_trigger', {
|
||||
lastMessageId:
|
||||
response.body.messages.length === 0
|
||||
? null
|
||||
: response.body.messages[0].sid,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await context.store.put('_new_incoming_sms_trigger', null);
|
||||
},
|
||||
async run(context) {
|
||||
const account_sid = context.auth.username;
|
||||
const auth_token = context.auth.password;
|
||||
const newMessages: unknown[] = [];
|
||||
const lastMessage = await context.store.get<LastMessage>(
|
||||
'_new_incoming_sms_trigger'
|
||||
);
|
||||
let currentUri:
|
||||
| string
|
||||
| null = `2010-04-01/Accounts/${account_sid}/Messages.json?PageSize=20&To=${context.propsValue.phone_number}`;
|
||||
let firstMessageId = undefined;
|
||||
while (currentUri !== undefined && currentUri !== null) {
|
||||
const res: HttpResponse<MessagePaginationResponse> =
|
||||
await httpClient.sendRequest<MessagePaginationResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com/${currentUri}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
});
|
||||
const messages = res.body.messages;
|
||||
if (!firstMessageId && messages.length > 0) {
|
||||
firstMessageId = messages[0].sid;
|
||||
}
|
||||
currentUri = res.body.next_page_uri;
|
||||
for (let i = 0; i < messages.length; i++) {
|
||||
const message = messages[i];
|
||||
if (message.sid === lastMessage?.lastMessageId) {
|
||||
currentUri = null;
|
||||
break;
|
||||
}
|
||||
if (message.direction === 'inbound') {
|
||||
newMessages.push(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
await context.store.put<LastMessage>('_new_incoming_sms_trigger', {
|
||||
lastMessageId: firstMessageId ?? lastMessage!.lastMessageId,
|
||||
});
|
||||
return newMessages;
|
||||
},
|
||||
});
|
||||
|
||||
interface LastMessage {
|
||||
lastMessageId: string | null;
|
||||
}
|
||||
|
||||
interface MessagePaginationResponse {
|
||||
messages: { sid: string; to: string; status: string; direction: string }[];
|
||||
next_page_uri: string;
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
import {
|
||||
AppConnectionValueForAuthProperty,
|
||||
createTrigger,
|
||||
PiecePropValueSchema,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
DedupeStrategy,
|
||||
httpClient,
|
||||
HttpMethod,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
// The full structure of an IncomingPhoneNumber object from the Twilio API
|
||||
interface TwilioPhoneNumber {
|
||||
sid: string;
|
||||
account_sid: string;
|
||||
friendly_name: string;
|
||||
phone_number: string;
|
||||
voice_url: string;
|
||||
voice_method: string;
|
||||
sms_url: string;
|
||||
sms_method: string;
|
||||
date_created: string;
|
||||
date_updated: string;
|
||||
capabilities: {
|
||||
voice: boolean;
|
||||
sms: boolean;
|
||||
mms: boolean;
|
||||
};
|
||||
uri: string;
|
||||
}
|
||||
|
||||
interface IncomingPhoneNumbersResponse {
|
||||
incoming_phone_numbers: TwilioPhoneNumber[];
|
||||
next_page_uri:string
|
||||
}
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof twilioAuth>,
|
||||
Record<string, unknown>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
async items({ auth, lastFetchEpochMS }) {
|
||||
const isTest = lastFetchEpochMS === 0;
|
||||
const account_sid = auth.username;
|
||||
const auth_token = auth.password;
|
||||
|
||||
let currentUri:
|
||||
| string
|
||||
| null = `/2010-04-01/Accounts/${account_sid}/IncomingPhoneNumbers.json?PageSize=${
|
||||
isTest ? 10 : 1000
|
||||
}`;
|
||||
|
||||
const results = [];
|
||||
let stop = false;
|
||||
|
||||
do {
|
||||
const response: any = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com${currentUri}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
});
|
||||
|
||||
const payload = response.body as IncomingPhoneNumbersResponse;
|
||||
|
||||
const numbers = payload.incoming_phone_numbers ?? [];
|
||||
|
||||
for (const num of numbers) {
|
||||
const ts = new Date(num.date_created).getTime();
|
||||
|
||||
if (isTest || ts > lastFetchEpochMS) {
|
||||
results.push(num);
|
||||
} else {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isTest) break;
|
||||
currentUri = payload?.next_page_uri ?? null;
|
||||
} while (currentUri && !stop);
|
||||
|
||||
return results.map((num) => {
|
||||
return {
|
||||
epochMilliSeconds: new Date(num.date_created).getTime(),
|
||||
data: num,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export const twilioNewPhoneNumber = createTrigger({
|
||||
auth: twilioAuth,
|
||||
name: 'new_phone_number',
|
||||
displayName: 'New Phone Number',
|
||||
description: 'Triggers when you add a new phone number to your account.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
sid: 'PNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
||||
account_sid: 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
||||
friendly_name: '(555) 123-4567',
|
||||
phone_number: '+15551234567',
|
||||
voice_url: 'https://demo.twilio.com/welcome/voice/',
|
||||
voice_method: 'POST',
|
||||
sms_url: 'https://demo.twilio.com/welcome/sms/',
|
||||
sms_method: 'POST',
|
||||
date_created: '2025-08-28T11:44:10+00:00',
|
||||
date_updated: '2025-08-28T11:44:10+00:00',
|
||||
capabilities: {
|
||||
voice: true,
|
||||
sms: true,
|
||||
mms: true,
|
||||
},
|
||||
uri: '/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/IncomingPhoneNumbers/PNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.json',
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,137 @@
|
||||
import { AppConnectionValueForAuthProperty, createTrigger, PiecePropValueSchema, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { AuthenticationType, DedupeStrategy, httpClient, HttpMethod, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
interface Recording {
|
||||
sid: string;
|
||||
status: string;
|
||||
date_created: string;
|
||||
call_sid: string;
|
||||
duration: string;
|
||||
source: string;
|
||||
price: string;
|
||||
price_unit: string;
|
||||
}
|
||||
|
||||
interface RecordingsResponse {
|
||||
recordings: Recording[];
|
||||
next_page_uri:string
|
||||
|
||||
}
|
||||
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof twilioAuth>,
|
||||
Record<string, unknown>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
async items({ auth, lastFetchEpochMS }) {
|
||||
const isTest = lastFetchEpochMS === 0;
|
||||
const account_sid = auth.username;
|
||||
const auth_token = auth.password;
|
||||
|
||||
let currentUri:
|
||||
| string
|
||||
| null = `/2010-04-01/Accounts/${account_sid}/Recordings.json?PageSize=${
|
||||
isTest ? 10 : 1000
|
||||
}`;
|
||||
|
||||
const results = [];
|
||||
let stop = false;
|
||||
|
||||
do {
|
||||
const response: any = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com${currentUri}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
});
|
||||
|
||||
const payload = response.body as RecordingsResponse;
|
||||
|
||||
const recordings = payload.recordings ?? [];
|
||||
|
||||
for (const recording of recordings) {
|
||||
const ts = new Date(recording.date_created).getTime();
|
||||
|
||||
if (isTest || ts > lastFetchEpochMS) {
|
||||
results.push(recording);
|
||||
} else {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isTest) break;
|
||||
currentUri = payload?.next_page_uri ?? null;
|
||||
} while (currentUri && !stop);
|
||||
|
||||
return results.map((recording) => {
|
||||
return {
|
||||
epochMilliSeconds: new Date(recording.date_created).getTime(),
|
||||
data: recording,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export const twilioNewRecording = createTrigger({
|
||||
auth: twilioAuth,
|
||||
name: 'new_recording',
|
||||
displayName: 'New Recording',
|
||||
description: 'Triggers when a new call recording is completed and available.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
"account_sid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"api_version": "2010-04-01",
|
||||
"call_sid": "CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"conference_sid": "CFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"channels": 1,
|
||||
"date_created": "Fri, 14 Oct 2016 21:56:34 +0000",
|
||||
"date_updated": "Fri, 14 Oct 2016 21:56:38 +0000",
|
||||
"start_time": "Fri, 14 Oct 2016 21:56:34 +0000",
|
||||
"price": "0.04",
|
||||
"price_unit": "USD",
|
||||
"duration": "4",
|
||||
"sid": "REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"source": "StartConferenceRecordingAPI",
|
||||
"status": "completed",
|
||||
"error_code": null,
|
||||
"uri": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings/REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json",
|
||||
"subresource_uris": {
|
||||
"add_on_results": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings/REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/AddOnResults.json",
|
||||
"transcriptions": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings/REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Transcriptions.json"
|
||||
},
|
||||
"encryption_details": {
|
||||
"encryption_public_key_sid": "CRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"encryption_cek": "OV4h6zrsxMIW7h0Zfqwfn6TI2GCNl54KALlg8wn8YB8KYZhXt6HlgvBWAmQTlfYVeLWydMiCewY0YkDDT1xmNe5huEo9vjuKBS5OmYK4CZkSx1NVv3XOGrZHpd2Pl/5WJHVhUK//AUO87uh5qnUP2E0KoLh1nyCLeGcEkXU0RfpPn/6nxjof/n6m6OzZOyeIRK4Oed5+rEtjqFDfqT0EVKjs6JAxv+f0DCc1xYRHl2yV8bahUPVKs+bHYdy4PVszFKa76M/Uae4jFA9Lv233JqWcxj+K2UoghuGhAFbV/JQIIswY2CBYI8JlVSifSqNEl9vvsTJ8bkVMm3MKbG2P7Q==",
|
||||
"encryption_iv": "8I2hhNIYNTrwxfHk"
|
||||
},
|
||||
"media_url": "http://api.twilio.com/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings/REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,137 @@
|
||||
import {
|
||||
AppConnectionValueForAuthProperty,
|
||||
createTrigger,
|
||||
PiecePropValueSchema,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
DedupeStrategy,
|
||||
httpClient,
|
||||
HttpMethod,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { twilioAuth } from '../..';
|
||||
|
||||
interface Transcription {
|
||||
sid: string;
|
||||
status: string;
|
||||
date_created: string;
|
||||
recording_sid: string;
|
||||
duration: string;
|
||||
price: string;
|
||||
price_unit: string;
|
||||
transcription_text: string;
|
||||
}
|
||||
|
||||
interface TranscriptionsResponse {
|
||||
transcriptions: Transcription[];
|
||||
next_page_uri: string;
|
||||
}
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof twilioAuth>,
|
||||
Record<string, unknown>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
async items({ auth, lastFetchEpochMS }) {
|
||||
const isTest = lastFetchEpochMS === 0;
|
||||
const account_sid = auth.username;
|
||||
const auth_token = auth.password;
|
||||
|
||||
let currentUri:
|
||||
| string
|
||||
| null = `/2010-04-01/Accounts/${account_sid}/Transcriptions.json?PageSize=${
|
||||
isTest ? 10 : 1000
|
||||
}`;
|
||||
|
||||
const results = [];
|
||||
let stop = false;
|
||||
|
||||
do {
|
||||
const response: any = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `https://api.twilio.com${currentUri}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: account_sid,
|
||||
password: auth_token,
|
||||
},
|
||||
});
|
||||
|
||||
const payload = response.body as TranscriptionsResponse;
|
||||
|
||||
const transcriptions = payload.transcriptions ?? [];
|
||||
|
||||
for (const recording of transcriptions) {
|
||||
const ts = new Date(recording.date_created).getTime();
|
||||
|
||||
if (recording.status !== 'completed') continue;
|
||||
|
||||
if (isTest || ts > lastFetchEpochMS) {
|
||||
results.push(recording);
|
||||
} else {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isTest) break;
|
||||
currentUri = payload?.next_page_uri ?? null;
|
||||
} while (currentUri && !stop);
|
||||
|
||||
return results.map((recording) => {
|
||||
return {
|
||||
epochMilliSeconds: new Date(recording.date_created).getTime(),
|
||||
data: recording,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export const twilioNewTranscription = createTrigger({
|
||||
auth: twilioAuth,
|
||||
name: 'new_transcription',
|
||||
displayName: 'New Transcription',
|
||||
description: 'Triggers when a new call recording transcription is completed.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
"account_sid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"api_version": "2008-08-01",
|
||||
"date_created": "Thu, 25 Aug 2011 20:59:45 +0000",
|
||||
"date_updated": "Thu, 25 Aug 2011 20:59:45 +0000",
|
||||
"duration": "10",
|
||||
"price": "0.00000",
|
||||
"price_unit": "USD",
|
||||
"recording_sid": "REaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"sid": "TRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"status": "completed",
|
||||
"transcription_text": null,
|
||||
"type": "fast",
|
||||
"uri": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Transcriptions/TRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json"
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user