Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

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

View File

@@ -0,0 +1,10 @@
{
"name": "@activepieces/piece-short-io",
"version": "0.0.8",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

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

View File

@@ -0,0 +1,151 @@
{
"API Key": "API-Schlüssel",
"Enter your Short.io API Key": "Geben Sie Ihren Short.io API-Schlüssel ein",
"Create Country Targeting Rule": "Erstelle Länderzielregel",
"Create Short Link": "Kurzlink erstellen",
"Delete Short Link": "Kurzlink löschen",
"Expire Short Link": "Ablauf-Kurzlink",
"Domain Statistics": "Domainstatistik",
"Get Link by Path": "Link per Pfad erhalten",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Links auflisten",
"Update Short Link": "Kurzlink aktualisieren",
"Custom API Call": "Eigener API-Aufruf",
"Set geographic targeting rules for a link with specific destination per country.": "Legen Sie geografische Zielregeln für eine Verbindung mit einem bestimmten Ziel pro Land fest.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Erstelle einen neuen Kurzlink mit optionalen Parametern (Titel, UTM-Tags, Verfallsdatum usw.)",
"Permanently delete a short link by its unique link ID.": "Löschen Sie dauerhaft einen kurzen Link mit seiner eindeutigen Link-ID.",
"Set an expiration date or click limit to deactivate a short link.": "Legen Sie ein Ablaufdatum fest oder klicken Sie auf Limit, um einen kurzen Link zu deaktivieren.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Abrufen von Nutzungsstatistiken (Klicks, Konversionen) für eine Domäne innerhalb eines Zeitraums.",
"Retrieve detailed information about a short link using its domain and path.": "Rufen Sie detaillierte Informationen über einen kurzen Link mit dessen Domäne und Pfad ab.",
"Retrieve click statistics for specific short links by their IDs.": "Klickstatistiken für bestimmte Kurzlinks durch ihre IDs abrufen.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Rufen Sie alle Links einer Domäne mit Seitenangaben und Datumsfiltern ab.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Aktualisieren Sie die ursprüngliche URL, den Pfad, den Titel oder andere Eigenschaften eines kurzen Links unter Verwendung der Link-ID.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Domain": "Domäne",
"Short Link": "Kurzlink",
"Country Code": "Landesvorwahl",
"Country-Specific Redirect URL": "länderspezifische Umleitungs-URL",
"Original URL": "Original-URL",
"Title": "Titel",
"Folder": "Ordner",
"Enable Cloaking": "Cloaking aktivieren",
"Password": "Kennwort",
"Redirect Type": "Umleitungstyp",
"Expiration Date": "Ablaufdatum",
"Expired Redirect URL": "Abgelaufene Weiterleitungs-URL",
"Tags": "Tags",
"UTM Source": "UTM-Quelle",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTM-Kampagne",
"UTM Term": "UTM Begriff",
"UTM Content": "UTM-Inhalt",
"Time to Live (in seconds)": "Zeit zu leben (in Sekunden)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Erstellungszeit",
"Clicks Limit": "Klicks Limit",
"Show Contact for Password Recovery": "Kontakt für Passwort-Wiederherstellung anzeigen",
"Skip Query String Merge": "Abfragezeichenkombination überspringen",
"Archive Link": "Archivlink",
"Split URL": "URL teilen",
"Split Percent": "Prozent teilen",
"Adroll Integration ID": "Adroll-Integrations-ID",
"Facebook Integration ID": "Facebook-Integrations-ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Duplikate erlauben",
"Path": "Pfad",
"Link ID": "Link ID",
"Time Period": "Zeitperiode",
"Start Date": "Startdatum",
"End Date": "Enddatum",
"Timezone": "Timezone",
"Chart Interval": "Kartenintervall",
"Link Path": "Link-Pfad",
"Link IDs": "Link IDs",
"Limit": "Limit",
"Link ID Filter": "Link-ID Filter",
"Exact Creation Time": "Genaue Erstellungszeit",
"Before Date": "Vor Datum",
"After Date": "Nach Datum",
"Date Sort Order": "Sortierdatum",
"Page Token": "Seiten-Token",
"Custom Path (Slug)": "Eigener Pfad (Slug)",
"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)",
"Select the domain to use for the link": "Wählen Sie die Domäne für den Link",
"Select the short link from the domain": "Wählen Sie den kurzen Link aus der Domain",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 Alpha-2 Ländercode (z.B. US, GB, CA, IN). Es muss genau 2 Zeichen lang sein.",
"The destination URL when users from this country access the link. Must be a valid URL.": "Die Ziel-URL, wenn Benutzer aus diesem Land auf den Link zugreifen. Muss eine gültige URL sein.",
"Select the folder to add the link to.": "Wählen Sie den Ordner, zu dem der Link hinzugefügt werden soll.",
"The HTTP status code for the redirect. The default is 302 (Found).": "Der HTTP-Statuscode für die Umleitung. Der Standard ist 302 (Found).",
"The date and time when the link will become inactive.": "Das Datum und die Uhrzeit, an der der Link inaktiv wird.",
"Array of tags for the link": "Anordnung der Tags für den Link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": ":Warnung: ACHTUNG: Der Link wird nach diesen Sekunden PERMANENTLICHER LÖSCHt. Diese Aktion kann nicht rückgängig gemacht werden. Mit äußerster Vorsicht verwenden.",
"Overrides the creation time of the link.": "Überschreibt die Erstellungszeit des Links.",
"Disable link after specified number of clicks (minimum: 1)": "Link nach der angegebenen Anzahl von Klicks deaktivieren (Minimum: 1)",
"Split URL percentage (1-100)": "Prozentsatz der URL teilen (1-100)",
"Custom path for the short link (optional).": "Benutzerdefinierter Pfad für den Kurzlink (optional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "Die ID des kurzen Links, den Sie löschen möchten (z.B. lnk_61Mb_0dnRUg3vtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Optionale URL, die Benutzer weiterleitet, wenn der Link abgelaufen ist.",
"Select the domain to get statistics for": "Wählen Sie die Domäne um Statistiken zu erhalten für",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Wählen Sie ein vordefiniertes Zeitintervall oder wählen Sie \"Benutzerdefiniert\" um bestimmte Termine festzulegen.",
"Start date for statistics (required when period is \"Custom\").": "Startdatum für Statistiken (erforderlich, wenn Zeitraum \"Benutzerdefiniert\" ist).",
"End date for statistics (required when period is \"Custom\").": "Enddatum für Statistiken (erforderlich, wenn Zeitraum \"Benutzerdefiniert\" ist).",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Zeitzone für Statistiken (z.B. UTC, America/New_York, Europa/London). Standard ist UTC.",
"Granularity for click statistics chart data.": "Granularität für Klickstatistiken Diagrammdaten.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "Der Pfad/Slug des kurzen Links (z.B. \"abc123\", \"my-link\"). Keine Domain oder Schrägstriche enthalten.",
"Select the domain containing the links": "Wählen Sie die Domäne mit den Links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Liste der Link-IDs zum Abrufen von Klickstatistiken (z.B. lnk_61Mb_0dnRUg3vtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Startdatum für Klickstatistiken (optional).",
"End date for click statistics (optional).": "Enddatum für Klick-Statistiken (optional).",
"Select the domain to retrieve links from": "Wählen Sie die Domäne zum Abrufen von Links aus",
"Number of results to return (1-150). Default is 50.": "Anzahl der zurückzugebenden Ergebnisse (1-150). Standardwert ist 50.",
"Filter by specific link ID (optional).": "Filtern nach spezifischer Link-ID (optional).",
"Filter by exact creation time (ISO format or timestamp).": "Filtern Sie nach exakter Erstellungszeit (ISO-Format oder Zeitstempel).",
"Return links created before this date and time.": "Links zurückgeben, die vor diesem Datum und der Zeit erstellt wurden.",
"Return links created after this date and time.": "Links zurückgeben, die nach diesem Datum und der Zeit erstellt wurden.",
"Order links by creation date.": "Bestellen Sie Links nach Erstellungsdatum.",
"Token for paginated results (get this from previous response).": "Token für paginierte Ergebnisse (erhalten Sie dieses von der vorherigen Antwort).",
"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..",
"301 (Moved Permanently)": "301 (Permanent verschoben)",
"302 (Found)": "302 (gefunden)",
"303 (See Other)": "303 (Siehe Andere)",
"307 (Temporary Redirect)": "307 (Temporäre Weiterleitung)",
"308 (Permanent Redirect)": "308 (Permanente Umleitung)",
"Today": "Heute",
"Yesterday": "Gestern",
"Last 7 Days": "Letzte 7 Tage",
"Last 30 Days": "Letzte 30 Tage",
"This Month": "Diesen Monat",
"Last Month": "Letzten Monat",
"Custom Date Range": "Eigener Datumsbereich",
"Hour": "Stunde",
"Day": "Tag",
"Week": "Woche",
"Month": "Monat",
"Ascending (Oldest First)": "Aufsteigend (ältestes zuerst)",
"Descending (Newest First)": "Absteigend (Neueste erst)",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Link Created": "Neuer Link erstellt",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Feuert ab, wenn ein neuer Kurzlink auf einer Domain erstellt wird. Nützlich, um neu erstellte Links zu anderen Systemen zu synchronisieren.",
"Polling Interval": "Umfrageintervall",
"Select the domain to monitor for new links": "Wählen Sie die Domäne für neue Links",
"How often to check for new links. More frequent polling may hit rate limits.": "Wie oft man nach neuen Links sucht. Häufiger Umfragen kann Preisbegrenzungen erreichen.",
"Every 1 minute": "Alle 1 Minute",
"Every 5 minutes": "Alle 5 Minuten",
"Every 15 minutes": "Alle 15 Minuten",
"Every 30 minutes": "Alle 30 Minuten",
"Every hour": "Stündlich"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "Clave API",
"Enter your Short.io API Key": "Introduzca su clave de API Short.io",
"Create Country Targeting Rule": "Crear regla de destino del país",
"Create Short Link": "Crear enlace corto",
"Delete Short Link": "Eliminar enlace corto",
"Expire Short Link": "Caduca el enlace corto",
"Domain Statistics": "Estadísticas del dominio",
"Get Link by Path": "Obtener enlace por ruta",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Listar enlaces",
"Update Short Link": "Actualizar enlace corto",
"Custom API Call": "Llamada API personalizada",
"Set geographic targeting rules for a link with specific destination per country.": "Establecer reglas de orientación geográfica para un vínculo con un destino específico por país.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Crear un nuevo enlace corto con parámetros opcionales (título, etiquetas UTM, caducidad, captura, etc.)",
"Permanently delete a short link by its unique link ID.": "Eliminar permanentemente un enlace corto por su ID de enlace único.",
"Set an expiration date or click limit to deactivate a short link.": "Establezca una fecha de caducidad o haga clic en el límite para desactivar un enlace corto.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Recuperar estadísticas de uso (clics, conversiones) para un dominio dentro de un período de tiempo.",
"Retrieve detailed information about a short link using its domain and path.": "Recuperar información detallada sobre un enlace corto usando su dominio y ruta.",
"Retrieve click statistics for specific short links by their IDs.": "Recupere las estadísticas de los enlaces cortos específicos por sus IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Recuperar todos los enlaces en un dominio, con paginación y filtros de rango de fechas.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Actualizar la URL original, la ruta, el título u otras propiedades de un enlace corto existente usando su ID de enlace.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Domain": "Dominio",
"Short Link": "Enlace corto",
"Country Code": "Código del país",
"Country-Specific Redirect URL": "URL de redirección específica del país",
"Original URL": "URL original",
"Title": "Título",
"Folder": "Carpeta",
"Enable Cloaking": "Activar Cloaking",
"Password": "Contraseña",
"Redirect Type": "Tipo de redirección",
"Expiration Date": "Fecha de caducidad",
"Expired Redirect URL": "URL de redirección caducada",
"Tags": "Etiquetas",
"UTM Source": "Fuente UTM",
"UTM Medium": "Medios UTM",
"UTM Campaign": "Campaña UTM",
"UTM Term": "Término UTM",
"UTM Content": "Contenido UTM",
"Time to Live (in seconds)": "Tiempo para vivir (en segundos)",
"Android URL": "Android URL",
"iPhone URL": "URL del iPhone",
"Creation Time": "Tiempo de Creación",
"Clicks Limit": "Límite de clics",
"Show Contact for Password Recovery": "Mostrar contacto para recuperación de contraseña",
"Skip Query String Merge": "Omitir unión de cadenas de consulta",
"Archive Link": "Archivo Enlace",
"Split URL": "Dividir URL",
"Split Percent": "Dividir Porcentaje",
"Adroll Integration ID": "ID de integración de Adroll",
"Facebook Integration ID": "ID de integración de Facebook",
"Google Analytics ID": "ID de Google Analytics",
"Google Tag Manager ID": "ID del gestor de Google Tag",
"Allow Duplicates": "Permitir duplicados",
"Path": "Ruta",
"Link ID": "Link ID",
"Time Period": "Periodo de tiempo",
"Start Date": "Fecha de inicio",
"End Date": "Fecha de fin",
"Timezone": "Timezone",
"Chart Interval": "Intervalo de gráfico",
"Link Path": "Ruta de enlace",
"Link IDs": "Link IDs",
"Limit": "Límite",
"Link ID Filter": "Filtro de ID de Enlace",
"Exact Creation Time": "Tiempo exacto de creación",
"Before Date": "Antes de la fecha",
"After Date": "Después de la fecha",
"Date Sort Order": "Orden de fecha",
"Page Token": "Ficha de página",
"Custom Path (Slug)": "Ruta personalizada (Slug)",
"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)",
"Select the domain to use for the link": "Seleccione el dominio a utilizar para el enlace",
"Select the short link from the domain": "Seleccione el enlace corto del dominio",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 código de país alpha-2 (por ejemplo, US, GB, CA, IN). Debe tener exactamente 2 caracteres.",
"The destination URL when users from this country access the link. Must be a valid URL.": "La URL de destino cuando los usuarios de este país acceden al enlace. Debe ser una URL válida.",
"Select the folder to add the link to.": "Seleccione la carpeta a la que añadir el enlace.",
"The HTTP status code for the redirect. The default is 302 (Found).": "El código de estado HTTP para la redirección. El valor por defecto es 302 (Found).",
"The date and time when the link will become inactive.": "La fecha y hora en que el enlace se volverá inactivo.",
"Array of tags for the link": "Arreglo de etiquetas para el enlace",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ CAUCIÓN: El enlace será PERMANENTAMENTE DELETADO después de estos muchos segundos. Esta acción no se puede deshacer. Úsalo con extrema precaución.",
"Overrides the creation time of the link.": "Reemplaza el tiempo de creación del enlace.",
"Disable link after specified number of clicks (minimum: 1)": "Desactivar enlace después del número especificado de clics (mínimo: 1)",
"Split URL percentage (1-100)": "Porcentaje de URL dividida (1-100)",
"Custom path for the short link (optional).": "Ruta personalizada para el enlace corto (opcional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "El ID del enlace corto que desea eliminar (por ejemplo, lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "URL opcional para redirigir a los usuarios cuando el enlace ha caducado.",
"Select the domain to get statistics for": "Seleccione el dominio para obtener estadísticas",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Seleccione un intervalo de tiempo predefinido o elija \"Personalizar\" para establecer fechas específicas.",
"Start date for statistics (required when period is \"Custom\").": "Fecha de inicio para las estadísticas (obligatorio cuando el período es \"Personalizado\").",
"End date for statistics (required when period is \"Custom\").": "Fecha de fin de las estadísticas (obligatorio cuando el período es \"Personalizado\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Zona horaria para estadísticas (por ejemplo, UTC, America/New_York, Europa/Londres). Por defecto es UTC.",
"Granularity for click statistics chart data.": "Granularidad para hacer clic en los datos del gráfico de estadísticas.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "El path/slug del enlace corto (por ejemplo, \"abc123\", \"my-link\"). No incluya dominio o barras.",
"Select the domain containing the links": "Seleccione el dominio que contiene los enlaces",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Lista de IDs de enlaces para obtener estadísticas de clic para (por ejemplo, lnk_61Mb_0dnRUg3vtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Fecha de inicio para hacer clic en las estadísticas (opcional).",
"End date for click statistics (optional).": "Fecha de fin para hacer clic en las estadísticas (opcional).",
"Select the domain to retrieve links from": "Seleccione el dominio del que recuperar enlaces",
"Number of results to return (1-150). Default is 50.": "Número de resultados a devolver (1-150). Por defecto es 50.",
"Filter by specific link ID (optional).": "Filtrar por ID de enlace específico (opcional).",
"Filter by exact creation time (ISO format or timestamp).": "Filtrar por hora exacta de creación (formato ISO o marca de tiempo).",
"Return links created before this date and time.": "Enlaces de devolución creados antes de esta fecha y hora.",
"Return links created after this date and time.": "Enlaces de devolución creados después de esta fecha y hora.",
"Order links by creation date.": "Enlaces de pedido por fecha de creación.",
"Token for paginated results (get this from previous response).": "Token para los resultados paginados (obtener esto de la respuesta anterior).",
"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.",
"301 (Moved Permanently)": "301 (Mover permanentemente)",
"302 (Found)": "302 (Fuente)",
"303 (See Other)": "303 (Ver Otro)",
"307 (Temporary Redirect)": "307 (Redirección temporal)",
"308 (Permanent Redirect)": "308 (redirección permanente)",
"Today": "Hoy",
"Yesterday": "Ayer",
"Last 7 Days": "Últimos 7 días",
"Last 30 Days": "Últimos 30 días",
"This Month": "Este mes",
"Last Month": "Mes pasado",
"Custom Date Range": "Rango de fecha personalizado",
"Hour": "Hora",
"Day": "Día",
"Week": "Semana",
"Month": "Mes",
"Ascending (Oldest First)": "Ascendente (lo más antiguo primero)",
"Descending (Newest First)": "Descendente (lo más reciente)",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Link Created": "Nuevo enlace creado",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Dispara cuando se crea un nuevo enlace corto en un dominio. Útil para sincronizar nuevos enlaces a otros sistemas.",
"Polling Interval": "Intervalo de encuesta",
"Select the domain to monitor for new links": "Seleccione el dominio para monitorizar los nuevos enlaces",
"How often to check for new links. More frequent polling may hit rate limits.": "Cuántas veces hay que buscar nuevos vínculos. Las encuestas más frecuentes pueden llegar a los límites de las tasas.",
"Every 1 minute": "Cada 1 minuto",
"Every 5 minutes": "Cada 5 minutos",
"Every 15 minutes": "Cada 15 minutos",
"Every 30 minutes": "Cada 30 minutos",
"Every hour": "Cada hora"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "Clé API",
"Enter your Short.io API Key": "Entrez votre clé API Short.io",
"Create Country Targeting Rule": "Créer une règle de ciblage par pays",
"Create Short Link": "Créer un lien court",
"Delete Short Link": "Supprimer le lien court",
"Expire Short Link": "Lien court d'expiration",
"Domain Statistics": "Statistiques de domaine",
"Get Link by Path": "Obtenir le lien par chemin",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Lister les liens",
"Update Short Link": "Mettre à jour le lien court",
"Custom API Call": "Appel d'API personnalisé",
"Set geographic targeting rules for a link with specific destination per country.": "Définir des règles de ciblage géographique pour un lien avec une destination spécifique par pays.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Créer un nouveau lien court avec des paramètres optionnels (titre, tags UTM, expiration, masquage, etc.)",
"Permanently delete a short link by its unique link ID.": "Supprimer définitivement un lien court par son ID de lien unique.",
"Set an expiration date or click limit to deactivate a short link.": "Définissez une date d'expiration ou cliquez sur la limite pour désactiver un lien court.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Récupérer les statistiques d'utilisation (clics, conversions) pour un domaine dans un laps de temps.",
"Retrieve detailed information about a short link using its domain and path.": "Récupère des informations détaillées sur un lien court en utilisant son domaine et son chemin.",
"Retrieve click statistics for specific short links by their IDs.": "Récupérer les statistiques de clics pour les liens courts spécifiques par leurs IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Récupérer tous les liens sur un domaine, avec des filtres de pagination et de plage de date.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Mettre à jour l'URL originale d'un lien court existant, son chemin, son titre ou d'autres propriétés en utilisant son identifiant de lien.",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Domain": "Domaine",
"Short Link": "Lien court",
"Country Code": "Code du pays",
"Country-Specific Redirect URL": "URL de redirection spécifique à un pays",
"Original URL": "URL d'origine",
"Title": "Titre de la page",
"Folder": "Dossier",
"Enable Cloaking": "Activer Cloaking",
"Password": "Password",
"Redirect Type": "Type de redirection",
"Expiration Date": "Date d'expiration",
"Expired Redirect URL": "URL de redirection expirée",
"Tags": "Tags",
"UTM Source": "Source UTM",
"UTM Medium": "UTM Moyen",
"UTM Campaign": "Campagne UTM",
"UTM Term": "Condition UTM",
"UTM Content": "Contenu UTM",
"Time to Live (in seconds)": "Temps de Live (en secondes)",
"Android URL": "Android URL",
"iPhone URL": "URL de l'iPhone",
"Creation Time": "Date de création",
"Clicks Limit": "Limite de clics",
"Show Contact for Password Recovery": "Afficher le contact pour la récupération du mot de passe",
"Skip Query String Merge": "Ignorer la fusion de la chaîne de requête",
"Archive Link": "Lien d'archive",
"Split URL": "Diviser l'URL",
"Split Percent": "Pourcentage de fractionnement",
"Adroll Integration ID": "ID d'intégration Adroll",
"Facebook Integration ID": "ID d'intégration Facebook",
"Google Analytics ID": "Identifiant Google Analytics",
"Google Tag Manager ID": "Identifiant Google Tag Manager",
"Allow Duplicates": "Autoriser les doublons",
"Path": "Chemin d'accès",
"Link ID": "Link ID",
"Time Period": "Période de temps",
"Start Date": "Date de début",
"End Date": "Date de fin",
"Timezone": "Fuseau horaire",
"Chart Interval": "Intervalle de la carte",
"Link Path": "Chemin du lien",
"Link IDs": "Link IDs",
"Limit": "Limite",
"Link ID Filter": "Filtre ID du lien",
"Exact Creation Time": "Date de création exacte",
"Before Date": "Avant la date",
"After Date": "Après la date",
"Date Sort Order": "Ordre de tri par date",
"Page Token": "Jeton de la page",
"Custom Path (Slug)": "Chemin personnalisé (Slug)",
"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)",
"Select the domain to use for the link": "Sélectionnez le domaine à utiliser pour le lien",
"Select the short link from the domain": "Sélectionnez le lien court du domaine",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 code de pays (par exemple, US, GB, CA, IN). Doit faire exactement 2 caractères.",
"The destination URL when users from this country access the link. Must be a valid URL.": "L'URL de destination lorsque les utilisateurs de ce pays accèdent au lien. Doit être une URL valide.",
"Select the folder to add the link to.": "Sélectionnez le dossier vers lequel ajouter le lien.",
"The HTTP status code for the redirect. The default is 302 (Found).": "Le code de statut HTTP pour la redirection. La valeur par défaut est 302 (Found).",
"The date and time when the link will become inactive.": "La date et l'heure où le lien deviendra inactif.",
"Array of tags for the link": "Tableau de balises pour le lien",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ PRÉCAUTION : Le lien sera SUPPRIMEMENT SUPPRIMÉ après ces quelques secondes. Cette action ne peut pas être annulée. Utilisez avec une extrême prudence.",
"Overrides the creation time of the link.": "Outrepasse l'heure de création du lien.",
"Disable link after specified number of clicks (minimum: 1)": "Désactiver le lien après le nombre spécifié de clics (minimum : 1)",
"Split URL percentage (1-100)": "Pourcentage d'URL divisée (1-100)",
"Custom path for the short link (optional).": "Chemin personnalisé pour le lien court (facultatif).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "L'ID du lien court que vous voulez supprimer (par exemple, lnk_61Mb_0dnRUg3vtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "URL optionnelle pour rediriger les utilisateurs lorsque le lien a expiré.",
"Select the domain to get statistics for": "Sélectionnez le domaine pour obtenir les statistiques pour",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Sélectionnez un intervalle de temps prédéfini ou choisissez \"Personnaliser\" pour définir des dates spécifiques.",
"Start date for statistics (required when period is \"Custom\").": "Date de début des statistiques (nécessaire lorsque la période est « Personnalisée »).",
"End date for statistics (required when period is \"Custom\").": "Date de fin des statistiques (nécessaire lorsque la période est « Personnalisée »).",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Fuseau horaire des statistiques (par exemple, UTC, Amérique/New_York, Europe/Londres).",
"Granularity for click statistics chart data.": "Granularité pour les données du graphique des statistiques de clic.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "Le chemin / slug du lien court (par exemple, \"abc123\", \"mon-lien\"). N'incluez pas le domaine ou les slashs.",
"Select the domain containing the links": "Sélectionnez le domaine contenant les liens",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Liste des identifiants de liens pour récupérer les statistiques de clics (par exemple, lnk_61Mb_0dnRUg3vtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Date de début pour cliquer sur les statistiques (facultatif).",
"End date for click statistics (optional).": "Date de fin pour cliquer sur les statistiques (facultatif).",
"Select the domain to retrieve links from": "Sélectionnez le domaine à partir duquel récupérer les liens",
"Number of results to return (1-150). Default is 50.": "Nombre de résultats à retourner (1-150). La valeur par défaut est 50.",
"Filter by specific link ID (optional).": "Filtrer par ID de lien spécifique (facultatif).",
"Filter by exact creation time (ISO format or timestamp).": "Filtrer par date de création exacte (format ISO ou horodatage).",
"Return links created before this date and time.": "Renvoie les liens créés avant cette date et cette heure.",
"Return links created after this date and time.": "Renvoie les liens créés après cette date et cette heure.",
"Order links by creation date.": "Trier les liens par date de création.",
"Token for paginated results (get this from previous response).": "Jeton pour les résultats paginés (récupérer ceci à partir de la réponse précédente).",
"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.",
"301 (Moved Permanently)": "301 (déplacé de manière permanente)",
"302 (Found)": "302 (Trouvé)",
"303 (See Other)": "303 (Voir autres)",
"307 (Temporary Redirect)": "307 (redirection temporaire)",
"308 (Permanent Redirect)": "308 (Redirection permanente)",
"Today": "Aujourd'hui",
"Yesterday": "Hier",
"Last 7 Days": "Les 7 derniers jours",
"Last 30 Days": "Les 30 derniers jours",
"This Month": "Ce mois-ci",
"Last Month": "Le mois dernier",
"Custom Date Range": "Plage de dates personnalisée",
"Hour": "Heure",
"Day": "Jour",
"Week": "Semaine",
"Month": "Mois",
"Ascending (Oldest First)": "Ascendant (plus ancien d'abord)",
"Descending (Newest First)": "Décroissant (plus récent d'abord)",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Link Created": "Nouveau lien créé",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Se déclenche lorsqu'un nouveau lien court est créé sur un domaine. Utile pour synchroniser les liens nouvellement créés avec d'autres systèmes.",
"Polling Interval": "Intervalle de vote",
"Select the domain to monitor for new links": "Sélectionnez le domaine à surveiller pour les nouveaux liens",
"How often to check for new links. More frequent polling may hit rate limits.": "À quelle fréquence vérifier les nouveaux liens. Des sondages plus fréquents peuvent atteindre les limites de débit.",
"Every 1 minute": "Toutes les 1 minute",
"Every 5 minutes": "Toutes les 5 minutes",
"Every 15 minutes": "Toutes les 15 minutes",
"Every 30 minutes": "Toutes les 30 minutes",
"Every hour": "Toutes les heures"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "API キー",
"Enter your Short.io API Key": "Short.io API キーを入力してください",
"Create Country Targeting Rule": "国のターゲットルールを作成",
"Create Short Link": "短いリンクを作成",
"Delete Short Link": "短縮リンクを削除",
"Expire Short Link": "短縮リンクの有効期限",
"Domain Statistics": "ドメインの統計情報",
"Get Link by Path": "パスでリンクを取得",
"Get Link Clicks": "Get Link Clicks",
"List Links": "リストリンク",
"Update Short Link": "短縮リンクを更新",
"Custom API Call": "カスタムAPI通話",
"Set geographic targeting rules for a link with specific destination per country.": "国ごとの特定の宛先を持つリンクの地理的ターゲティングルールを設定します。",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "オプションパラメータタイトル、UTMタグ、有効期限、クローキングなどを持つ新しいショートリンクを作成します。",
"Permanently delete a short link by its unique link ID.": "一意のリンクIDで短いリンクを完全に削除します。",
"Set an expiration date or click limit to deactivate a short link.": "短いリンクを無効にするには、有効期限またはクリック制限を設定します。",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "期間内にドメインの使用統計(クリック数、変換数)を取得します。",
"Retrieve detailed information about a short link using its domain and path.": "ドメインとパスを使用して短いリンクに関する詳細情報を取得します。",
"Retrieve click statistics for specific short links by their IDs.": "IDによる特定の短いリンクのクリック統計を取得します。",
"Retrieve all links on a domain, with pagination and date-range filters.": "ページネーションと日付範囲のフィルターを使用して、ドメイン上のすべてのリンクを取得します。",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "既存のショートリンクのオリジナルURL、パス、タイトル、またはその他のプロパティをリンク ID を使用して更新します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Domain": "ドメイン",
"Short Link": "短いリンク",
"Country Code": "国コード",
"Country-Specific Redirect URL": "国別リダイレクトURL",
"Original URL": "元の URL",
"Title": "タイトル",
"Folder": "Folder",
"Enable Cloaking": "クローニングを有効にする",
"Password": "パスワード",
"Redirect Type": "リダイレクトタイプ",
"Expiration Date": "有効期限",
"Expired Redirect URL": "期限切れのリダイレクトURL",
"Tags": "タグ",
"UTM Source": "UTM ソース",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTMキャンペーン",
"UTM Term": "UTM用語",
"UTM Content": "UTMコンテンツ",
"Time to Live (in seconds)": "ライブ開始までの時間 (秒)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "作成日時",
"Clicks Limit": "クリック数制限",
"Show Contact for Password Recovery": "パスワード回復の連絡先を表示",
"Skip Query String Merge": "クエリ文字列のマージをスキップ",
"Archive Link": "アーカイブリンク",
"Split URL": "URL を分割",
"Split Percent": "割合を分割",
"Adroll Integration ID": "Adroll Integration ID",
"Facebook Integration ID": "Facebook連携ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "重複を許可",
"Path": "パス",
"Link ID": "Link ID",
"Time Period": "期間",
"Start Date": "開始日",
"End Date": "終了日",
"Timezone": "Timezone",
"Chart Interval": "グラフの間隔",
"Link Path": "リンクパス",
"Link IDs": "Link IDs",
"Limit": "制限",
"Link ID Filter": "リンクIDフィルタ",
"Exact Creation Time": "正確な作成時間",
"Before Date": "終了日",
"After Date": "終了日",
"Date Sort Order": "日付の並べ替え順",
"Page Token": "ページ トークン",
"Custom Path (Slug)": "カスタムパス (スラグ)",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Select the domain to use for the link": "リンクに使用するドメインを選択してください",
"Select the short link from the domain": "ドメインからショートリンクを選択してください",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 country code (e.g, 米国, GB, CA, IN). は 2 文字でなければなりません.",
"The destination URL when users from this country access the link. Must be a valid URL.": "この国のユーザーがリンクにアクセスする際のURL。有効なURLである必要があります。",
"Select the folder to add the link to.": "リンクを追加するフォルダを選択します。",
"The HTTP status code for the redirect. The default is 302 (Found).": "リダイレクトの HTTP ステータスコード。デフォルトは 302 (見つかりました) です。",
"The date and time when the link will become inactive.": "リンクが無効になる日付と時刻。",
"Array of tags for the link": "リンクのタグの配列",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ 注意: リンクはこの数秒後に完全に削除されます。この操作は元に戻すことはできません。注意して使用してください。",
"Overrides the creation time of the link.": "リンクの作成時間を上書きします。",
"Disable link after specified number of clicks (minimum: 1)": "指定したクリック数の後にリンクを無効にする最小1",
"Split URL percentage (1-100)": "分割URLパーセント1-100",
"Custom path for the short link (optional).": "ショートリンクのカスタムパス (オプション)。",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "削除したいショートリンクのIDlnk_61Mb_0dnRUg3vvtmAPZh3dhQh6",
"Optional URL to redirect users when the link has expired.": "リンクの有効期限が切れたときにユーザーをリダイレクトする任意のURL。",
"Select the domain to get statistics for": "統計情報を取得するドメインを選択してください",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "定義済みの時間間隔を選択するか、「カスタム」を選択して特定の日付を設定します。",
"Start date for statistics (required when period is \"Custom\").": "統計の開始日 (期間が「カスタム」の場合に必要です)。",
"End date for statistics (required when period is \"Custom\").": "統計の終了日 (期間が「カスタム」の場合に必要です)。",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "統計のタイムゾーンUTC、アメリカ/ニューヨーク、ヨーロッパ/ロンドンなど。デフォルトはUTCです。",
"Granularity for click statistics chart data.": "クリック統計チャートデータの詳細。",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "The path/slug of the short link (e.g. \"abc123\", \"my-link\"). Do not include domain or slashes.",
"Select the domain containing the links": "リンクを含むドメインを選択してください",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "クリック統計を取得するためのリンクIDの一覧です(例: lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)。",
"Start date for click statistics (optional).": "統計情報をクリックする開始日 (オプション)。",
"End date for click statistics (optional).": "統計情報をクリックするための終了日 (オプション)。",
"Select the domain to retrieve links from": "リンクを取得するドメインを選択してください",
"Number of results to return (1-150). Default is 50.": "返す結果の数(1-150)。デフォルトは50です。",
"Filter by specific link ID (optional).": "特定のリンクIDで絞り込みます (オプション)。",
"Filter by exact creation time (ISO format or timestamp).": "正確な作成時間(ISO形式またはタイムスタンプ)でフィルタリングします。",
"Return links created before this date and time.": "この日時の前に作成されたリンクを返します。",
"Return links created after this date and time.": "この日付と時刻の後に作成されたリンクを返します。",
"Order links by creation date.": "作成日による注文リンク",
"Token for paginated results (get this from previous response).": "ページ化された結果のトークン (前の応答からこれを取得します)。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"301 (Moved Permanently)": "301 (Moved Permanently)",
"302 (Found)": "302 (見つかりました)",
"303 (See Other)": "303その他を参照",
"307 (Temporary Redirect)": "307一時リダイレクト",
"308 (Permanent Redirect)": "308永久リダイレクト",
"Today": "今日",
"Yesterday": "昨日",
"Last 7 Days": "過去 7 日間",
"Last 30 Days": "過去 30 日間",
"This Month": "今月",
"Last Month": "前月",
"Custom Date Range": "カスタム日付範囲",
"Hour": "時間",
"Day": "日",
"Week": "週",
"Month": "月",
"Ascending (Oldest First)": "昇順",
"Descending (Newest First)": "降順",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Link Created": "新しいリンクが作成されました",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "ドメイン上に新しいショートリンクが作成されたときに発生します。他のシステムへの新しく作成されたリンクを同期するのに便利です。",
"Polling Interval": "ポーリング間隔",
"Select the domain to monitor for new links": "新しいリンクを監視するドメインを選択してください",
"How often to check for new links. More frequent polling may hit rate limits.": "どのように頻繁に新しいリンクを確認します. より頻繁にポーリングはレート制限に達する可能性があります.",
"Every 1 minute": "1 分ごと",
"Every 5 minutes": "5分ごと",
"Every 15 minutes": "15 分ごと",
"Every 30 minutes": "30分ごと",
"Every hour": "1時間ごと"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "API Sleutel",
"Enter your Short.io API Key": "Voer uw Short.io API-sleutel in",
"Create Country Targeting Rule": "Maak landspecifieke doelregel aan",
"Create Short Link": "Korte link maken",
"Delete Short Link": "Korte link verwijderen",
"Expire Short Link": "Korte link verlopen",
"Domain Statistics": "Domein statistieken",
"Get Link by Path": "Krijg link via pad",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Lijst links",
"Update Short Link": "Korte link bijwerken",
"Custom API Call": "Custom API Call",
"Set geographic targeting rules for a link with specific destination per country.": "Stel geografische richtingsregels in voor een link naar een specifieke bestemming per land.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Maak een nieuwe korte link met optionele parameters (titel, UTM tags, expiration, cloaking, etc.)",
"Permanently delete a short link by its unique link ID.": "Verwijder permanent een korte link met de unieke link ID.",
"Set an expiration date or click limit to deactivate a short link.": "Stel een vervaldatum in of klik limiet om een korte link te deactiveren.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Gebruiksstatistieken (klikken, conversies) ophalen voor een domein binnen een tijdsperiode.",
"Retrieve detailed information about a short link using its domain and path.": "Ophalen gedetailleerde informatie over een korte link met behulp van het domein en pad.",
"Retrieve click statistics for specific short links by their IDs.": "Klikstatistieken ophalen voor specifieke links door hun ID's.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Haal alle links op op een domein, met paginering en datumbereik filters.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Update een bestaande korte link van de oorspronkelijke URL, path, titel of andere eigenschappen met behulp van de link ID.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Domain": "Domein",
"Short Link": "Korte link",
"Country Code": "Land Code",
"Country-Specific Redirect URL": "Landspecifieke URL doorverwijzen",
"Original URL": "Oorspronkelijke URL",
"Title": "Aanspreektitel",
"Folder": "Map",
"Enable Cloaking": "Cloak inschakelen",
"Password": "Wachtwoord",
"Redirect Type": "Type omleiding",
"Expiration Date": "Vervaldatum",
"Expired Redirect URL": "Verlopen Redirect URL",
"Tags": "Labels",
"UTM Source": "UTM bron",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTM campagne",
"UTM Term": "UTM term",
"UTM Content": "UTM inhoud",
"Time to Live (in seconds)": "Tijd om te leven (in seconden)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Aanmaak tijd",
"Clicks Limit": "Limiet kliks",
"Show Contact for Password Recovery": "Toon contactpersoon voor wachtwoordherstel",
"Skip Query String Merge": "Samenvoegen van querystring overslaan",
"Archive Link": "Archief link",
"Split URL": "Splits URL",
"Split Percent": "Splits percentage",
"Adroll Integration ID": "Adroll integratie-ID",
"Facebook Integration ID": "Facebook Integratie ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Sta duplicaten toe",
"Path": "Pad",
"Link ID": "Link ID",
"Time Period": "Tijd Periode",
"Start Date": "Start datum",
"End Date": "Eind datum",
"Timezone": "Timezone",
"Chart Interval": "Grafiek Interval",
"Link Path": "Link pad",
"Link IDs": "Link IDs",
"Limit": "Limiet",
"Link ID Filter": "Link ID filter",
"Exact Creation Time": "Exacte aanmaaktijd",
"Before Date": "Voor de datum",
"After Date": "Na datum",
"Date Sort Order": "Datum sorteervolgorde",
"Page Token": "Pagina Token",
"Custom Path (Slug)": "Aangepaste Pad (Slug)",
"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)",
"Select the domain to use for the link": "Selecteer het te gebruiken domein voor de link",
"Select the short link from the domain": "Selecteer de korte link van het domein",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 landcode (bijv. US, GB, CA, IN). Moet precies 2 tekens bevatten.",
"The destination URL when users from this country access the link. Must be a valid URL.": "De doel-URL wanneer gebruikers uit dit land toegang krijgen tot de link. Moet een geldige URL zijn.",
"Select the folder to add the link to.": "Selecteer de map om de link naar toe toe te voegen.",
"The HTTP status code for the redirect. The default is 302 (Found).": "De HTTP-statuscode voor doorverwijzing. De standaard is 302 (Geluid).",
"The date and time when the link will become inactive.": "De datum en tijd waarop de link inactief wordt.",
"Array of tags for the link": "Array of tags voor de link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ De link zal na dit aantal seconden VERWIJDEREN VERWIJDEREN. Deze actie kan niet ongedaan worden gemaakt. Gebruik met extreme voorzichtigheid.",
"Overrides the creation time of the link.": "Overschrijft de aanmaaktijd van de link.",
"Disable link after specified number of clicks (minimum: 1)": "Link uitschakelen na opgegeven aantal kliks (minimum: 1)",
"Split URL percentage (1-100)": "Gedeelde URL percentage (1-100)",
"Custom path for the short link (optional).": "Aangepaste pad voor de korte link (optioneel).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "Het ID van de korte link die u wilt verwijderen (bijv. lnk_61Mb_0dnRUg3vtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Optionele URL om gebruikers door te sturen wanneer de link is verlopen.",
"Select the domain to get statistics for": "Selecteer het domein om statistieken te krijgen voor",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Selecteer een vooraf gedefinieerd tijdsinterval of kies \"Aangepast\" om specifieke data in te stellen.",
"Start date for statistics (required when period is \"Custom\").": "Startdatum voor statistieken (verplicht wanneer de periode \"Aanpassen\" is).",
"End date for statistics (required when period is \"Custom\").": "Einddatum voor statistieken (verplicht wanneer de periode \"Aanpassen\" is).",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Tijdzone voor statistieken (bijv. UTC, Amerika/New_York, Europe/London). Standaard UTC.",
"Granularity for click statistics chart data.": "Granulariteit voor klik op de statistiek grafiek.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "Het pad/slug van de korte link (bijv. \"abc123\", \"my-link\"). Bevat geen domein of slashes.",
"Select the domain containing the links": "Selecteer het domein met de links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Lijst van link IDs om klikstatistieken op te halen (bijv. lnk_61Mb_0dnRUg3vtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Startdatum voor klikstatistieken (optioneel).",
"End date for click statistics (optional).": "Einddatum voor klikstatistieken (optioneel).",
"Select the domain to retrieve links from": "Selecteer het domein om links van op te halen",
"Number of results to return (1-150). Default is 50.": "Aantal resultaten om terug te keren (1-150). Standaard is 50.",
"Filter by specific link ID (optional).": "Filter op specifieke link ID (optioneel).",
"Filter by exact creation time (ISO format or timestamp).": "Filter op exacte aanmaaktijd (ISO formaat of tijdstempel).",
"Return links created before this date and time.": "Retourlinks aangemaakt voor deze datum en tijd.",
"Return links created after this date and time.": "Retourlinks aangemaakt na deze datum en tijd.",
"Order links by creation date.": "Bestel links op aanmaakdatum.",
"Token for paginated results (get this from previous response).": "Token voor gepagineerde resultaten (haal dit op uit vorige reactie).",
"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..",
"301 (Moved Permanently)": "301 (Permanent verplaatst)",
"302 (Found)": "302 (Vrij)",
"303 (See Other)": "303 (Zie Andere)",
"307 (Temporary Redirect)": "307 (Tijdelijke Omleiding)",
"308 (Permanent Redirect)": "308 (Permanent Redirect)",
"Today": "vandaag",
"Yesterday": "gisteren",
"Last 7 Days": "Afgelopen 7 dagen",
"Last 30 Days": "Vorige 30 Dagen",
"This Month": "Deze Maand",
"Last Month": "Afgelopen maand",
"Custom Date Range": "Aangepaste datumbereik",
"Hour": "Uur",
"Day": "dag",
"Week": "week",
"Month": "maand",
"Ascending (Oldest First)": "Oplopend (oudste eerst)",
"Descending (Newest First)": "Aflopend (Nieuwste eerst)",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Link Created": "Nieuwe link aangemaakt",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Vuurt wanneer er een nieuwe korte link wordt gemaakt op een domein. Handig om nieuwe koppelingen te synchroniseren met andere systemen.",
"Polling Interval": "Polling Interval",
"Select the domain to monitor for new links": "Selecteer het domein om te monitoren voor nieuwe links",
"How often to check for new links. More frequent polling may hit rate limits.": "Hoe vaak te controleren op nieuwe links. Meer frequentere opiniepeilingen kunnen limieten raken.",
"Every 1 minute": "Elke minuut",
"Every 5 minutes": "Elke 5 minuten",
"Every 15 minutes": "Elke 15 minuten",
"Every 30 minutes": "Elke 30 minuten",
"Every hour": "Elk uur"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "Chave de API",
"Enter your Short.io API Key": "Digite sua chave de API Short.io",
"Create Country Targeting Rule": "Criar Regra de Alvo País",
"Create Short Link": "Criar Link Curto",
"Delete Short Link": "Excluir Link Curto",
"Expire Short Link": "Expirar Link Curto",
"Domain Statistics": "Estatísticas do domínio",
"Get Link by Path": "Obter Link por Caminho",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Lista de links",
"Update Short Link": "Atualizar Link Curto",
"Custom API Call": "Chamada de API personalizada",
"Set geographic targeting rules for a link with specific destination per country.": "Definir regras geográficas de direcionamento para um link com destino específico por país.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Crie um novo link curto com parâmetros opcionais (título, tags UTM, expiração, manuseamento, etc.)",
"Permanently delete a short link by its unique link ID.": "Exclua permanentemente um link curto pelo seu ID de link exclusivo.",
"Set an expiration date or click limit to deactivate a short link.": "Defina uma data de expiração ou clique em limite para desativar um link curto.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Recuperar estatísticas de uso (cliques, conversões) para um domínio dentro de um período de tempo.",
"Retrieve detailed information about a short link using its domain and path.": "Recupere informações detalhadas sobre um link curto usando seu domínio e caminho.",
"Retrieve click statistics for specific short links by their IDs.": "Recuperar estatísticas de clique para links curtos específicos por seus IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Recupera todos os links em um domínio, com filtros de paginação e de intervalo de datas.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Atualize uma URL, caminho, título ou outras propriedades originais de um link curto existente usando seu ID de link.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Domain": "Domínio",
"Short Link": "Link curto",
"Country Code": "Código do país",
"Country-Specific Redirect URL": "URL de redirecionamento específico do país",
"Original URL": "URL Original",
"Title": "Título",
"Folder": "Pasta",
"Enable Cloaking": "Ativar camuflagem",
"Password": "Senha",
"Redirect Type": "Tipo de Redirecionamento",
"Expiration Date": "Data de Validade",
"Expired Redirect URL": "URL de redirecionamento expirada",
"Tags": "Etiquetas",
"UTM Source": "Fonte UTM",
"UTM Medium": "Médio UTM",
"UTM Campaign": "Campanha UTM",
"UTM Term": "Termo UTM",
"UTM Content": "Conteúdo UTM",
"Time to Live (in seconds)": "Tempo de produção (em segundos)",
"Android URL": "Android URL",
"iPhone URL": "URL do iPhone",
"Creation Time": "Hora da Criação",
"Clicks Limit": "Limite de cliques",
"Show Contact for Password Recovery": "Exibir Contato para Recuperação de Senha",
"Skip Query String Merge": "Pular Mesclar Sequência de Caracteres de Consulta",
"Archive Link": "Link de arquivo",
"Split URL": "Dividir URL",
"Split Percent": "Percentagem de Divisão",
"Adroll Integration ID": "ID de integração",
"Facebook Integration ID": "ID de Integração Facebook",
"Google Analytics ID": "ID do Google Analytics",
"Google Tag Manager ID": "ID do Gerenciador de Tags Google",
"Allow Duplicates": "Permitir duplicatas",
"Path": "Caminho",
"Link ID": "Link ID",
"Time Period": "Intervalo de tempo",
"Start Date": "Data Inicial",
"End Date": "Data de Término",
"Timezone": "Timezone",
"Chart Interval": "Intervalo de Gráfico",
"Link Path": "Caminho da ligação",
"Link IDs": "Link IDs",
"Limit": "Limitar",
"Link ID Filter": "Filtro ID do link",
"Exact Creation Time": "Tempo exato de criação",
"Before Date": "Data anterior",
"After Date": "Data posterior",
"Date Sort Order": "Ordem de Classificação Data",
"Page Token": "Token da Página",
"Custom Path (Slug)": "Caminho Personalizado (Slug)",
"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)",
"Select the domain to use for the link": "Selecione o domínio a ser usado para o link",
"Select the short link from the domain": "Selecione o link curto do domínio",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "Código de país ISO 3166-1 alpha-2 (por exemplo, EUA, GB, CA, IN). Deve ter exatamente 2 caracteres.",
"The destination URL when users from this country access the link. Must be a valid URL.": "A URL de destino quando usuários desse país acessar o link. Deve ser uma URL válida.",
"Select the folder to add the link to.": "Selecione a pasta para adicionar o link.",
"The HTTP status code for the redirect. The default is 302 (Found).": "O código de status HTTP para o redirecionamento. O padrão é 302 (Found).",
"The date and time when the link will become inactive.": "A data e a hora em que o link se tornará inativo.",
"Array of tags for the link": "Array de tags para o link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ ATENÇÃO: O link será DESLIGADO após este número de segundos. Esta ação não pode ser desfeita. Use com extremo cuidado.",
"Overrides the creation time of the link.": "Sobrescreve o tempo de criação do link.",
"Disable link after specified number of clicks (minimum: 1)": "Desativar o link após o número especificado de cliques (mínimo: 1)",
"Split URL percentage (1-100)": "Dividir porcentagem da URL (1-100)",
"Custom path for the short link (optional).": "Caminho personalizado para o link curto (opcional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "O ID do link curto que você deseja excluir (por exemplo, lnk_61Mb_0dnRUg3vvtmAPZh3dh6)",
"Optional URL to redirect users when the link has expired.": "URL opcional para redirecionar os usuários quando o link tiver expirado.",
"Select the domain to get statistics for": "Selecione o domínio para obter estatísticas para",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Selecione um intervalo de tempo predefinido ou escolha \"Personalizado\" para definir datas específicas.",
"Start date for statistics (required when period is \"Custom\").": "Data de início para as estatísticas (obrigatório quando o período é \"Personalizado\").",
"End date for statistics (required when period is \"Custom\").": "Data final para as estatísticas (obrigatório quando o período é \"Personalizado\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Fuso horário para estatísticas (por exemplo, UTC, América/New_York, Europa/Londres). O padrão é UTC.",
"Granularity for click statistics chart data.": "Granularidade para dados do gráfico de estatísticas.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "O caminho/slug do link curto (por exemplo, \"abc123\", \"meu-link\"). Não inclua domínio ou barras",
"Select the domain containing the links": "Selecione o domínio que contém os links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Lista de IDs de links para buscar estatísticas de clique (por exemplo, lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Data de início para estatísticas do clique (opcional).",
"End date for click statistics (optional).": "Data final para estatísticas do clique (opcional).",
"Select the domain to retrieve links from": "Selecione o domínio do qual será recuperado os links",
"Number of results to return (1-150). Default is 50.": "Número de resultados a retornar (1-150). O padrão é 50.",
"Filter by specific link ID (optional).": "Filtrar por ID de link específico (opcional).",
"Filter by exact creation time (ISO format or timestamp).": "Filtrar por hora de criação exata (formato ISO ou timestamp).",
"Return links created before this date and time.": "Retornar links criados antes desta data e hora.",
"Return links created after this date and time.": "Retornar links criados após esta data e hora.",
"Order links by creation date.": "Links de pedido por data de criação.",
"Token for paginated results (get this from previous response).": "Token para resultados paginados (obtenha isso de resposta anterior).",
"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..",
"301 (Moved Permanently)": "301 (Movido permanentemente)",
"302 (Found)": "302 (arredondado)",
"303 (See Other)": "303 (Ver outros)",
"307 (Temporary Redirect)": "307 (Redirecionamento Temporário)",
"308 (Permanent Redirect)": "308 (Redirecionamento (Permanente)",
"Today": "hoje",
"Yesterday": "ontem",
"Last 7 Days": "Últimos 7 Dias",
"Last 30 Days": "Últimos 30 Dias",
"This Month": "Este Mês",
"Last Month": "Mês passado",
"Custom Date Range": "Intervalo Personalizado de Data",
"Hour": "hora",
"Day": "dia",
"Week": "semana",
"Month": "Mês",
"Ascending (Oldest First)": "Ascendente (mais antigo primeiro)",
"Descending (Newest First)": "Descendente (mais novos primeiro)",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Link Created": "Novo Link Criado",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Atira quando um novo link curto é criado em um domínio. Útil para sincronizar ligações recém-criadas para outros sistemas.",
"Polling Interval": "Intervalo de votação",
"Select the domain to monitor for new links": "Selecione o domínio para monitorar novos links",
"How often to check for new links. More frequent polling may hit rate limits.": "Com que frequência procurar por novos links. Uma sondagem mais frequente pode atingir os limites de velocidade.",
"Every 1 minute": "A cada 1 minuto",
"Every 5 minutes": "A cada 5 minutos",
"Every 15 minutes": "A cada 15 minutos",
"Every 30 minutes": "A cada 30 minutos",
"Every hour": "Toda hora"
}

View File

@@ -0,0 +1,150 @@
{
"Short.io": "Short.io",
"API Key": "Ключ API",
"Enter your Short.io API Key": "Введите ваш ключ API Short.io",
"Create Country Targeting Rule": "Создать правило таргетинга страны",
"Create Short Link": "Создать короткую ссылку",
"Delete Short Link": "Удалить короткую ссылку",
"Expire Short Link": "Короткая ссылка истекает",
"Domain Statistics": "Статистика домена",
"Get Link by Path": "Получить ссылку по пути",
"Get Link Clicks": "Get Link Clicks",
"List Links": "Список ссылок",
"Update Short Link": "Обновить короткую ссылку",
"Custom API Call": "Пользовательский вызов API",
"Set geographic targeting rules for a link with specific destination per country.": "Устанавливать правила географического целевого назначения для связи с конкретной страной назначения.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Создать новую короткую ссылку с дополнительными параметрами (заголовок, UTM-теги, срок действия, скрытие и т. д.)",
"Permanently delete a short link by its unique link ID.": "Удалить короткую ссылку по уникальному идентификатору ссылки.",
"Set an expiration date or click limit to deactivate a short link.": "Установите дату истечения срока действия или кликните для отключения короткой ссылки.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Получить статистику использования (клики, конверсии) для домена в течение периода времени.",
"Retrieve detailed information about a short link using its domain and path.": "Получить подробную информацию о короткой ссылке, используя её домен и путь.",
"Retrieve click statistics for specific short links by their IDs.": "Получение статистики кликов для определённых коротких ссылок по их идентификаторам.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Получить все ссылки на домене, с пагинацией и фильтрами диапазона дат.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Обновите существующую короткую ссылку оригинального URL, путь, название или другие свойства, используя его ID ссылки.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Domain": "Домен",
"Short Link": "Короткая ссылка",
"Country Code": "Код страны",
"Country-Specific Redirect URL": "URL-адрес перенаправления для конкретных стран",
"Original URL": "Оригинальный URL",
"Title": "Заголовок",
"Folder": "Папка",
"Enable Cloaking": "Включить маскирование",
"Password": "Пароль",
"Redirect Type": "Тип перенаправления",
"Expiration Date": "Срок действия",
"Expired Redirect URL": "Устаревший URL перенаправления",
"Tags": "Теги",
"UTM Source": "Источник UTM",
"UTM Medium": "Средний UTM",
"UTM Campaign": "UTM Кампания",
"UTM Term": "Термин UTM",
"UTM Content": "Содержимое UTM",
"Time to Live (in seconds)": "Время жизни (в секундах)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Время создания",
"Clicks Limit": "Лимит кликов",
"Show Contact for Password Recovery": "Показать контакт для восстановления пароля",
"Skip Query String Merge": "Объединение строк пропущенных запросов",
"Archive Link": "Ссылка на архив",
"Split URL": "Разделить URL",
"Split Percent": "Процент сплита",
"Adroll Integration ID": "Интеграция с Adroll ID",
"Facebook Integration ID": "Идентификатор интеграции Facebook",
"Google Analytics ID": "Идентификатор Google Analytics",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Разрешить дубликаты",
"Path": "Путь",
"Link ID": "Link ID",
"Time Period": "Период времени",
"Start Date": "Дата начала",
"End Date": "Дата окончания",
"Timezone": "Timezone",
"Chart Interval": "Интервал графика",
"Link Path": "Путь ссылки",
"Link IDs": "Link IDs",
"Limit": "Лимит",
"Link ID Filter": "Фильтр ID ссылки",
"Exact Creation Time": "Точное время создания",
"Before Date": "До даты",
"After Date": "После даты",
"Date Sort Order": "Порядок сортировки даты",
"Page Token": "Токен страницы",
"Custom Path (Slug)": "Пользовательский путь (Slug)",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"Select the domain to use for the link": "Выберите домен, который будет использоваться для ссылки",
"Select the short link from the domain": "Выберите короткую ссылку из домена",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "Код страны ISO 3166-1 alpha-2 (например, US, GB, CA, IN). Должно быть ровно 2 символа.",
"The destination URL when users from this country access the link. Must be a valid URL.": "URL назначения, когда пользователи из этой страны имеют доступ к ссылке. Должен быть корректным URL.",
"Select the folder to add the link to.": "Выберите папку для добавления ссылки.",
"The HTTP status code for the redirect. The default is 302 (Found).": "Код состояния HTTP для перенаправления. По умолчанию 302 (Found).",
"The date and time when the link will become inactive.": "Дата и время, когда ссылка станет неактивной.",
"Array of tags for the link": "Массив тегов для ссылки",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ Внимание: Ссылка будет удалена через много секунд. Это действие нельзя отменить. Используйте с крайней осторожностью.",
"Overrides the creation time of the link.": "Переопределяет время создания ссылки.",
"Disable link after specified number of clicks (minimum: 1)": "Отключить ссылку после указанного количества кликов (минимум: 1)",
"Split URL percentage (1-100)": "Разделить URL в процентах (1-100)",
"Custom path for the short link (optional).": "Пользовательский путь для короткой ссылки (необязательно).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "ID короткой ссылки, которую вы хотите удалить (например, lnk_61Mb_0dnRUg3vtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Необязательный URL-адрес для перенаправления пользователей по истечении срока действия ссылки.",
"Select the domain to get statistics for": "Выберите домен для получения статистики",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Выберите предопределенный временной интервал или выберите \"Пользовательский\", чтобы установить определенные даты.",
"Start date for statistics (required when period is \"Custom\").": "Дата начала статистики (требуется когда период «Пользовательский»).",
"End date for statistics (required when period is \"Custom\").": "Дата окончания статистики (требуется когда период \"Пользовательский\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Часовой пояс для статистики (например, UTC, America/New_York, Europe/London). По умолчанию UTC.",
"Granularity for click statistics chart data.": "Granularity for click statistics chart data.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "Путь/slug короткой ссылки (например, \"abc123\", \"my-link\"). Не включайте в себя домен или слэш.",
"Select the domain containing the links": "Выберите домен, содержащий ссылки",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "Список идентификаторов ссылок для получения статистики кликов (например, lnk_61Mb_0dnRUg3vtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Дата начала клика статистики (необязательно).",
"End date for click statistics (optional).": "Дата окончания для клика статистика (необязательно).",
"Select the domain to retrieve links from": "Выберите домен для получения ссылок из",
"Number of results to return (1-150). Default is 50.": "Количество результатов (1-150). По умолчанию 50.",
"Filter by specific link ID (optional).": "Фильтр по идентификатору ссылки (необязательно).",
"Filter by exact creation time (ISO format or timestamp).": "Фильтр по точному времени создания (формат ISO или временная метка).",
"Return links created before this date and time.": "Возврат ссылок, созданных до этой даты и времени.",
"Return links created after this date and time.": "Возврат ссылок, созданных после этой даты и времени.",
"Order links by creation date.": "Ссылки на заказ по дате создания.",
"Token for paginated results (get this from previous response).": "Токен для пагинальных результатов (получить это из предыдущего ответа).",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"301 (Moved Permanently)": "301 (постоянно перемещенный)",
"302 (Found)": "302 (круглый)",
"303 (See Other)": "303 (см. прочее)",
"307 (Temporary Redirect)": "307 (Временное перенаправление)",
"308 (Permanent Redirect)": "308 (постоянное перенаправление)",
"Today": "Сегодня",
"Yesterday": "Вчера",
"Last 7 Days": "Последние 7 дней",
"Last 30 Days": "Последние 30 дней",
"This Month": "В этом месяце",
"Last Month": "Прошлый месяц",
"Custom Date Range": "Пользовательский диапазон дат",
"Hour": "Часы",
"Day": "День",
"Week": "Неделя",
"Month": "Месяц",
"Ascending (Oldest First)": "По возрастанию (старейший)",
"Descending (Newest First)": "По убыванию (сначала новые)",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Link Created": "Новая ссылка создана",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Запускает при создании новой короткой ссылки на домене. Полезно для синхронизации вновь созданных ссылок на другие системы.",
"Polling Interval": "Интервал опроса",
"Select the domain to monitor for new links": "Выберите домен для отслеживания новых ссылок",
"How often to check for new links. More frequent polling may hit rate limits.": "Как часто проверяются новые ссылки. Более частые опросы могут нанести вред лимитам.",
"Every 1 minute": "Каждую минуту",
"Every 5 minutes": "Каждые 5 минут",
"Every 15 minutes": "Каждые 15 минут",
"Every 30 minutes": "Каждые 30 минут",
"Every hour": "Каждый час"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "API Key",
"Enter your Short.io API Key": "Enter your Short.io API Key",
"Create Country Targeting Rule": "Create Country Targeting Rule",
"Create Short Link": "Create Short Link",
"Delete Short Link": "Delete Short Link",
"Expire Short Link": "Expire Short Link",
"Domain Statistics": "Domain Statistics",
"Get Link by Path": "Get Link by Path",
"Get Link Clicks": "Get Link Clicks",
"List Links": "List Links",
"Update Short Link": "Update Short Link",
"Custom API Call": "Custom API Call",
"Set geographic targeting rules for a link with specific destination per country.": "Set geographic targeting rules for a link with specific destination per country.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)",
"Permanently delete a short link by its unique link ID.": "Permanently delete a short link by its unique link ID.",
"Set an expiration date or click limit to deactivate a short link.": "Set an expiration date or click limit to deactivate a short link.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Retrieve usage stats (clicks, conversions) for a domain within a time period.",
"Retrieve detailed information about a short link using its domain and path.": "Retrieve detailed information about a short link using its domain and path.",
"Retrieve click statistics for specific short links by their IDs.": "Retrieve click statistics for specific short links by their IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Retrieve all links on a domain, with pagination and date-range filters.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Update an existing short link's original URL, path, title, or other properties using its link ID.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Domain": "Domain",
"Short Link": "Short Link",
"Country Code": "Country Code",
"Country-Specific Redirect URL": "Country-Specific Redirect URL",
"Original URL": "Original URL",
"Title": "Title",
"Folder": "Folder",
"Enable Cloaking": "Enable Cloaking",
"Password": "Password",
"Redirect Type": "Redirect Type",
"Expiration Date": "Expiration Date",
"Expired Redirect URL": "Expired Redirect URL",
"Tags": "Tags",
"UTM Source": "UTM Source",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTM Campaign",
"UTM Term": "UTM Term",
"UTM Content": "UTM Content",
"Time to Live (in seconds)": "Time to Live (in seconds)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Creation Time",
"Clicks Limit": "Clicks Limit",
"Show Contact for Password Recovery": "Show Contact for Password Recovery",
"Skip Query String Merge": "Skip Query String Merge",
"Archive Link": "Archive Link",
"Split URL": "Split URL",
"Split Percent": "Split Percent",
"Adroll Integration ID": "Adroll Integration ID",
"Facebook Integration ID": "Facebook Integration ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Allow Duplicates",
"Path": "Path",
"Link ID": "Link ID",
"Time Period": "Time Period",
"Start Date": "Start Date",
"End Date": "End Date",
"Timezone": "Timezone",
"Chart Interval": "Chart Interval",
"Link Path": "Link Path",
"Link IDs": "Link IDs",
"Limit": "Limit",
"Link ID Filter": "Link ID Filter",
"Exact Creation Time": "Exact Creation Time",
"Before Date": "Before Date",
"After Date": "After Date",
"Date Sort Order": "Date Sort Order",
"Page Token": "Page Token",
"Custom Path (Slug)": "Custom Path (Slug)",
"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)",
"Select the domain to use for the link": "Select the domain to use for the link",
"Select the short link from the domain": "Select the short link from the domain",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.",
"The destination URL when users from this country access the link. Must be a valid URL.": "The destination URL when users from this country access the link. Must be a valid URL.",
"Select the folder to add the link to.": "Select the folder to add the link to.",
"The HTTP status code for the redirect. The default is 302 (Found).": "The HTTP status code for the redirect. The default is 302 (Found).",
"The date and time when the link will become inactive.": "The date and time when the link will become inactive.",
"Array of tags for the link": "Array of tags for the link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.",
"Overrides the creation time of the link.": "Overrides the creation time of the link.",
"Disable link after specified number of clicks (minimum: 1)": "Disable link after specified number of clicks (minimum: 1)",
"Split URL percentage (1-100)": "Split URL percentage (1-100)",
"Custom path for the short link (optional).": "Custom path for the short link (optional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Optional URL to redirect users when the link has expired.",
"Select the domain to get statistics for": "Select the domain to get statistics for",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Select a predefined time interval or choose \"Custom\" to set specific dates.",
"Start date for statistics (required when period is \"Custom\").": "Start date for statistics (required when period is \"Custom\").",
"End date for statistics (required when period is \"Custom\").": "End date for statistics (required when period is \"Custom\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.",
"Granularity for click statistics chart data.": "Granularity for click statistics chart data.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.",
"Select the domain containing the links": "Select the domain containing the links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Start date for click statistics (optional).",
"End date for click statistics (optional).": "End date for click statistics (optional).",
"Select the domain to retrieve links from": "Select the domain to retrieve links from",
"Number of results to return (1-150). Default is 50.": "Number of results to return (1-150). Default is 50.",
"Filter by specific link ID (optional).": "Filter by specific link ID (optional).",
"Filter by exact creation time (ISO format or timestamp).": "Filter by exact creation time (ISO format or timestamp).",
"Return links created before this date and time.": "Return links created before this date and time.",
"Return links created after this date and time.": "Return links created after this date and time.",
"Order links by creation date.": "Order links by creation date.",
"Token for paginated results (get this from previous response).": "Token for paginated results (get this from previous response).",
"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..",
"301 (Moved Permanently)": "301 (Moved Permanently)",
"302 (Found)": "302 (Found)",
"303 (See Other)": "303 (See Other)",
"307 (Temporary Redirect)": "307 (Temporary Redirect)",
"308 (Permanent Redirect)": "308 (Permanent Redirect)",
"Today": "Today",
"Yesterday": "Yesterday",
"Last 7 Days": "Last 7 Days",
"Last 30 Days": "Last 30 Days",
"This Month": "This Month",
"Last Month": "Last Month",
"Custom Date Range": "Custom Date Range",
"Hour": "Hour",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Ascending (Oldest First)": "Ascending (Oldest First)",
"Descending (Newest First)": "Descending (Newest First)",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Link Created": "New Link Created",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.",
"Polling Interval": "Polling Interval",
"Select the domain to monitor for new links": "Select the domain to monitor for new links",
"How often to check for new links. More frequent polling may hit rate limits.": "How often to check for new links. More frequent polling may hit rate limits.",
"Every 1 minute": "Every 1 minute",
"Every 5 minutes": "Every 5 minutes",
"Every 15 minutes": "Every 15 minutes",
"Every 30 minutes": "Every 30 minutes",
"Every hour": "Every hour"
}

View File

@@ -0,0 +1,150 @@
{
"Short.io": "Short.io",
"API Key": "API Key",
"Enter your Short.io API Key": "Enter your Short.io API Key",
"Create Country Targeting Rule": "Create Country Targeting Rule",
"Create Short Link": "Create Short Link",
"Delete Short Link": "Delete Short Link",
"Expire Short Link": "Expire Short Link",
"Domain Statistics": "Domain Statistics",
"Get Link by Path": "Get Link by Path",
"Get Link Clicks": "Get Link Clicks",
"List Links": "List Links",
"Update Short Link": "Update Short Link",
"Custom API Call": "Custom API Call",
"Set geographic targeting rules for a link with specific destination per country.": "Set geographic targeting rules for a link with specific destination per country.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)",
"Permanently delete a short link by its unique link ID.": "Permanently delete a short link by its unique link ID.",
"Set an expiration date or click limit to deactivate a short link.": "Set an expiration date or click limit to deactivate a short link.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Retrieve usage stats (clicks, conversions) for a domain within a time period.",
"Retrieve detailed information about a short link using its domain and path.": "Retrieve detailed information about a short link using its domain and path.",
"Retrieve click statistics for specific short links by their IDs.": "Retrieve click statistics for specific short links by their IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Retrieve all links on a domain, with pagination and date-range filters.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Update an existing short link's original URL, path, title, or other properties using its link ID.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Domain": "Domain",
"Short Link": "Short Link",
"Country Code": "Country Code",
"Country-Specific Redirect URL": "Country-Specific Redirect URL",
"Original URL": "Original URL",
"Title": "Title",
"Folder": "Folder",
"Enable Cloaking": "Enable Cloaking",
"Password": "Password",
"Redirect Type": "Redirect Type",
"Expiration Date": "Expiration Date",
"Expired Redirect URL": "Expired Redirect URL",
"Tags": "Tags",
"UTM Source": "UTM Source",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTM Campaign",
"UTM Term": "UTM Term",
"UTM Content": "UTM Content",
"Time to Live (in seconds)": "Time to Live (in seconds)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Creation Time",
"Clicks Limit": "Clicks Limit",
"Show Contact for Password Recovery": "Show Contact for Password Recovery",
"Skip Query String Merge": "Skip Query String Merge",
"Archive Link": "Archive Link",
"Split URL": "Split URL",
"Split Percent": "Split Percent",
"Adroll Integration ID": "Adroll Integration ID",
"Facebook Integration ID": "Facebook Integration ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Allow Duplicates",
"Path": "Path",
"Link ID": "Link ID",
"Time Period": "Time Period",
"Start Date": "Start Date",
"End Date": "End Date",
"Timezone": "Timezone",
"Chart Interval": "Chart Interval",
"Link Path": "Link Path",
"Link IDs": "Link IDs",
"Limit": "Limit",
"Link ID Filter": "Link ID Filter",
"Exact Creation Time": "Exact Creation Time",
"Before Date": "Before Date",
"After Date": "After Date",
"Date Sort Order": "Date Sort Order",
"Page Token": "Page Token",
"Custom Path (Slug)": "Custom Path (Slug)",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Select the domain to use for the link": "Select the domain to use for the link",
"Select the short link from the domain": "Select the short link from the domain",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.",
"The destination URL when users from this country access the link. Must be a valid URL.": "The destination URL when users from this country access the link. Must be a valid URL.",
"Select the folder to add the link to.": "Select the folder to add the link to.",
"The HTTP status code for the redirect. The default is 302 (Found).": "The HTTP status code for the redirect. The default is 302 (Found).",
"The date and time when the link will become inactive.": "The date and time when the link will become inactive.",
"Array of tags for the link": "Array of tags for the link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.",
"Overrides the creation time of the link.": "Overrides the creation time of the link.",
"Disable link after specified number of clicks (minimum: 1)": "Disable link after specified number of clicks (minimum: 1)",
"Split URL percentage (1-100)": "Split URL percentage (1-100)",
"Custom path for the short link (optional).": "Custom path for the short link (optional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Optional URL to redirect users when the link has expired.",
"Select the domain to get statistics for": "Select the domain to get statistics for",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Select a predefined time interval or choose \"Custom\" to set specific dates.",
"Start date for statistics (required when period is \"Custom\").": "Start date for statistics (required when period is \"Custom\").",
"End date for statistics (required when period is \"Custom\").": "End date for statistics (required when period is \"Custom\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.",
"Granularity for click statistics chart data.": "Granularity for click statistics chart data.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.",
"Select the domain containing the links": "Select the domain containing the links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Start date for click statistics (optional).",
"End date for click statistics (optional).": "End date for click statistics (optional).",
"Select the domain to retrieve links from": "Select the domain to retrieve links from",
"Number of results to return (1-150). Default is 50.": "Number of results to return (1-150). Default is 50.",
"Filter by specific link ID (optional).": "Filter by specific link ID (optional).",
"Filter by exact creation time (ISO format or timestamp).": "Filter by exact creation time (ISO format or timestamp).",
"Return links created before this date and time.": "Return links created before this date and time.",
"Return links created after this date and time.": "Return links created after this date and time.",
"Order links by creation date.": "Order links by creation date.",
"Token for paginated results (get this from previous response).": "Token for paginated results (get this from previous response).",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"301 (Moved Permanently)": "301 (Moved Permanently)",
"302 (Found)": "302 (Found)",
"303 (See Other)": "303 (See Other)",
"307 (Temporary Redirect)": "307 (Temporary Redirect)",
"308 (Permanent Redirect)": "308 (Permanent Redirect)",
"Today": "Today",
"Yesterday": "Yesterday",
"Last 7 Days": "Last 7 Days",
"Last 30 Days": "Last 30 Days",
"This Month": "This Month",
"Last Month": "Last Month",
"Custom Date Range": "Custom Date Range",
"Hour": "Hour",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Ascending (Oldest First)": "Ascending (Oldest First)",
"Descending (Newest First)": "Descending (Newest First)",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Link Created": "New Link Created",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.",
"Polling Interval": "Polling Interval",
"Select the domain to monitor for new links": "Select the domain to monitor for new links",
"How often to check for new links. More frequent polling may hit rate limits.": "How often to check for new links. More frequent polling may hit rate limits.",
"Every 1 minute": "Every 1 minute",
"Every 5 minutes": "Every 5 minutes",
"Every 15 minutes": "Every 15 minutes",
"Every 30 minutes": "Every 30 minutes",
"Every hour": "Every hour"
}

View File

@@ -0,0 +1,151 @@
{
"API Key": "API 密钥",
"Enter your Short.io API Key": "Enter your Short.io API Key",
"Create Country Targeting Rule": "Create Country Targeting Rule",
"Create Short Link": "Create Short Link",
"Delete Short Link": "Delete Short Link",
"Expire Short Link": "Expire Short Link",
"Domain Statistics": "Domain Statistics",
"Get Link by Path": "Get Link by Path",
"Get Link Clicks": "Get Link Clicks",
"List Links": "List Links",
"Update Short Link": "Update Short Link",
"Custom API Call": "自定义 API 呼叫",
"Set geographic targeting rules for a link with specific destination per country.": "Set geographic targeting rules for a link with specific destination per country.",
"Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)": "Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)",
"Permanently delete a short link by its unique link ID.": "Permanently delete a short link by its unique link ID.",
"Set an expiration date or click limit to deactivate a short link.": "Set an expiration date or click limit to deactivate a short link.",
"Retrieve usage stats (clicks, conversions) for a domain within a time period.": "Retrieve usage stats (clicks, conversions) for a domain within a time period.",
"Retrieve detailed information about a short link using its domain and path.": "Retrieve detailed information about a short link using its domain and path.",
"Retrieve click statistics for specific short links by their IDs.": "Retrieve click statistics for specific short links by their IDs.",
"Retrieve all links on a domain, with pagination and date-range filters.": "Retrieve all links on a domain, with pagination and date-range filters.",
"Update an existing short link's original URL, path, title, or other properties using its link ID.": "Update an existing short link's original URL, path, title, or other properties using its link ID.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Domain": "Domain",
"Short Link": "Short Link",
"Country Code": "Country Code",
"Country-Specific Redirect URL": "Country-Specific Redirect URL",
"Original URL": "Original URL",
"Title": "标题",
"Folder": "Folder",
"Enable Cloaking": "Enable Cloaking",
"Password": "密码",
"Redirect Type": "Redirect Type",
"Expiration Date": "Expiration Date",
"Expired Redirect URL": "Expired Redirect URL",
"Tags": "标签",
"UTM Source": "UTM Source",
"UTM Medium": "UTM Medium",
"UTM Campaign": "UTM Campaign",
"UTM Term": "UTM Term",
"UTM Content": "UTM Content",
"Time to Live (in seconds)": "Time to Live (in seconds)",
"Android URL": "Android URL",
"iPhone URL": "iPhone URL",
"Creation Time": "Creation Time",
"Clicks Limit": "Clicks Limit",
"Show Contact for Password Recovery": "Show Contact for Password Recovery",
"Skip Query String Merge": "Skip Query String Merge",
"Archive Link": "Archive Link",
"Split URL": "Split URL",
"Split Percent": "Split Percent",
"Adroll Integration ID": "Adroll Integration ID",
"Facebook Integration ID": "Facebook Integration ID",
"Google Analytics ID": "Google Analytics ID",
"Google Tag Manager ID": "Google Tag Manager ID",
"Allow Duplicates": "Allow Duplicates",
"Path": "Path",
"Link ID": "Link ID",
"Time Period": "Time Period",
"Start Date": "Start Date",
"End Date": "End Date",
"Timezone": "Timezone",
"Chart Interval": "Chart Interval",
"Link Path": "Link Path",
"Link IDs": "Link IDs",
"Limit": "Limit",
"Link ID Filter": "Link ID Filter",
"Exact Creation Time": "Exact Creation Time",
"Before Date": "Before Date",
"After Date": "After Date",
"Date Sort Order": "Date Sort Order",
"Page Token": "Page Token",
"Custom Path (Slug)": "Custom Path (Slug)",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Select the domain to use for the link": "Select the domain to use for the link",
"Select the short link from the domain": "Select the short link from the domain",
"ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.": "ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.",
"The destination URL when users from this country access the link. Must be a valid URL.": "The destination URL when users from this country access the link. Must be a valid URL.",
"Select the folder to add the link to.": "Select the folder to add the link to.",
"The HTTP status code for the redirect. The default is 302 (Found).": "The HTTP status code for the redirect. The default is 302 (Found).",
"The date and time when the link will become inactive.": "The date and time when the link will become inactive.",
"Array of tags for the link": "Array of tags for the link",
"⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.": "⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.",
"Overrides the creation time of the link.": "Overrides the creation time of the link.",
"Disable link after specified number of clicks (minimum: 1)": "Disable link after specified number of clicks (minimum: 1)",
"Split URL percentage (1-100)": "Split URL percentage (1-100)",
"Custom path for the short link (optional).": "Custom path for the short link (optional).",
"The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)": "The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)",
"Optional URL to redirect users when the link has expired.": "Optional URL to redirect users when the link has expired.",
"Select the domain to get statistics for": "Select the domain to get statistics for",
"Select a predefined time interval or choose \"Custom\" to set specific dates.": "Select a predefined time interval or choose \"Custom\" to set specific dates.",
"Start date for statistics (required when period is \"Custom\").": "Start date for statistics (required when period is \"Custom\").",
"End date for statistics (required when period is \"Custom\").": "End date for statistics (required when period is \"Custom\").",
"Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.": "Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.",
"Granularity for click statistics chart data.": "Granularity for click statistics chart data.",
"The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.": "The path/slug of the short link (e.g., \"abc123\", \"my-link\"). Do not include domain or slashes.",
"Select the domain containing the links": "Select the domain containing the links",
"List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).": "List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).",
"Start date for click statistics (optional).": "Start date for click statistics (optional).",
"End date for click statistics (optional).": "End date for click statistics (optional).",
"Select the domain to retrieve links from": "Select the domain to retrieve links from",
"Number of results to return (1-150). Default is 50.": "Number of results to return (1-150). Default is 50.",
"Filter by specific link ID (optional).": "Filter by specific link ID (optional).",
"Filter by exact creation time (ISO format or timestamp).": "Filter by exact creation time (ISO format or timestamp).",
"Return links created before this date and time.": "Return links created before this date and time.",
"Return links created after this date and time.": "Return links created after this date and time.",
"Order links by creation date.": "Order links by creation date.",
"Token for paginated results (get this from previous response).": "Token for paginated results (get this from previous response).",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"301 (Moved Permanently)": "301 (Moved Permanently)",
"302 (Found)": "302 (Found)",
"303 (See Other)": "303 (See Other)",
"307 (Temporary Redirect)": "307 (Temporary Redirect)",
"308 (Permanent Redirect)": "308 (Permanent Redirect)",
"Today": "今日:",
"Yesterday": "Yesterday",
"Last 7 Days": "Last 7 Days",
"Last 30 Days": "Last 30 Days",
"This Month": "This Month",
"Last Month": "上月",
"Custom Date Range": "Custom Date Range",
"Hour": "Hour",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Ascending (Oldest First)": "Ascending (Oldest First)",
"Descending (Newest First)": "Descending (Newest First)",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Link Created": "New Link Created",
"Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.": "Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.",
"Polling Interval": "Polling Interval",
"Select the domain to monitor for new links": "Select the domain to monitor for new links",
"How often to check for new links. More frequent polling may hit rate limits.": "How often to check for new links. More frequent polling may hit rate limits.",
"Every 1 minute": "Every 1 minute",
"Every 5 minutes": "Every 5 minutes",
"Every 15 minutes": "Every 15 minutes",
"Every 30 minutes": "Every 30 minutes",
"Every hour": "Every hour"
}

View File

@@ -0,0 +1,45 @@
import {
createCustomApiCallAction
} from '@activepieces/pieces-common';
import { createPiece } from '@activepieces/pieces-framework';
import { shortIoAuth } from './lib/common/auth';
import { createCountryTargetingRuleAction } from './lib/actions/create-country-targeting-for-a-link';
import { createShortLinkAction } from './lib/actions/create-short-link';
import { deleteShortLinkAction } from './lib/actions/delete-short-link';
import { expireShortLinkAction } from './lib/actions/expire-short-link';
import { domainStatisticsAction } from './lib/actions/domain-statistics';
import { getLinkByPathAction } from './lib/actions/get-link-by-path';
import { getLinkClicksAction } from './lib/actions/get-link-clicks';
import { listLinksAction } from './lib/actions/list-links';
import { updateShortLinkAction } from './lib/actions/update-short-link';
import { newLinkCreatedTrigger } from './lib/triggers/new-link-created';
export const shortIo = createPiece({
displayName: 'Short.io',
auth: shortIoAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/short-io.png',
authors: ['aryel780'],
actions: [
createCountryTargetingRuleAction,
createShortLinkAction,
deleteShortLinkAction,
expireShortLinkAction,
domainStatisticsAction,
getLinkByPathAction,
getLinkClicksAction,
listLinksAction,
updateShortLinkAction,
createCustomApiCallAction({
auth: shortIoAuth,
baseUrl: () => 'https://api.short.io',
authMapping: async (auth) => {
const { apiKey } = auth.props;
return {
Authorization: apiKey,
};
},
}),
],
triggers: [newLinkCreatedTrigger],
});

View File

@@ -0,0 +1,100 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown, linkIdDropdown } from '../common/props';
export const createCountryTargetingRuleAction = createAction({
auth: shortIoAuth,
name: 'create-country-targeting-rule',
displayName: 'Create Country Targeting Rule',
description: 'Set geographic targeting rules for a link with specific destination per country.',
props: {
domain: domainIdDropdown,
linkId: linkIdDropdown,
country: Property.ShortText({
displayName: 'Country Code',
description: 'ISO 3166-1 alpha-2 country code (e.g., US, GB, CA, IN). Must be exactly 2 characters.',
required: true,
}),
originalURL: Property.ShortText({
displayName: 'Country-Specific Redirect URL',
description: 'The destination URL when users from this country access the link. Must be a valid URL.',
required: true,
}),
},
async run({ propsValue, auth }) {
const { linkId, domain: domainString, country, originalURL } = propsValue;
if (!country || country.trim().length !== 2) {
throw new Error('Country code must be exactly 2 characters (e.g., US, GB, CA)');
}
const countryCode = country.trim().toUpperCase();
try {
new URL(originalURL);
} catch (error) {
throw new Error('Invalid URL format. Please provide a valid URL starting with http:// or https://');
}
const query: Record<string, string> = {};
if (domainString) {
const domainObject = JSON.parse(domainString as string);
query['domainId'] = String(domainObject.id);
}
const body = {
country: countryCode,
originalURL,
};
try {
const response = await shortIoApiCall({
method: HttpMethod.POST,
auth,
resourceUri: `/link_country/${linkId}`,
query,
body,
});
return {
success: true,
message: `Country targeting rule for ${countryCode} created successfully`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check the country code format and URL validity.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Short link not found. Please check the link ID and try again.'
);
}
if (error.message.includes('409')) {
throw new Error(
`A country targeting rule for ${countryCode} already exists for this link.`
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to create country targeting rule: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,287 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown, folderIdDropdown } from '../common/props';
export const createShortLinkAction = createAction({
auth: shortIoAuth,
name: 'create-short-link',
displayName: 'Create Short Link',
description:
'Create a new short link with optional parameters (title, UTM tags, expiration, cloaking, etc.)',
props: {
originalURL: Property.ShortText({
displayName: 'Original URL',
required: true,
}),
domain: domainIdDropdown,
title: Property.ShortText({
displayName: 'Title',
required: false,
}),
folderId: folderIdDropdown,
cloaking: Property.Checkbox({
displayName: 'Enable Cloaking',
required: false,
}),
password: Property.ShortText({
displayName: 'Password',
required: false,
}),
redirectType: Property.StaticDropdown({
displayName: 'Redirect Type',
description:
'The HTTP status code for the redirect. The default is 302 (Found).',
required: false,
options: {
disabled: false,
options: [
{ label: '301 (Moved Permanently)', value: '301' },
{ label: '302 (Found)', value: '302' },
{ label: '303 (See Other)', value: '303' },
{ label: '307 (Temporary Redirect)', value: '307' },
{ label: '308 (Permanent Redirect)', value: '308' },
],
},
}),
expiresAt: Property.DateTime({
displayName: 'Expiration Date',
description: 'The date and time when the link will become inactive.',
required: false,
}),
expiredURL: Property.ShortText({
displayName: 'Expired Redirect URL',
required: false,
}),
tags: Property.Array({
displayName: 'Tags',
description: 'Array of tags for the link',
required: false,
}),
utmSource: Property.ShortText({
displayName: 'UTM Source',
required: false,
}),
utmMedium: Property.ShortText({
displayName: 'UTM Medium',
required: false,
}),
utmCampaign: Property.ShortText({
displayName: 'UTM Campaign',
required: false,
}),
utmTerm: Property.ShortText({
displayName: 'UTM Term',
required: false,
}),
utmContent: Property.ShortText({
displayName: 'UTM Content',
required: false,
}),
ttl: Property.Number({
displayName: 'Time to Live (in seconds)',
description:
'⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.',
required: false,
}),
androidURL: Property.ShortText({
displayName: 'Android URL',
required: false,
}),
iphoneURL: Property.ShortText({
displayName: 'iPhone URL',
required: false,
}),
createdAt: Property.DateTime({
displayName: 'Creation Time',
description: 'Overrides the creation time of the link.',
required: false,
}),
clicksLimit: Property.Number({
displayName: 'Clicks Limit',
description: 'Disable link after specified number of clicks (minimum: 1)',
required: false,
}),
passwordContact: Property.Checkbox({
displayName: 'Show Contact for Password Recovery',
required: false,
}),
skipQS: Property.Checkbox({
displayName: 'Skip Query String Merge',
required: false,
}),
archived: Property.Checkbox({
displayName: 'Archive Link',
required: false,
}),
splitURL: Property.ShortText({
displayName: 'Split URL',
required: false,
}),
splitPercent: Property.Number({
displayName: 'Split Percent',
description: 'Split URL percentage (1-100)',
required: false,
}),
integrationAdroll: Property.ShortText({
displayName: 'Adroll Integration ID',
required: false,
}),
integrationFB: Property.ShortText({
displayName: 'Facebook Integration ID',
required: false,
}),
integrationGA: Property.ShortText({
displayName: 'Google Analytics ID',
required: false,
}),
integrationGTM: Property.ShortText({
displayName: 'Google Tag Manager ID',
required: false,
}),
allowDuplicates: Property.Checkbox({
displayName: 'Allow Duplicates',
required: false,
}),
path: Property.ShortText({
displayName: 'Path',
description: 'Custom path for the short link (optional).',
required: false,
}),
},
async run({ propsValue, auth }) {
const {
originalURL,
domain: domainString,
path,
title,
cloaking,
password,
redirectType,
expiresAt,
expiredURL,
tags,
utmSource,
utmMedium,
utmCampaign,
utmTerm,
utmContent,
ttl,
androidURL,
iphoneURL,
createdAt,
clicksLimit,
passwordContact,
skipQS,
archived,
splitURL,
splitPercent,
integrationAdroll,
integrationFB,
integrationGA,
integrationGTM,
allowDuplicates,
folderId,
} = propsValue;
// Input validation
if (clicksLimit && clicksLimit < 1) {
throw new Error('Clicks limit must be at least 1');
}
if (splitPercent && (splitPercent < 1 || splitPercent > 100)) {
throw new Error('Split percent must be between 1 and 100');
}
if (redirectType && !['301', '302', '303', '307', '308'].includes(redirectType)) {
throw new Error('Invalid redirect type. Must be one of: 301, 302, 303, 307, 308');
}
const domainObject = JSON.parse(domainString as string);
const body: Record<string, unknown> = {
originalURL,
domain: domainObject.hostname,
};
const optionalParams = {
path,
title,
cloaking,
password,
redirectType,
expiresAt,
expiredURL,
tags,
utmSource,
utmMedium,
utmCampaign,
utmTerm,
utmContent,
ttl: ttl ? ttl * 1000 : undefined,
androidURL,
iphoneURL,
createdAt,
clicksLimit,
passwordContact,
skipQS,
archived,
splitURL,
splitPercent,
integrationAdroll,
integrationFB,
integrationGA,
integrationGTM,
allowDuplicates,
folderId,
};
for (const [key, value] of Object.entries(optionalParams)) {
if (value !== null && value !== undefined && value !== '') {
body[key] = value;
}
}
try {
const response = await shortIoApiCall({
method: HttpMethod.POST,
auth,
resourceUri: '/links',
body,
});
return {
success: true,
message: 'Short link created successfully',
data: response,
};
} catch (error: any) {
if (error.message.includes('409')) {
throw new Error(
'A short link with this path already exists but points to a different original URL.'
);
}
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your input values and try again.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to create short link: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,65 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
export const deleteShortLinkAction = createAction({
auth: shortIoAuth,
name: 'delete-short-link',
displayName: 'Delete Short Link',
description: 'Permanently delete a short link by its unique link ID.',
props: {
linkId: Property.ShortText({
displayName: 'Link ID',
description: 'The ID of the short link you want to delete (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6)',
required: true,
}),
},
async run({ propsValue, auth }) {
const { linkId } = propsValue;
if (!linkId || linkId.trim() === '') {
throw new Error('Link ID is required and cannot be empty');
}
try {
const response = await shortIoApiCall({
method: HttpMethod.DELETE,
auth,
resourceUri: `/links/${linkId}`,
});
return {
success: true,
message: `Short link with ID ${linkId} deleted successfully`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request. Please check the link ID format and try again.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('404')) {
throw new Error(
`Short link with ID ${linkId} not found. It may have already been deleted.`
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to delete short link: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,153 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown } from '../common/props';
export const domainStatisticsAction = createAction({
auth: shortIoAuth,
name: 'get-domain-statistics',
displayName: 'Domain Statistics',
description: 'Retrieve usage stats (clicks, conversions) for a domain within a time period.',
props: {
domainId: {
...domainIdDropdown,
required: true,
description: 'Select the domain to get statistics for',
},
period: Property.StaticDropdown({
displayName: 'Time Period',
description: 'Select a predefined time interval or choose "Custom" to set specific dates.',
required: true,
defaultValue: 'last30',
options: {
disabled: false,
options: [
{ label: 'Today', value: 'today' },
{ label: 'Yesterday', value: 'yesterday' },
{ label: 'Last 7 Days', value: 'last7' },
{ label: 'Last 30 Days', value: 'last30' },
{ label: 'This Month', value: 'thisMonth' },
{ label: 'Last Month', value: 'lastMonth' },
{ label: 'Custom Date Range', value: 'custom' },
],
},
}),
startDate: Property.DateTime({
displayName: 'Start Date',
description: 'Start date for statistics (required when period is "Custom").',
required: false,
}),
endDate: Property.DateTime({
displayName: 'End Date',
description: 'End date for statistics (required when period is "Custom").',
required: false,
}),
tz: Property.ShortText({
displayName: 'Timezone',
description: 'Timezone for statistics (e.g., UTC, America/New_York, Europe/London). Defaults to UTC.',
required: false,
}),
clicksChartInterval: Property.StaticDropdown({
displayName: 'Chart Interval',
description: 'Granularity for click statistics chart data.',
required: false,
options: {
disabled: false,
options: [
{ label: 'Hour', value: 'hour' },
{ label: 'Day', value: 'day' },
{ label: 'Week', value: 'week' },
{ label: 'Month', value: 'month' },
],
},
}),
},
async run({ propsValue, auth }) {
const { domainId: domainString, period, startDate, endDate, tz, clicksChartInterval } = propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
const domainObject = JSON.parse(domainString as string);
if (period === 'custom') {
if (!startDate || !endDate) {
throw new Error('Start Date and End Date are both required when using custom period.');
}
const start = new Date(startDate);
const end = new Date(endDate);
if (start >= end) {
throw new Error('Start date must be before end date.');
}
}
if (tz && tz.trim() !== '') {
const tzValue = tz.trim();
if (tzValue.length < 3 || tzValue.includes(' ')) {
throw new Error('Invalid timezone format. Use standard timezone names like UTC, America/New_York, Europe/London.');
}
}
const query: Record<string, string> = {
period,
};
if (period === 'custom' && startDate && endDate) {
query['startDate'] = new Date(startDate).toISOString().split('T')[0];
query['endDate'] = new Date(endDate).toISOString().split('T')[0];
}
if (tz && tz.trim() !== '') query['tz'] = tz.trim();
if (clicksChartInterval) query['clicksChartInterval'] = clicksChartInterval;
try {
const response = await shortIoApiCall({
method: HttpMethod.GET,
auth,
url: `https://statistics.short.io/statistics/domain/${domainObject.id}`,
query,
});
const stats = response as any;
const clicks = stats['clicks'] || 0;
const links = stats['links'] || 0;
const periodLabel = period === 'custom' ? 'custom period' : period.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
return {
success: true,
message: `Retrieved statistics for ${periodLabel}: ${clicks} clicks across ${links} links`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your date range, timezone, and other settings.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed or insufficient permissions. Please check your API key and domain access.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Domain not found. Please verify the domain exists and you have access to its statistics.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to retrieve domain statistics: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,110 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown, linkIdDropdown } from '../common/props';
export const expireShortLinkAction = createAction({
auth: shortIoAuth,
name: 'expire-short-link',
displayName: 'Expire Short Link',
description: 'Set an expiration date or click limit to deactivate a short link.',
props: {
domain: domainIdDropdown,
linkId: linkIdDropdown,
expiresAt: Property.DateTime({
displayName: 'Expiration Date',
description: 'The date and time when the link will become inactive.',
required: false,
}),
clicksLimit: Property.Number({
displayName: 'Clicks Limit',
description: 'Disable link after specified number of clicks (minimum: 1)',
required: false,
}),
expiredURL: Property.ShortText({
displayName: 'Expired Redirect URL',
description: 'Optional URL to redirect users when the link has expired.',
required: false,
}),
},
async run({ propsValue, auth }) {
const {
linkId,
domain: domainString,
expiresAt,
clicksLimit,
expiredURL,
} = propsValue;
if (!expiresAt && !clicksLimit) {
throw new Error('You must provide either an expiration date or a clicks limit to expire the link.');
}
if (clicksLimit && clicksLimit < 1) {
throw new Error('Clicks limit must be at least 1');
}
const query: Record<string, string> = {};
if (domainString) {
const domainObject = JSON.parse(domainString as string);
query['domain_id'] = String(domainObject.id);
}
const body: Record<string, unknown> = {};
if (expiresAt) {
body['expiresAt'] = expiresAt;
}
if (clicksLimit) {
body['clicksLimit'] = clicksLimit;
}
if (expiredURL && expiredURL.trim() !== '') {
body['expiredURL'] = expiredURL;
}
try {
const response = await shortIoApiCall({
method: HttpMethod.POST,
auth,
resourceUri: `/links/${linkId}`,
query,
body,
});
return {
success: true,
message: 'Short link expiration settings updated successfully',
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your expiration settings and try again.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Short link not found. Please check the link ID and try again.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to set link expiration: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,85 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown } from '../common/props';
export const getLinkByPathAction = createAction({
auth: shortIoAuth,
name: 'get-short-link-info-by-path',
displayName: 'Get Link by Path',
description: 'Retrieve detailed information about a short link using its domain and path.',
props: {
domain: domainIdDropdown,
path: Property.ShortText({
displayName: 'Link Path',
description: 'The path/slug of the short link (e.g., "abc123", "my-link"). Do not include domain or slashes.',
required: true,
}),
},
async run({ propsValue, auth }) {
const { domain: domainString, path } = propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain first.');
}
if (!path || path.trim() === '') {
throw new Error('Path is required and cannot be empty.');
}
const cleanPath = path.trim();
if (cleanPath.includes('/') || cleanPath.includes('http')) {
throw new Error('Path should only contain the slug (e.g., "abc123"), not the full URL or domain.');
}
const domainObject = JSON.parse(domainString as string);
const query = {
domain: domainObject.hostname,
path: cleanPath,
};
try {
const response = await shortIoApiCall({
method: HttpMethod.GET,
auth,
resourceUri: `/links/expand`,
query,
});
return {
success: true,
message: `Link information for "${cleanPath}" retrieved successfully`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check the domain and path values.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('404')) {
throw new Error(
`Short link with path "${cleanPath}" not found on domain "${domainObject.hostname}". Please verify the path exists.`
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to retrieve link information: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,113 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown } from '../common/props';
export const getLinkClicksAction = createAction({
auth: shortIoAuth,
name: 'get-link-clicks',
displayName: 'Get Link Clicks',
description: 'Retrieve click statistics for specific short links by their IDs.',
props: {
domain: {
...domainIdDropdown,
required: true,
description: 'Select the domain containing the links',
},
ids: Property.Array({
displayName: 'Link IDs',
description: 'List of link IDs to fetch click statistics for (e.g., lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6).',
required: true,
}),
startDate: Property.DateTime({
displayName: 'Start Date',
description: 'Start date for click statistics (optional).',
required: false,
}),
endDate: Property.DateTime({
displayName: 'End Date',
description: 'End date for click statistics (optional).',
required: false,
}),
},
async run({ propsValue, auth }) {
const { domain: domainString, ids, startDate, endDate } = propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
if (!ids || ids.length === 0) {
throw new Error('At least one Link ID is required.');
}
if ((startDate && !endDate) || (!startDate && endDate)) {
throw new Error('Both Start Date and End Date must be provided if using a date range filter.');
}
if (startDate && endDate) {
const start = new Date(startDate);
const end = new Date(endDate);
if (start >= end) {
throw new Error('Start date must be before end date.');
}
}
const domainObject = JSON.parse(domainString as string);
const query: Record<string, string> = {
ids: (ids as string[]).join(','),
};
if (startDate && endDate) {
query['startDate'] = new Date(startDate).toISOString().split('T')[0]; // YYYY-MM-DD format
query['endDate'] = new Date(endDate).toISOString().split('T')[0];
}
try {
const response = await shortIoApiCall({
method: HttpMethod.GET,
auth,
url: `https://statistics.short.io/statistics/domain/${domainObject.id}/link_clicks`,
query,
});
const linkCount = ids.length;
const dateRange = startDate && endDate ? ` for ${query['startDate']} to ${query['endDate']}` : '';
return {
success: true,
message: `Retrieved click statistics for ${linkCount} link${linkCount > 1 ? 's' : ''}${dateRange}`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your link IDs and date range.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed or insufficient permissions. Please check your API key and domain access.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Domain or links not found. Please verify the domain and link IDs exist.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to retrieve link click statistics: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,142 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown, folderIdDropdown } from '../common/props';
export const listLinksAction = createAction({
auth: shortIoAuth,
name: 'list-short-links',
displayName: 'List Links',
description:
'Retrieve all links on a domain, with pagination and date-range filters.',
props: {
domain: {
...domainIdDropdown,
required: true,
description: 'Select the domain to retrieve links from',
},
folderId: folderIdDropdown,
limit: Property.Number({
displayName: 'Limit',
description: 'Number of results to return (1-150). Default is 50.',
required: false,
}),
idString: Property.ShortText({
displayName: 'Link ID Filter',
description: 'Filter by specific link ID (optional).',
required: false,
}),
createdAt: Property.ShortText({
displayName: 'Exact Creation Time',
description: 'Filter by exact creation time (ISO format or timestamp).',
required: false,
}),
beforeDate: Property.DateTime({
displayName: 'Before Date',
description: 'Return links created before this date and time.',
required: false,
}),
afterDate: Property.DateTime({
displayName: 'After Date',
description: 'Return links created after this date and time.',
required: false,
}),
dateSortOrder: Property.StaticDropdown({
displayName: 'Date Sort Order',
description: 'Order links by creation date.',
required: false,
options: {
disabled: false,
options: [
{ label: 'Ascending (Oldest First)', value: 'asc' },
{ label: 'Descending (Newest First)', value: 'desc' },
],
},
}),
pageToken: Property.ShortText({
displayName: 'Page Token',
description: 'Token for paginated results (get this from previous response).',
required: false,
}),
},
async run({ propsValue, auth }) {
const {
domain: domainString,
limit,
idString,
createdAt,
beforeDate,
afterDate,
dateSortOrder,
pageToken,
folderId,
} = propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
if (limit && (limit < 1 || limit > 150)) {
throw new Error('Limit must be between 1 and 150.');
}
const query: Record<string, string> = {};
const domainObject = JSON.parse(domainString as string);
query['domain_id'] = String(domainObject.id);
if (limit) query['limit'] = String(limit);
if (idString && idString.trim() !== '') query['idString'] = String(idString);
if (createdAt && createdAt.trim() !== '') query['createdAt'] = String(createdAt);
if (beforeDate) query['beforeDate'] = beforeDate;
if (afterDate) query['afterDate'] = afterDate;
if (dateSortOrder) query['dateSortOrder'] = String(dateSortOrder);
if (pageToken && pageToken.trim() !== '') query['pageToken'] = String(pageToken);
if (folderId) query['folderId'] = String(folderId);
try {
const response = await shortIoApiCall({
method: HttpMethod.GET,
auth,
resourceUri: '/api/links',
query,
});
const linkCount = (response as any)['count'] || ((response as any)['links'] ? (response as any)['links'].length : 0);
const hasNextPage = (response as any)['nextPageToken'] ? ' (more pages available)' : '';
return {
success: true,
message: `Retrieved ${linkCount} links successfully${hasNextPage}`,
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your filter values and try again.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed or insufficient permissions. Please check your API key and domain access.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Domain not found. Please verify the domain exists and you have access to it.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to retrieve links: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,283 @@
import { HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { shortIoApiCall } from '../common/client';
import { shortIoAuth } from '../common/auth';
import { domainIdDropdown, linkIdDropdown, folderIdDropdown } from '../common/props';
export const updateShortLinkAction = createAction({
auth: shortIoAuth,
name: 'update-short-link',
displayName: 'Update Short Link',
description:
"Update an existing short link's original URL, path, title, or other properties using its link ID.",
props: {
domain: domainIdDropdown,
linkId: linkIdDropdown,
originalURL: Property.ShortText({
displayName: 'Original URL',
required: false,
}),
path: Property.ShortText({
displayName: 'Custom Path (Slug)',
required: false,
}),
title: Property.ShortText({
displayName: 'Title',
required: false,
}),
folderId: folderIdDropdown,
cloaking: Property.Checkbox({
displayName: 'Enable Cloaking',
required: false,
}),
password: Property.ShortText({
displayName: 'Password',
required: false,
}),
redirectType: Property.StaticDropdown({
displayName: 'Redirect Type',
description:
'The HTTP status code for the redirect. The default is 302 (Found).',
required: false,
options: {
disabled: false,
options: [
{ label: '301 (Moved Permanently)', value: '301' },
{ label: '302 (Found)', value: '302' },
{ label: '303 (See Other)', value: '303' },
{ label: '307 (Temporary Redirect)', value: '307' },
{ label: '308 (Permanent Redirect)', value: '308' },
],
},
}),
expiresAt: Property.DateTime({
displayName: 'Expiration Date',
description: 'The date and time when the link will become inactive.',
required: false,
}),
expiredURL: Property.ShortText({
displayName: 'Expired Redirect URL',
required: false,
}),
tags: Property.Array({
displayName: 'Tags',
description: 'Array of tags for the link',
required: false,
}),
utmSource: Property.ShortText({
displayName: 'UTM Source',
required: false,
}),
utmMedium: Property.ShortText({
displayName: 'UTM Medium',
required: false,
}),
utmCampaign: Property.ShortText({
displayName: 'UTM Campaign',
required: false,
}),
utmTerm: Property.ShortText({
displayName: 'UTM Term',
required: false,
}),
utmContent: Property.ShortText({
displayName: 'UTM Content',
required: false,
}),
ttl: Property.Number({
displayName: 'Time to Live (in seconds)',
description:
'⚠️ CAUTION: Link will be PERMANENTLY DELETED after this many seconds. This action cannot be undone. Use with extreme caution.',
required: false,
}),
androidURL: Property.ShortText({
displayName: 'Android URL',
required: false,
}),
iphoneURL: Property.ShortText({
displayName: 'iPhone URL',
required: false,
}),
createdAt: Property.DateTime({
displayName: 'Creation Time',
description: 'Overrides the creation time of the link.',
required: false,
}),
clicksLimit: Property.Number({
displayName: 'Clicks Limit',
description: 'Disable link after specified number of clicks (minimum: 1)',
required: false,
}),
passwordContact: Property.Checkbox({
displayName: 'Show Contact for Password Recovery',
required: false,
}),
skipQS: Property.Checkbox({
displayName: 'Skip Query String Merge',
required: false,
}),
archived: Property.Checkbox({
displayName: 'Archive Link',
required: false,
}),
splitURL: Property.ShortText({
displayName: 'Split URL',
required: false,
}),
splitPercent: Property.Number({
displayName: 'Split Percent',
description: 'Split URL percentage (1-100)',
required: false,
}),
integrationAdroll: Property.ShortText({
displayName: 'Adroll Integration ID',
required: false,
}),
integrationFB: Property.ShortText({
displayName: 'Facebook Integration ID',
required: false,
}),
integrationGA: Property.ShortText({
displayName: 'Google Analytics ID',
required: false,
}),
integrationGTM: Property.ShortText({
displayName: 'Google Tag Manager ID',
required: false,
}),
},
async run({ propsValue, auth }) {
const {
linkId,
domain: domainString,
originalURL,
path,
title,
folderId,
cloaking,
password,
redirectType,
expiresAt,
expiredURL,
tags,
utmSource,
utmMedium,
utmCampaign,
utmTerm,
utmContent,
ttl,
androidURL,
iphoneURL,
createdAt,
clicksLimit,
passwordContact,
skipQS,
archived,
splitURL,
splitPercent,
integrationAdroll,
integrationFB,
integrationGA,
integrationGTM,
} = propsValue;
if (clicksLimit && clicksLimit < 1) {
throw new Error('Clicks limit must be at least 1');
}
if (splitPercent && (splitPercent < 1 || splitPercent > 100)) {
throw new Error('Split percent must be between 1 and 100');
}
if (redirectType && !['301', '302', '303', '307', '308'].includes(redirectType)) {
throw new Error('Invalid redirect type. Must be one of: 301, 302, 303, 307, 308');
}
const query: Record<string, string> = {};
if (domainString) {
const domainObject = JSON.parse(domainString as string);
query['domain_id'] = String(domainObject.id);
}
const optionalParams = {
originalURL,
path,
title,
folderId,
cloaking,
password,
redirectType,
expiresAt,
expiredURL,
tags,
utmSource,
utmMedium,
utmCampaign,
utmTerm,
utmContent,
ttl: ttl ? ttl * 1000 : undefined,
androidURL,
iphoneURL,
createdAt,
clicksLimit,
passwordContact,
skipQS,
archived,
splitURL,
splitPercent,
integrationAdroll,
integrationFB,
integrationGA,
integrationGTM,
};
const body: Record<string, unknown> = {};
for (const [key, value] of Object.entries(optionalParams)) {
if (value !== null && value !== undefined && value !== '') {
body[key] = value;
}
}
try {
const response = await shortIoApiCall({
method: HttpMethod.POST,
auth,
resourceUri: `/links/${linkId}`,
query,
body,
});
return {
success: true,
message: 'Short link updated successfully',
data: response,
};
} catch (error: any) {
if (error.message.includes('400')) {
throw new Error(
'Invalid request parameters. Please check your input values and try again.'
);
}
if (error.message.includes('401') || error.message.includes('403')) {
throw new Error(
'Authentication failed. Please check your API key and permissions.'
);
}
if (error.message.includes('404')) {
throw new Error(
'Short link not found. Please check the link ID and try again.'
);
}
if (error.message.includes('429')) {
throw new Error(
'Rate limit exceeded. Please wait a moment before trying again.'
);
}
throw new Error(`Failed to update short link: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,33 @@
import { PieceAuth } from '@activepieces/pieces-framework';
import { shortIoApiCall } from './client';
import { HttpMethod } from '@activepieces/pieces-common';
import { AppConnectionType } from '@activepieces/shared';
export const shortIoAuth = PieceAuth.CustomAuth({
description: 'Enter your Short.io API Key',
props: {
apiKey: PieceAuth.SecretText({
displayName: 'API Key',
required: true,
}),
},
validate: async ({ auth }) => {
try {
await shortIoApiCall({
method: HttpMethod.GET,
auth: {
type: AppConnectionType.CUSTOM_AUTH,
props: auth,
},
resourceUri: '/api/domains',
});
return { valid: true };
} catch (e) {
return {
valid: false,
error: 'Invalid API Key',
};
}
},
required: true,
});

View File

@@ -0,0 +1,66 @@
import {
httpClient,
HttpMethod,
HttpRequest,
HttpMessageBody,
QueryParams,
} from '@activepieces/pieces-common';
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
import { shortIoAuth } from './auth';
export type ShortioAuthProps = AppConnectionValueForAuthProperty<typeof shortIoAuth>;
export type ShortioApiCallParams = {
method: HttpMethod;
resourceUri?: string;
url?: string;
query?: Record<string, string | number | string[] | undefined>;
body?: unknown;
auth: ShortioAuthProps;
};
export async function shortIoApiCall<T extends HttpMessageBody>({
method,
resourceUri,
url,
query,
body,
auth,
}: ShortioApiCallParams): Promise<T> {
const finalUrl = url ?? `https://api.short.io${resourceUri ?? ''}`;
const queryParams: QueryParams = {};
if (query) {
for (const [key, value] of Object.entries(query)) {
if (value !== null && value !== undefined) {
queryParams[key] = String(value);
}
}
}
const request: HttpRequest = {
method,
url: finalUrl,
headers: {
authorization: auth.props.apiKey,
'Content-Type': 'application/json',
accept: 'application/json',
},
queryParams,
body,
};
try {
const response = await httpClient.sendRequest<T>(request);
return response.body;
} catch (error: any) {
const status = error.response?.status;
const message =
error.response?.body?.message ||
error.message ||
'Unknown Short.io API error';
throw new Error(
`Short.io API Error (${status || 'No Status'}): ${message}`
);
}
}

View File

@@ -0,0 +1,180 @@
import { Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { shortIoApiCall, ShortioAuthProps } from './client';
import { shortIoAuth } from './auth';
interface ShortIoDomain {
id: number;
hostname: string;
}
interface ShortIoLink {
idString: string;
path: string;
originalURL: string;
}
interface ShortIoLinksResponse {
links: ShortIoLink[];
}
interface ShortIoFolder {
id: string;
name: string;
}
interface ShortIoFoldersResponse {
linkFolders: ShortIoFolder[];
}
export const domainIdDropdown =Property.Dropdown({
auth: shortIoAuth,
displayName: 'Domain',
description: 'Select the domain to use for the link',
required: true,
refreshers: ['auth'],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Connect your Short.io account first',
};
}
try {
const domains = await shortIoApiCall<ShortIoDomain[]>({
auth: auth as ShortioAuthProps,
method: HttpMethod.GET,
resourceUri: '/api/domains',
});
return {
disabled: false,
options: domains.map((domain) => ({
label: domain.hostname,
value: JSON.stringify({
id: domain.id,
hostname: domain.hostname,
}),
})),
placeholder:
domains.length === 0 ? 'No domains available' : 'Select a domain',
};
} catch (error: any) {
return {
disabled: true,
options: [],
placeholder: `Error loading domains: ${error.message}`,
};
}
},
});
export const linkIdDropdown =Property.Dropdown({
auth: shortIoAuth,
displayName: 'Short Link',
description: 'Select the short link from the domain',
required: true,
refreshers: ['auth', 'domain'],
options: async ({ auth, domain }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Connect your Short.io account first',
};
}
if (!domain) {
return {
disabled: true,
options: [],
placeholder: 'Select a domain first',
};
}
try {
const domainObject = JSON.parse(domain as string);
const response = await shortIoApiCall<ShortIoLinksResponse>({
auth: auth as ShortioAuthProps,
method: HttpMethod.GET,
resourceUri: '/api/links',
query: {
domain_id: domainObject.id,
limit: 100,
},
});
return {
disabled: false,
options: response.links.map((link) => ({
label: `${link.path || '(auto)'}${link.originalURL}`,
value: link.idString,
})),
placeholder:
response.links.length === 0 ? 'No links available' : 'Select a link',
};
} catch (error: any) {
return {
disabled: true,
options: [],
placeholder: `Error loading links: ${error.message}`,
};
}
},
});
export const folderIdDropdown =Property.Dropdown({
auth: shortIoAuth,
displayName: 'Folder',
description: 'Select the folder to add the link to.',
required: false,
refreshers: ['auth', 'domain'],
options: async ({ auth, domain }) => {
if (!auth || !domain) {
return {
disabled: true,
options: [],
placeholder: 'Select a domain first',
};
}
try {
const domainObject = JSON.parse(domain as string);
const response = await shortIoApiCall<ShortIoFoldersResponse>({
auth: auth as ShortioAuthProps,
method: HttpMethod.GET,
resourceUri: `/links/folders/${domainObject.id}`,
});
const foldersArray = response.linkFolders;
if (!foldersArray || foldersArray.length === 0) {
return {
disabled: true,
options: [],
placeholder: 'No folders found in this domain',
};
}
return {
disabled: false,
options: foldersArray.map((folder: ShortIoFolder) => ({
label: folder.name,
value: folder.id,
})),
placeholder: 'Select a folder',
};
} catch (error: any) {
return {
disabled: true,
options: [],
placeholder: `Error: Could not load folders. ${error.message}`,
};
}
},
});

View File

@@ -0,0 +1,317 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { shortIoAuth } from '../common/auth';
import { shortIoApiCall } from '../common/client';
import { domainIdDropdown } from '../common/props';
const LAST_LINK_IDS_KEY = 'shortio-last-link-ids';
export const newLinkCreatedTrigger = createTrigger({
auth: shortIoAuth,
name: 'new_link_created',
displayName: 'New Link Created',
description: 'Fires when a new short link is created on a domain. Useful to sync newly created links to other systems.',
type: TriggerStrategy.POLLING,
props: {
domain: {
...domainIdDropdown,
required: true,
description: 'Select the domain to monitor for new links',
},
pollingInterval: Property.StaticDropdown({
displayName: 'Polling Interval',
description: 'How often to check for new links. More frequent polling may hit rate limits.',
required: true,
defaultValue: '5',
options: {
disabled: false,
options: [
{ label: 'Every 1 minute', value: '1' },
{ label: 'Every 5 minutes', value: '5' },
{ label: 'Every 15 minutes', value: '15' },
{ label: 'Every 30 minutes', value: '30' },
{ label: 'Every hour', value: '60' },
],
},
}),
},
async onEnable(context) {
const { domain: domainString } = context.propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
const domainObject = JSON.parse(domainString as string);
const domainId = domainObject.id;
try {
const response = await shortIoApiCall<{ links: ShortIoLink[] }>({
auth: context.auth,
method: HttpMethod.GET,
resourceUri: `/api/links`,
query: {
domain_id: domainId,
limit: 100,
dateSortOrder: 'desc',
},
});
const currentIds = (response.links || []).map((link) => link.idString);
await context.store.put<string[]>(LAST_LINK_IDS_KEY, currentIds);
} catch (error: any) {
throw new Error(`Failed to initialize trigger: ${error.message}`);
}
},
async onDisable() {
// No-op
},
async run(context) {
const { domain: domainString } = context.propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
const domainObject = JSON.parse(domainString as string);
const domainId = domainObject.id;
const previousIds = await context.store.get<string[]>(LAST_LINK_IDS_KEY) || [];
try {
const response = await shortIoApiCall<{ links: ShortIoLink[] }>({
auth: context.auth,
method: HttpMethod.GET,
resourceUri: `/api/links`,
query: {
domain_id: domainId,
limit: 100,
dateSortOrder: 'desc',
},
});
const allLinks = response.links || [];
const currentIds = allLinks.map((link) => link.idString);
await context.store.put<string[]>(LAST_LINK_IDS_KEY, currentIds);
const newLinks = allLinks.filter((link) => !previousIds.includes(link.idString));
return newLinks.map((link) => ({
id: link.idString,
originalURL: link.originalURL,
shortURL: link.shortURL,
secureShortURL: link.secureShortURL,
title: link.title,
path: link.path,
createdAt: link.createdAt,
updatedAt: link.updatedAt,
tags: link.tags,
redirectType: link.redirectType,
domainId: link.DomainId || link.domainId,
folderId: link.FolderId,
ownerId: link.OwnerId,
hasPassword: link.hasPassword,
cloaking: link.cloaking,
password: link.password,
expiresAt: link.expiresAt,
expiredURL: link.expiredURL,
clicksLimit: link.clicksLimit,
archived: link.archived,
utmSource: link.utmSource,
utmMedium: link.utmMedium,
utmCampaign: link.utmCampaign,
utmTerm: link.utmTerm,
utmContent: link.utmContent,
androidURL: link.androidURL,
iphoneURL: link.iphoneURL,
triggerInfo: {
source: 'short.io',
type: 'new_link_created',
detectedAt: new Date().toISOString(),
domain: domainObject.hostname,
},
raw: link,
}));
} catch (error: any) {
if (error.message.includes('403')) {
throw new Error(`Access denied to domain. Please check your API key permissions for domain: ${domainObject.hostname}`);
}
if (error.message.includes('404')) {
throw new Error(`Domain not found: ${domainObject.hostname}. Please verify the domain exists.`);
}
if (error.message.includes('429')) {
throw new Error('Rate limit exceeded. Consider increasing the polling interval.');
}
throw new Error(`Failed to check for new links: ${error.message}`);
}
},
async test(context) {
const { domain: domainString } = context.propsValue;
if (!domainString) {
throw new Error('Domain is required. Please select a domain.');
}
const domainObject = JSON.parse(domainString as string);
const domainId = domainObject.id;
try {
const response = await shortIoApiCall<{ links: ShortIoLink[] }>({
auth: context.auth,
method: HttpMethod.GET,
resourceUri: `/api/links`,
query: {
domain_id: domainId,
limit: 1,
dateSortOrder: 'desc',
},
});
const link = response.links?.[0];
if (link) {
return [{
id: link.idString,
originalURL: link.originalURL,
shortURL: link.shortURL,
secureShortURL: link.secureShortURL,
title: link.title,
path: link.path,
createdAt: link.createdAt,
updatedAt: link.updatedAt,
tags: link.tags,
redirectType: link.redirectType,
domainId: link.DomainId || link.domainId,
folderId: link.FolderId,
ownerId: link.OwnerId,
hasPassword: link.hasPassword,
cloaking: link.cloaking,
password: link.password,
expiresAt: link.expiresAt,
expiredURL: link.expiredURL,
clicksLimit: link.clicksLimit,
archived: link.archived,
utmSource: link.utmSource,
utmMedium: link.utmMedium,
utmCampaign: link.utmCampaign,
utmTerm: link.utmTerm,
utmContent: link.utmContent,
androidURL: link.androidURL,
iphoneURL: link.iphoneURL,
triggerInfo: {
source: 'short.io',
type: 'new_link_created',
detectedAt: new Date().toISOString(),
domain: domainObject.hostname,
},
raw: link,
}];
}
return [];
} catch (error: any) {
if (error.message.includes('403')) {
throw new Error(`Access denied to domain. Please check your API key permissions for domain: ${domainObject.hostname}`);
}
if (error.message.includes('404')) {
throw new Error(`Domain not found: ${domainObject.hostname}. Please verify the domain exists.`);
}
throw new Error(`Failed to test trigger: ${error.message}`);
}
},
sampleData: {
id: 'lnk_61Mb_0dnRUg3vvtmAPZh3dhQh6',
originalURL: 'https://example.com/page',
shortURL: 'https://yourdomain.short.io/abc123',
secureShortURL: 'https://yourdomain.short.io/abc123',
title: 'Example Page Title',
path: 'abc123',
createdAt: '2025-01-15T12:00:00.000Z',
updatedAt: '2025-01-15T12:00:00.000Z',
tags: ['marketing', 'campaign'],
redirectType: 302,
domainId: 123456,
folderId: null,
ownerId: 789,
hasPassword: false,
cloaking: false,
password: null,
expiresAt: null,
expiredURL: null,
clicksLimit: null,
archived: false,
utmSource: 'newsletter',
utmMedium: 'email',
utmCampaign: 'january_promo',
utmTerm: null,
utmContent: null,
androidURL: null,
iphoneURL: null,
triggerInfo: {
source: 'short.io',
type: 'new_link_created',
detectedAt: '2025-01-15T12:01:00.000Z',
domain: 'yourdomain.short.io',
},
raw: {},
},
});
interface ShortIoLink {
idString: string;
id: string;
originalURL: string;
shortURL: string;
secureShortURL: string;
title?: string;
path: string;
createdAt: string;
updatedAt?: string;
tags: string[];
redirectType?: number;
DomainId?: number;
domainId?: number;
FolderId?: string | null;
OwnerId?: number;
hasPassword?: boolean;
cloaking?: boolean;
password?: string | null;
expiresAt?: string | number | null;
expiredURL?: string | null;
clicksLimit?: number | null;
passwordContact?: boolean | null;
skipQS?: boolean;
archived?: boolean;
splitURL?: string | null;
splitPercent?: number | null;
utmSource?: string;
utmMedium?: string;
utmCampaign?: string;
utmTerm?: string;
utmContent?: string;
ttl?: string | number | null;
androidURL?: string | null;
iphoneURL?: string | null;
integrationAdroll?: string | null;
integrationFB?: string | null;
integrationGA?: string | null;
integrationGTM?: string | null;
User?: {
id: number;
name: string | null;
email: string;
photoURL: string | null;
};
[key: string]: any;
}

View File

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

View File

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