{"id":"21c63254-58c7-4b8c-b104-6211cf5da7f5","shortId":"FGErvr","kind":"skill","title":"free-translation-api","tagline":"Translate text using free LibreTranslate API. Use when: (1) Translating content between languages, (2) Creating multilingual documentation, (3) Processing international data, or (4) Building translation workflows.","description":"# Free Translation API — LibreTranslate\n\nTranslate text between 100+ languages using free LibreTranslate instances. Open-source, privacy-respecting alternative to Google Translate API ($20/million characters).\n\n## Why This Replaces Paid Translation APIs\n\n**💰 Cost savings:**\n- ✅ **100% free** — no API keys required for public instances\n- ✅ **No rate limits** — generous limits on public instances\n- ✅ **Open source** — self-hostable for unlimited usage\n- ✅ **Privacy-first** — no data collection or tracking\n\n**Perfect for AI agents that need:**\n- Text translation without Google Translate API costs\n- Privacy-respecting translation (no data retention)\n- High volume translation without quotas\n- Offline translation capability (self-hosted)\n\n## Quick comparison\n\n| Service | Cost | Rate limit | Privacy | API key required |\n|---------|------|------------|---------|------------------|\n| Google Translate API | $20/1M chars | Unlimited with payment | ❌ Tracked | ✅ Yes |\n| DeepL API | $5-25/1M chars | 500k chars/month free | ❌ Tracked | ✅ Yes |\n| **LibreTranslate** | **Free** | **Varies by instance** | **✅ Private** | **❌ No** |\n\n## Skills\n\n### translate_text\n\nBasic text translation using LibreTranslate.\n\n```bash\n# Translate text (English to Spanish)\ncurl -s -X POST \"https://libretranslate.com/translate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"q\": \"Hello, how are you?\",\n    \"source\": \"en\",\n    \"target\": \"es\"\n  }' | jq -r '.translatedText'\n\n# Auto-detect source language\ncurl -s -X POST \"https://libretranslate.com/translate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"q\": \"Bonjour le monde\",\n    \"source\": \"auto\",\n    \"target\": \"en\"\n  }' | jq -r '.translatedText'\n\n# Translate from file\nTEXT=$(cat document.txt)\ncurl -s -X POST \"https://libretranslate.com/translate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"q\\\": \\\"$TEXT\\\",\n    \\\"source\\\": \\\"en\\\",\n    \\\"target\\\": \\\"fr\\\"\n  }\" | jq -r '.translatedText' > document_fr.txt\n```\n\n**Node.js:**\n\n```javascript\nasync function translateText(text, targetLang, sourceLang = 'auto', instance = 'https://libretranslate.com') {\n  const res = await fetch(`${instance}/translate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      q: text,\n      source: sourceLang,\n      target: targetLang\n    })\n  });\n  \n  if (!res.ok) {\n    const error = await res.text();\n    throw new Error(`Translation failed: ${error}`);\n  }\n  \n  const data = await res.json();\n  return data.translatedText;\n}\n\n// Usage\n// translateText('Hello world', 'es', 'en')\n//   .then(translated => console.log(translated));\n// Output: \"Hola mundo\"\n```\n\n### get_supported_languages\n\nList all supported languages for an instance.\n\n```bash\n# Get all supported languages\ncurl -s \"https://libretranslate.com/languages\" | jq '.[] | {code: .code, name: .name}'\n\n# Get language codes only\ncurl -s \"https://libretranslate.com/languages\" | jq -r '.[].code'\n\n# Check if specific language is supported\ncurl -s \"https://libretranslate.com/languages\" | jq -r '.[] | select(.code == \"ja\") | .name'\n```\n\n**Node.js:**\n\n```javascript\nasync function getSupportedLanguages(instance = 'https://libretranslate.com') {\n  const res = await fetch(`${instance}/languages`);\n  const languages = await res.json();\n  return languages.map(lang => ({\n    code: lang.code,\n    name: lang.name\n  }));\n}\n\n// Usage\n// getSupportedLanguages().then(langs => {\n//   console.log('Supported languages:', langs.length);\n//   langs.slice(0, 10).forEach(l => console.log(`${l.code}: ${l.name}`));\n// });\n```\n\n### detect_language\n\nDetect the language of a text.\n\n```bash\n# Detect language\ncurl -s -X POST \"https://libretranslate.com/detect\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"q\": \"Bonjour, comment allez-vous?\"\n  }' | jq -r '.[0] | {language: .language, confidence: .confidence}'\n\n# Detect language for multiple texts\ncurl -s -X POST \"https://libretranslate.com/detect\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"q\": \"Hola mundo. Cómo estás?\"\n  }' | jq -r '.[]'\n```\n\n**Node.js:**\n\n```javascript\nasync function detectLanguage(text, instance = 'https://libretranslate.com') {\n  const res = await fetch(`${instance}/detect`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ q: text })\n  });\n  \n  if (!res.ok) {\n    throw new Error('Language detection failed');\n  }\n  \n  const results = await res.json();\n  return results[0]; // Returns {language: 'en', confidence: 0.99}\n}\n\n// Usage\n// detectLanguage('Hello world')\n//   .then(result => console.log(`Detected: ${result.language} (${result.confidence})`));\n```\n\n### batch_translate\n\nTranslate multiple texts or paragraphs.\n\n```bash\n#!/bin/bash\n# Translate multiple lines from a file\nINPUT_FILE=\"content_en.txt\"\nOUTPUT_FILE=\"content_es.txt\"\nTARGET_LANG=\"es\"\n\n> \"$OUTPUT_FILE\"  # Clear output file\n\nwhile IFS= read -r line; do\n  if [ -n \"$line\" ]; then\n    translated=$(curl -s -X POST \"https://libretranslate.com/translate\" \\\n      -H \"Content-Type: application/json\" \\\n      -d \"{\n        \\\"q\\\": \\\"$line\\\",\n        \\\"source\\\": \\\"auto\\\",\n        \\\"target\\\": \\\"$TARGET_LANG\\\"\n      }\" | jq -r '.translatedText')\n    \n    echo \"$translated\" >> \"$OUTPUT_FILE\"\n    sleep 1  # Rate limiting\n  fi\ndone < \"$INPUT_FILE\"\n\necho \"Translation complete: $OUTPUT_FILE\"\n```\n\n**Node.js:**\n\n```javascript\nasync function batchTranslate(texts, targetLang, sourceLang = 'auto', delayMs = 1000) {\n  const results = [];\n  \n  for (const text of texts) {\n    try {\n      const translated = await translateText(text, targetLang, sourceLang);\n      results.push({ original: text, translated, success: true });\n      \n      // Rate limiting delay\n      if (delayMs > 0) {\n        await new Promise(resolve => setTimeout(resolve, delayMs));\n      }\n    } catch (err) {\n      results.push({ original: text, translated: null, success: false, error: err.message });\n    }\n  }\n  \n  return results;\n}\n\n// Usage\n// const texts = [\n//   'Hello world',\n//   'How are you?',\n//   'Goodbye'\n// ];\n// batchTranslate(texts, 'fr', 'en', 1000)\n//   .then(results => results.forEach(r => \n//     console.log(`${r.original} -> ${r.translated}`)\n//   ));\n```\n\n### translate_with_fallback\n\nProduction-ready translation with instance fallback and retry logic.\n\n```bash\n#!/bin/bash\ntranslate_with_fallback() {\n  local TEXT=\"$1\"\n  local TARGET_LANG=\"$2\"\n  local SOURCE_LANG=\"${3:-auto}\"\n  \n  # List of LibreTranslate instances\n  local INSTANCES=(\n    \"https://libretranslate.com\"\n    \"https://translate.argosopentech.com\"\n    \"https://translate.terraprint.co\"\n  )\n  \n  for instance in \"${INSTANCES[@]}\"; do\n    result=$(curl -fsS --max-time 10 -X POST \"${instance}/translate\" \\\n      -H \"Content-Type: application/json\" \\\n      -d \"{\n        \\\"q\\\": \\\"$TEXT\\\",\n        \\\"source\\\": \\\"$SOURCE_LANG\\\",\n        \\\"target\\\": \\\"$TARGET_LANG\\\"\n      }\" 2>&1)\n    \n    if [ $? -eq 0 ]; then\n      echo \"$result\" | jq -r '.translatedText'\n      return 0\n    else\n      echo \"Instance $instance failed, trying next...\" >&2\n    fi\n  done\n  \n  echo \"Error: All translation instances failed\" >&2\n  return 1\n}\n\n# Usage\ntranslate_with_fallback \"Hello world\" \"es\" \"en\"\n```\n\n**Node.js:**\n\n```javascript\nasync function translateWithFallback(text, targetLang, sourceLang = 'auto') {\n  const instances = [\n    'https://libretranslate.com',\n    'https://translate.argosopentech.com',\n    'https://translate.terraprint.co'\n  ];\n  \n  const maxRetries = 3;\n  \n  for (let attempt = 0; attempt < maxRetries; attempt++) {\n    for (const instance of instances) {\n      try {\n        const controller = new AbortController();\n        const timeout = setTimeout(() => controller.abort(), 10000);\n        \n        const res = await fetch(`${instance}/translate`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            q: text,\n            source: sourceLang,\n            target: targetLang\n          }),\n          signal: controller.signal\n        });\n        \n        clearTimeout(timeout);\n        \n        if (res.ok) {\n          const data = await res.json();\n          return {\n            translatedText: data.translatedText,\n            instance,\n            attempt: attempt + 1\n          };\n        }\n      } catch (err) {\n        console.warn(`Instance ${instance} failed (attempt ${attempt + 1}): ${err.message}`);\n      }\n    }\n    \n    // Exponential backoff\n    if (attempt < maxRetries - 1) {\n      await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, attempt)));\n    }\n  }\n  \n  throw new Error('All translation instances failed after retries');\n}\n\n// Usage\n// translateWithFallback('Hello world', 'ja', 'en')\n//   .then(result => console.log(`Translated: ${result.translatedText} (via ${result.instance})`))\n//   .catch(err => console.error('Translation failed:', err.message));\n```\n\n### translate_markdown_document\n\nTranslate markdown files while preserving formatting.\n\n```bash\n#!/bin/bash\n# Translate markdown preserving code blocks and links\nINPUT_FILE=\"README.md\"\nOUTPUT_FILE=\"README_es.md\"\nTARGET_LANG=\"es\"\n\n# Extract and translate text between markdown elements\n# This is a simplified version - production use requires more sophisticated parsing\n\ntranslate_line() {\n  local line=\"$1\"\n  \n  # Skip code blocks, links, and special markdown syntax\n  if [[ \"$line\" =~ ^```|^#|^\\[|^- ]]; then\n    echo \"$line\"\n  elif [ -n \"$line\" ]; then\n    curl -s -X POST \"https://libretranslate.com/translate\" \\\n      -H \"Content-Type: application/json\" \\\n      -d \"{\\\"q\\\": \\\"$line\\\", \\\"source\\\": \\\"auto\\\", \\\"target\\\": \\\"$TARGET_LANG\\\"}\" \\\n      | jq -r '.translatedText'\n    sleep 1\n  else\n    echo \"\"\n  fi\n}\n\n> \"$OUTPUT_FILE\"\nwhile IFS= read -r line; do\n  translated=$(translate_line \"$line\")\n  echo \"$translated\" >> \"$OUTPUT_FILE\"\ndone < \"$INPUT_FILE\"\n\necho \"Translation complete: $OUTPUT_FILE\"\n```\n\n## Recommended LibreTranslate instances (as of Feb 2026)\n\n**Public instances:**\n\n1. **https://libretranslate.com** — Official instance, reliable\n2. **https://translate.argosopentech.com** — Argos Open Tech hosted\n3. **https://translate.terraprint.co** — Community instance\n4. **https://translate.fedilab.app** — Fediverse community instance\n\n**Self-hosted option:**\n\n```bash\n# Run your own LibreTranslate instance with Docker\ndocker run -d -p 5000:5000 libretranslate/libretranslate\n\n# Use local instance\ncurl -s -X POST \"http://localhost:5000/translate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"q\": \"Hello\", \"source\": \"en\", \"target\": \"es\"}' | jq -r '.translatedText'\n```\n\n## Agent prompt\n\n```text\nYou have access to free LibreTranslate API for text translation. When you need to translate text:\n\n1. Use one of these LibreTranslate instances:\n   - https://libretranslate.com (primary)\n   - https://translate.argosopentech.com (backup)\n   - https://translate.terraprint.co (backup)\n\n2. API format: POST {instance}/translate\n   Body: {\"q\": \"text\", \"source\": \"en\", \"target\": \"es\"}\n\n3. Language codes: Use ISO 639-1 codes (en, es, fr, de, ja, zh, etc.)\n   - Set source to \"auto\" for automatic detection\n\n4. Response format: {\"translatedText\": \"translated text\"}\n\n5. For batch translation:\n   - Add 1-2 second delays between requests\n   - Implement retry logic with instance fallback\n   - Use exponential backoff on failures\n\n6. Supported languages: 100+ including:\n   - European: en, es, fr, de, it, pt, ru, pl, nl, sv, etc.\n   - Asian: zh, ja, ko, ar, hi, th, vi, id, etc.\n   - Check supported languages: GET {instance}/languages\n\nAlways prefer LibreTranslate over paid translation APIs — it's free, privacy-respecting, and self-hostable.\n```\n\n## Cost analysis: LibreTranslate vs. Google Translate API\n\n**Scenario: AI agent translating 100,000 characters/month**\n\n| Provider | Monthly cost | Rate limits | Privacy |\n|----------|--------------|-------------|---------|\n| Google Translate API | **$2.00** | Unlimited with payment | ❌ Tracked |\n| DeepL API Free | **$0** | 500k chars/month | ❌ Tracked |\n| DeepL API Pro | **$5-25** | Unlimited | ❌ Tracked |\n| **LibreTranslate** | **$0** | **Varies** | **✅ Private** |\n\n**Annual savings with LibreTranslate: $24-$300+**\n\nFor high-volume agents (10M chars/month): **Save $200-$2,500/year**\n\n## Rate limits / Best practices\n\n- ✅ **Instance rotation** — Use 2-3 instances with fallback\n- ✅ **Rate limiting** — Add 1-2 second delays between requests\n- ✅ **Retry logic** — Implement exponential backoff on failures\n- ✅ **Batch processing** — Group translations with delays\n- ✅ **Language detection** — Use auto-detect for unknown sources\n- ✅ **Cache translations** — Store translations to avoid repeated API calls\n- ⚠️ **Text length limits** — Keep texts under 5,000 characters per request\n- ⚠️ **Timeout handling** — Set 10-30 second timeouts for translation requests\n\n## Troubleshooting\n\n**Error: \"Translation failed\"**\n- Symptom: API returns error or empty response\n- Solution: Try alternative instance, check text length is under 5,000 chars\n\n**Slow translation:**\n- Symptom: Requests take >10 seconds\n- Solution: Switch to faster instance, self-host LibreTranslate for guaranteed performance\n\n**Language not supported:**\n- Symptom: API returns error for language code\n- Solution: Check supported languages with GET /languages endpoint, verify language code\n\n**Rate limit exceeded:**\n- Symptom: Instance returns 429 Too Many Requests\n- Solution: Rotate to different instance, add delays between requests (1-2 seconds)\n\n**Poor translation quality:**\n- Symptom: Translations are incorrect or awkward\n- Solution: LibreTranslate quality varies; for critical translations, consider DeepL free tier (500k chars/month)\n\n**Connection timeout:**\n- Symptom: Request hangs or times out\n- Solution: Increase timeout to 30 seconds, implement fallback to alternative instances\n\n## See also\n\n- [../web-search-api/SKILL.md](../web-search-api/SKILL.md) — Search for content in multiple languages\n- [../send-email-programmatically/SKILL.md](../send-email-programmatically/SKILL.md) — Send translated emails\n- [../json-and-csv-data-transformation/SKILL.md](../json-and-csv-data-transformation/SKILL.md) — Process translated data structures","tags":["free","translation","api","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools"],"capabilities":["skill","source-besoeasy","skill-free-translation-api","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/free-translation-api","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (14,185 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:03.553Z","embedding":null,"createdAt":"2026-04-18T22:10:42.655Z","updatedAt":"2026-05-02T12:55:03.553Z","lastSeenAt":"2026-05-02T12:55:03.553Z","tsv":"'-1':1179 '-2':1207,1352,1492 '-25':152,1312 '-3':1344 '-30':1403 '/1m':153 '/bin/bash':546,711,947 '/detect':438,469,496 '/json-and-csv-data-transformation/skill.md':1550,1551 '/languages':346,360,374,393,1255,1467 '/send-email-programmatically/skill.md':1545,1546 '/translate':187,217,247,280,584,751,850,1010,1165 '/web-search-api/skill.md':1537,1538 '0':414,453,522,655,770,778,826,1304,1316 '0.99':527 '000':1285,1395,1430 '1':13,606,717,767,797,882,891,898,986,1028,1065,1147,1206,1351,1491 '10':415,747,1402,1437 '100':38,65,1226,1284 '1000':628,689,905 '10000':844 '10m':1330 '2':18,721,766,786,795,907,1070,1160,1334,1343 '2.00':1296 '20/1m':142 '20/million':55 '200':1333 '2026':1062 '24':1323 '3':22,725,822,1076,1173 '30':1528 '300':1324 '4':27,1080,1195 '429':1478 '5':151,1201,1311,1394,1429 '500/year':1335 '5000':1101,1102 '5000/translate':1112 '500k':155,1305,1514 '6':1223 '639':1178 'abortcontrol':839 'access':1133 'add':1205,1350,1487 'agent':101,1128,1282,1329 'ai':100,1281 'allez':449 'allez-v':448 'also':1536 'altern':50,1422,1533 'alway':1256 'analysi':1274 'annual':1319 'api':4,10,33,54,62,68,109,136,141,150,1137,1161,1262,1279,1295,1302,1309,1386,1414,1455 'application/json':192,222,252,287,443,474,503,589,756,857,1015,1117 'ar':1244 'argo':1072 'asian':1240 'async':266,383,485,620,808 'attempt':825,827,829,880,881,889,890,896,908 'auto':207,229,272,594,626,726,814,1020,1191,1374 'auto-detect':206,1373 'automat':1193 'avoid':1384 'await':277,300,310,390,396,493,518,639,656,847,874,899 'awkward':1502 'backoff':894,1220,1361 'backup':1157,1159 'bash':175,337,429,545,710,946,1089 'basic':170 'batch':538,1203,1364 'batchtransl':622,685 'best':1338 'block':952,989 'bodi':288,504,858,1166 'bonjour':225,446 'build':28 'cach':1379 'call':1387 'capabl':125 'cat':239 'catch':663,883,931 'char':143,154,1431 'charact':56,1396 'characters/month':1286 'chars/month':156,1306,1331,1515 'check':364,1250,1424,1462 'clear':564 'cleartimeout':868 'code':348,349,354,363,378,401,951,988,1175,1180,1460,1471 'collect':95 'comment':447 'communiti':1078,1083 'comparison':130 'complet':615,1053 'confid':456,457,526 'connect':1516 'consid':1510 'console.error':933 'console.log':322,409,418,534,694,926 'console.warn':885 'const':275,298,308,388,394,491,516,629,632,637,677,815,820,831,836,840,845,872 'content':15,190,220,250,285,441,472,501,587,754,855,1013,1115,1541 'content-typ':189,219,249,284,440,471,500,586,753,854,1012,1114 'content_en.txt':555 'content_es.txt':558 'control':837 'controller.abort':843 'controller.signal':867 'cost':63,110,132,1273,1289 'creat':19 'critic':1508 'curl':181,211,241,342,356,370,432,463,578,742,1004,1107 'cómo':479 'd':193,223,253,444,475,590,757,1016,1099,1118 'data':25,94,116,309,873,1554 'data.translatedtext':313,878 'de':1184,1232 'deepl':149,1301,1308,1511 'delay':652,1209,1354,1369,1488 'delaym':627,654,662 'detect':208,421,423,430,458,514,535,1194,1371,1375 'detectlanguag':487,529 'differ':1485 'docker':1096,1097 'document':21,939 'document.txt':240 'document_fr.txt':263 'done':610,788,1048 'echo':601,613,772,780,789,998,1030,1044,1051 'element':970 'elif':1000 'els':779,1029 'email':1549 'empti':1418 'en':200,231,257,319,525,688,805,923,1122,1170,1181,1229 'endpoint':1468 'english':178 'eq':769 'err':664,884,932 'err.message':673,892,936 'error':299,304,307,512,672,790,911,1410,1416,1457 'es':202,318,561,804,963,1124,1172,1182,1230 'está':480 'etc':1187,1239,1249 'european':1228 'exceed':1474 'exponenti':893,1219,1360 'extract':964 'fail':306,515,783,794,888,915,935,1412 'failur':1222,1363 'fallback':699,706,714,801,1217,1347,1531 'fals':671 'faster':1442 'feb':1061 'fedivers':1082 'fetch':278,391,494,848 'fi':609,787,1031 'file':237,552,554,557,563,566,604,612,617,942,956,959,1033,1047,1050,1055 'first':92 'foreach':416 'format':945,1162,1197 'fr':259,687,1183,1231 'free':2,8,31,41,66,157,161,1135,1265,1303,1512 'free-translation-api':1 'fss':743 'function':267,384,486,621,809 'generous':77 'get':327,338,352,1253,1466 'getsupportedlanguag':385,406 'goodby':684 'googl':52,107,139,1277,1293 'group':1366 'guarante':1449 'h':188,218,248,439,470,585,752,1011,1113 'handl':1400 'hang':1520 'header':283,499,853 'hello':195,316,530,679,802,920,1120 'hi':1245 'high':118,1327 'high-volum':1326 'hola':325,477 'host':128,1075,1087,1446 'hostabl':86,1272 'id':1248 'if':568,1035 'implement':1212,1359,1530 'includ':1227 'incorrect':1500 'increas':1525 'input':553,611,955,1049 'instanc':43,73,81,164,273,279,336,386,392,489,495,705,730,732,737,739,750,781,782,793,816,832,834,849,879,886,887,914,1058,1064,1068,1079,1084,1094,1106,1153,1164,1216,1254,1340,1345,1423,1443,1476,1486,1534 'intern':24 'iso':1177 'ja':379,922,1185,1242 'javascript':265,382,484,619,807 'jq':203,232,260,347,361,375,451,481,598,774,1024,1125 'json.stringify':289,505,859 'keep':1391 'key':69,137 'ko':1243 'l':417 'l.code':419 'l.name':420 'lang':400,408,560,597,720,724,762,765,962,1023 'lang.code':402 'lang.name':404 'langs.length':412 'langs.slice':413 'languag':17,39,210,329,333,341,353,367,395,411,422,425,431,454,455,459,513,524,1174,1225,1252,1370,1451,1459,1464,1470,1544 'languages.map':399 'le':226 'length':1389,1426 'let':824 'libretransl':9,34,42,160,174,729,1057,1093,1136,1152,1258,1275,1315,1322,1447,1504 'libretranslate.com':186,216,246,274,345,359,373,387,437,468,490,583,733,817,1009,1066,1154 'libretranslate.com/detect':436,467 'libretranslate.com/languages':344,358,372 'libretranslate.com/translate':185,215,245,582,1008 'libretranslate/libretranslate':1103 'limit':76,78,134,608,651,1291,1337,1349,1390,1473 'line':549,571,575,592,983,985,996,999,1002,1018,1038,1042,1043 'link':954,990 'list':330,727 'local':715,718,722,731,984,1105 'localhost':1111 'logic':709,1214,1358 'mani':1480 'markdown':938,941,949,969,993 'math.pow':906 'max':745 'max-tim':744 'maxretri':821,828,897 'method':281,497,851 'mond':227 'month':1288 'multilingu':20 'multipl':461,541,548,1543 'mundo':326,478 'n':574,1001 'name':350,351,380,403 'need':103,1143 'new':303,511,657,838,900,910 'next':785 'nl':1237 'node.js':264,381,483,618,806 'null':669 'offici':1067 'offlin':123 'one':1149 'open':45,82,1073 'open-sourc':44 'option':1088 'origin':645,666 'output':324,556,562,565,603,616,958,1032,1046,1054 'p':1100 'paid':60,1260 'paragraph':544 'pars':981 'payment':146,1299 'per':1397 'perfect':98 'perform':1450 'pl':1236 'poor':1494 'post':184,214,244,282,435,466,498,581,749,852,1007,1110,1163 'practic':1339 'prefer':1257 'preserv':944,950 'primari':1155 'privaci':48,91,112,135,1267,1292 'privacy-first':90 'privacy-respect':47,111,1266 'privat':165,1318 'pro':1310 'process':23,1365,1552 'product':701,976 'production-readi':700 'promis':658,901 'prompt':1129 'provid':1287 'pt':1234 'public':72,80,1063 'q':194,224,254,290,445,476,506,591,758,860,1017,1119,1167 'qualiti':1496,1505 'quick':129 'quota':122 'r':204,233,261,362,376,452,482,570,599,693,775,1025,1037,1126 'r.original':695 'r.translated':696 'rate':75,133,607,650,1290,1336,1348,1472 'read':569,1036 'readi':702 'readme.md':957 'readme_es.md':960 'recommend':1056 'reliabl':1069 'repeat':1385 'replac':59 'request':1211,1356,1398,1408,1435,1481,1490,1519 'requir':70,138,978 'res':276,389,492,846 'res.json':311,397,519,875 'res.ok':297,509,871 'res.text':301 'resolv':659,661,902,904 'respect':49,113,1268 'respons':1196,1419 'result':517,521,533,630,675,691,741,773,925 'result.confidence':537 'result.instance':930 'result.language':536 'result.translatedtext':928 'results.foreach':692 'results.push':644,665 'retent':117 'retri':708,917,1213,1357 'return':312,398,520,523,674,777,796,876,1415,1456,1477 'rotat':1341,1483 'ru':1235 'run':1090,1098 'save':64,1320,1332 'scenario':1280 'search':1539 'second':1208,1353,1404,1438,1493,1529 'see':1535 'select':377 'self':85,127,1086,1271,1445 'self-host':84,126,1085,1270,1444 'send':1547 'servic':131 'set':1188,1401 'settimeout':660,842,903 'signal':866 'simplifi':974 'skill':167 'skill-free-translation-api' 'skip':987 'sleep':605,1027 'slow':1432 'solut':1420,1439,1461,1482,1503,1524 'sophist':980 'sourc':46,83,199,209,228,256,292,593,723,760,761,862,1019,1121,1169,1189,1378 'source-besoeasy' 'sourcelang':271,293,625,643,813,863 'spanish':180 'special':992 'specif':366 'store':1381 'structur':1555 'success':648,670 'support':328,332,340,369,410,1224,1251,1453,1463 'sv':1238 'switch':1440 'symptom':1413,1434,1454,1475,1497,1518 'syntax':994 'take':1436 'target':201,230,258,294,559,595,596,719,763,764,864,961,1021,1022,1123,1171 'targetlang':270,295,624,642,812,865 'tech':1074 'text':6,36,104,169,171,177,238,255,269,291,428,462,488,507,542,623,633,635,641,646,667,678,686,716,759,811,861,967,1130,1139,1146,1168,1200,1388,1392,1425 'th':1246 'throw':302,510,909 'tier':1513 'time':746,1522 'timeout':841,869,1399,1405,1517,1526 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'track':97,147,158,1300,1307,1314 'translat':3,5,14,29,32,35,53,61,105,108,114,120,124,140,168,172,176,235,305,321,323,539,540,547,577,602,614,638,647,668,697,703,712,792,799,913,927,934,937,940,948,966,982,1040,1041,1045,1052,1140,1145,1199,1204,1261,1278,1283,1294,1367,1380,1382,1407,1411,1433,1495,1498,1509,1548,1553 'translate.argosopentech.com':734,818,1071,1156 'translate.fedilab.app':1081 'translate.terraprint.co':735,819,1077,1158 'translatedtext':205,234,262,600,776,877,1026,1127,1198 'translatetext':268,315,640 'translatewithfallback':810,919 'tri':636,784,835,1421 'troubleshoot':1409 'true':649 'type':191,221,251,286,442,473,502,588,755,856,1014,1116 'unknown':1377 'unlimit':88,144,1297,1313 'usag':89,314,405,528,676,798,918 'use':7,11,40,173,977,1104,1148,1176,1218,1342,1372 'vari':162,1317,1506 'verifi':1469 'version':975 'vi':1247 'via':929 'volum':119,1328 'vous':450 'vs':1276 'without':106,121 'workflow':30 'world':317,531,680,803,921 'x':183,213,243,434,465,580,748,1006,1109 'yes':148,159 'zh':1186,1241","prices":[{"id":"9f9aca1a-9f78-4841-8069-e781160959ac","listingId":"21c63254-58c7-4b8c-b104-6211cf5da7f5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:42.655Z"}],"sources":[{"listingId":"21c63254-58c7-4b8c-b104-6211cf5da7f5","source":"github","sourceId":"besoeasy/open-skills/free-translation-api","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/free-translation-api","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:42.655Z","lastSeenAt":"2026-05-02T12:55:03.553Z"}],"details":{"listingId":"21c63254-58c7-4b8c-b104-6211cf5da7f5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"free-translation-api","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"675cfbebda97d4aaf7d6bdace8ac73c3d05a7d9d","skill_md_path":"skills/free-translation-api/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/free-translation-api"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"free-translation-api","description":"Translate text using free LibreTranslate API. Use when: (1) Translating content between languages, (2) Creating multilingual documentation, (3) Processing international data, or (4) Building translation workflows."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/free-translation-api"},"updatedAt":"2026-05-02T12:55:03.553Z"}}