{
  "schemaVersion": "1.0",
  "item": {
    "slug": "limesurvey-openclaw-skill",
    "name": "Limesurvey Openclaw Skill",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/olegantonov/limesurvey-openclaw-skill",
    "canonicalUrl": "https://clawhub.ai/olegantonov/limesurvey-openclaw-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/limesurvey-openclaw-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=limesurvey-openclaw-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "references/api_reference.md",
      "references/examples.md",
      "scripts/limesurvey.py",
      "scripts/limesurvey_client.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/limesurvey-openclaw-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/limesurvey-openclaw-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "LimeSurvey RemoteControl 2 API",
        "body": "Automate LimeSurvey survey management via the RemoteControl 2 JSON-RPC API."
      },
      {
        "title": "Prerequisites",
        "body": "Required Environment Variables:\n\nLIMESURVEY_URL — Full URL to RemoteControl endpoint (e.g., https://survey.example.com/index.php/admin/remotecontrol)\nLIMESURVEY_USER — Service account username\nLIMESURVEY_PASSWORD — Service account password\n\nSecurity Recommendations:\n\nUse a least-privilege service account, not your full admin credentials\nCreate a dedicated LimeSurvey user with minimal required permissions (survey management only, no system administration)\nUse a strong, unique password; rotate periodically after initial use\nNever commit credentials to version control — use environment variables or secure vaults only\nVerify the RemoteControl API is accessible only from trusted networks\n\nSetup:\n\nexport LIMESURVEY_URL='https://survey.example.com/index.php/admin/remotecontrol'\nexport LIMESURVEY_USER='service_account_username'\nexport LIMESURVEY_PASSWORD='secure_service_password'"
      },
      {
        "title": "Setup",
        "body": "Set environment variables:\n\nexport LIMESURVEY_URL='https://survey.example.com/index.php/admin/remotecontrol'\nexport LIMESURVEY_USER='admin'\nexport LIMESURVEY_PASSWORD='your_password'"
      },
      {
        "title": "CLI Usage",
        "body": "# List all surveys\npython3 scripts/limesurvey.py list-surveys\n\n# Export responses\npython3 scripts/limesurvey.py export-responses 123456 --format csv -o responses.csv\n\n# List participants\npython3 scripts/limesurvey.py list-participants 123456 --limit 100\n\n# Add participants from JSON\npython3 scripts/limesurvey.py add-participants 123456 --file participants.json\n\n# Send invitations\npython3 scripts/limesurvey.py invite-participants 123456\n\n# Activate survey\npython3 scripts/limesurvey.py activate-survey 123456\n\n# Get survey statistics\npython3 scripts/limesurvey.py get-summary 123456"
      },
      {
        "title": "Python API Usage",
        "body": "from scripts.limesurvey_client import LimeSurveySession\n\nurl = 'https://survey.example.com/index.php/admin/remotecontrol'\n\nwith LimeSurveySession(url, 'admin', 'password') as client:\n    # List surveys\n    surveys = client.call('list_surveys', client.session_key)\n    \n    # Export responses\n    encoded = client.call('export_responses', client.session_key, \n                         survey_id, 'csv')\n    csv_data = client.decode_base64(encoded)"
      },
      {
        "title": "Survey Management",
        "body": "List all surveys:\n\nsurveys = client.call('list_surveys', client.session_key)\n\nActivate a survey:\n\nresult = client.call('activate_survey', client.session_key, survey_id)\n\nGet survey statistics:\n\nstats = client.call('get_summary', client.session_key, survey_id, 'all')\n# Returns: completed_responses, incomplete_responses, token_count, etc.\n\nCopy a survey:\n\nresult = client.call('copy_survey', client.session_key, \n                    source_id, \"New Survey Name\")\nnew_id = result['newsid']"
      },
      {
        "title": "Participant Management",
        "body": "Initialize participant table:\n\n# Create table with custom attributes\nclient.call('activate_tokens', client.session_key, survey_id, [1, 2, 3])\n\nAdd participants:\n\nparticipants = [\n    {\"email\": \"user@example.com\", \"firstname\": \"John\", \"lastname\": \"Doe\"},\n    {\"email\": \"user2@example.com\", \"firstname\": \"Jane\", \"lastname\": \"Smith\"}\n]\nresult = client.call('add_participants', client.session_key, \n                    survey_id, participants, True)\n\nSend invitations:\n\n# Send to specific tokens\ntoken_ids = [1, 2, 3]\nresult = client.call('invite_participants', client.session_key, \n                    survey_id, token_ids)\n\n# Or send to all pending\nresult = client.call('invite_participants', client.session_key, \n                    survey_id, None)\n\nList participants with filters:\n\n# Find unused tokens\nparticipants = client.call('list_participants', client.session_key,\n                          survey_id, 0, 100, True)\n\n# Find by custom attribute\nparticipants = client.call('list_participants', client.session_key,\n                          survey_id, 0, 1000, False, False,\n                          {'attribute_1': 'ACME Corp'})"
      },
      {
        "title": "Response Operations",
        "body": "Export all responses:\n\nencoded = client.call('export_responses', client.session_key,\n                     survey_id, 'csv')\ncsv_data = client.decode_base64(encoded)\n\nwith open('responses.csv', 'w') as f:\n    f.write(csv_data)\n\nExport only completed responses:\n\nencoded = client.call('export_responses', client.session_key,\n                     survey_id, 'csv', None, 'complete')\n\nExport by token:\n\nencoded = client.call('export_responses_by_token', client.session_key,\n                     survey_id, 'json', ['token1', 'token2'])\n\nAdd a response programmatically:\n\nresponse_data = {\n    'G1Q1': 'Answer text',\n    'G1Q2': '3',  # Multiple choice value\n    'token': 'xyz123'\n}\nresponse_id = client.call('add_response', client.session_key, \n                         survey_id, response_data)"
      },
      {
        "title": "Question & Group Operations",
        "body": "List groups:\n\ngroups = client.call('list_groups', client.session_key, survey_id)\n\nAdd a question group:\n\ngroup_id = client.call('add_group', client.session_key, survey_id,\n                      'Demographics', 'Basic information')\n\nList questions:\n\n# All questions in survey\nquestions = client.call('list_questions', client.session_key, survey_id)\n\n# Questions in specific group\nquestions = client.call('list_questions', client.session_key, \n                       survey_id, group_id)\n\nGet question details:\n\nprops = client.call('get_question_properties', client.session_key,\n                   question_id, ['question', 'type', 'mandatory'])"
      },
      {
        "title": "Export & Reporting",
        "body": "Generate statistics PDF:\n\nencoded = client.call('export_statistics', client.session_key,\n                     survey_id, 'pdf', None, '1')  # With graphs\n\nimport base64\npdf_data = base64.b64decode(encoded)\n\nwith open('stats.pdf', 'wb') as f:\n    f.write(pdf_data)\n\nGet submission timeline:\n\ntimeline = client.call('export_timeline', client.session_key,\n                      survey_id, 'day', '2024-01-01', '2024-12-31')\n\nfor entry in timeline:\n    print(f\"{entry['period']}: {entry['count']} submissions\")\n\nGet survey fieldmap:\n\nfieldmap = client.call('get_fieldmap', client.session_key, survey_id)\n# Maps question codes to metadata"
      },
      {
        "title": "Error Handling",
        "body": "All API functions return status objects on error:\n\nresult = client.call('activate_survey', client.session_key, survey_id)\n\nif isinstance(result, dict) and 'status' in result:\n    print(f\"Error: {result['status']}\")\n    # Common errors:\n    # - Invalid session key\n    # - No permission\n    # - Invalid survey ID\n    # - Survey already active\nelse:\n    print(\"Success!\")\n\nUse try/except for connection errors:\n\nfrom scripts.limesurvey_client import LimeSurveyError\n\ntry:\n    with LimeSurveySession(url, username, password) as client:\n        result = client.call('list_surveys', client.session_key)\nexcept LimeSurveyError as e:\n    print(f\"API error: {e}\")"
      },
      {
        "title": "Reference Documentation",
        "body": "API Reference - Complete function reference with parameters and return values\nExamples - Practical code examples for common tasks"
      },
      {
        "title": "Session",
        "body": "get_session_key(username, password) - Create session\nrelease_session_key(session_key) - Close session"
      },
      {
        "title": "Surveys",
        "body": "list_surveys(session_key) - List all surveys\nget_survey_properties(session_key, survey_id, properties) - Get properties\nset_survey_properties(session_key, survey_id, properties) - Update properties\nactivate_survey(session_key, survey_id) - Activate survey\ndelete_survey(session_key, survey_id) - Delete survey\ncopy_survey(session_key, source_id, new_name) - Duplicate survey\nimport_survey(session_key, data, type) - Import from file\nget_summary(session_key, survey_id, stat) - Get statistics"
      },
      {
        "title": "Participants",
        "body": "activate_tokens(session_key, survey_id, attributes) - Initialize table\nlist_participants(session_key, survey_id, start, limit, unused, attributes, conditions) - List participants\nadd_participants(session_key, survey_id, data, create_token) - Add participants\ndelete_participants(session_key, survey_id, token_ids) - Delete participants\nget_participant_properties(session_key, survey_id, query, properties) - Get properties\nset_participant_properties(session_key, survey_id, query, properties) - Update properties\ninvite_participants(session_key, survey_id, token_ids) - Send invitations\nremind_participants(session_key, survey_id, token_ids) - Send reminders"
      },
      {
        "title": "Responses",
        "body": "export_responses(session_key, survey_id, format, ...) - Export responses\nexport_responses_by_token(session_key, survey_id, format, tokens) - Export by token\nadd_response(session_key, survey_id, data) - Add response\nupdate_response(session_key, survey_id, data) - Update response\ndelete_response(session_key, survey_id, response_id) - Delete response\nget_response_ids(session_key, survey_id, token) - Find response IDs"
      },
      {
        "title": "Questions & Groups",
        "body": "list_groups(session_key, survey_id) - List groups\nadd_group(session_key, survey_id, title, description) - Create group\ndelete_group(session_key, survey_id, group_id) - Delete group\nget_group_properties(session_key, group_id, properties) - Get properties\nset_group_properties(session_key, group_id, properties) - Update properties\nlist_questions(session_key, survey_id, group_id) - List questions\nget_question_properties(session_key, question_id, properties) - Get properties\nset_question_properties(session_key, question_id, properties) - Update properties\nimport_question(session_key, survey_id, group_id, data, type) - Import question\ndelete_question(session_key, question_id) - Delete question"
      },
      {
        "title": "Export & Reporting",
        "body": "export_statistics(session_key, survey_id, doc_type, language, graph) - Export statistics\nexport_timeline(session_key, survey_id, type, start, end) - Submission timeline\nget_fieldmap(session_key, survey_id) - Get question codes"
      },
      {
        "title": "Notes",
        "body": "Session management: Always close sessions with release_session_key or use LimeSurveySession context manager\nBase64 encoding: Export functions return base64-encoded data — use client.decode_base64() or base64.b64decode()\nPermissions: API calls respect user permissions — same as logging into admin interface\nRate limiting: LimeSurvey has brute-force protection on authentication\nJSON-RPC: Content-Type must be application/json (handled automatically by client)"
      },
      {
        "title": "Full API Documentation",
        "body": "Official LimeSurvey API: https://api.limesurvey.org/classes/remotecontrol-handle.html\n\nManual: https://www.limesurvey.org/manual/RemoteControl_2_API"
      }
    ],
    "body": "LimeSurvey RemoteControl 2 API\n\nAutomate LimeSurvey survey management via the RemoteControl 2 JSON-RPC API.\n\nPrerequisites\n\nRequired Environment Variables:\n\nLIMESURVEY_URL — Full URL to RemoteControl endpoint (e.g., https://survey.example.com/index.php/admin/remotecontrol)\nLIMESURVEY_USER — Service account username\nLIMESURVEY_PASSWORD — Service account password\n\nSecurity Recommendations:\n\nUse a least-privilege service account, not your full admin credentials\nCreate a dedicated LimeSurvey user with minimal required permissions (survey management only, no system administration)\nUse a strong, unique password; rotate periodically after initial use\nNever commit credentials to version control — use environment variables or secure vaults only\nVerify the RemoteControl API is accessible only from trusted networks\n\nSetup:\n\nexport LIMESURVEY_URL='https://survey.example.com/index.php/admin/remotecontrol'\nexport LIMESURVEY_USER='service_account_username'\nexport LIMESURVEY_PASSWORD='secure_service_password'\n\nQuick Start\nSetup\n\nSet environment variables:\n\nexport LIMESURVEY_URL='https://survey.example.com/index.php/admin/remotecontrol'\nexport LIMESURVEY_USER='admin'\nexport LIMESURVEY_PASSWORD='your_password'\n\nCLI Usage\n# List all surveys\npython3 scripts/limesurvey.py list-surveys\n\n# Export responses\npython3 scripts/limesurvey.py export-responses 123456 --format csv -o responses.csv\n\n# List participants\npython3 scripts/limesurvey.py list-participants 123456 --limit 100\n\n# Add participants from JSON\npython3 scripts/limesurvey.py add-participants 123456 --file participants.json\n\n# Send invitations\npython3 scripts/limesurvey.py invite-participants 123456\n\n# Activate survey\npython3 scripts/limesurvey.py activate-survey 123456\n\n# Get survey statistics\npython3 scripts/limesurvey.py get-summary 123456\n\nPython API Usage\nfrom scripts.limesurvey_client import LimeSurveySession\n\nurl = 'https://survey.example.com/index.php/admin/remotecontrol'\n\nwith LimeSurveySession(url, 'admin', 'password') as client:\n    # List surveys\n    surveys = client.call('list_surveys', client.session_key)\n    \n    # Export responses\n    encoded = client.call('export_responses', client.session_key, \n                         survey_id, 'csv')\n    csv_data = client.decode_base64(encoded)\n\nCommon Workflows\nSurvey Management\n\nList all surveys:\n\nsurveys = client.call('list_surveys', client.session_key)\n\n\nActivate a survey:\n\nresult = client.call('activate_survey', client.session_key, survey_id)\n\n\nGet survey statistics:\n\nstats = client.call('get_summary', client.session_key, survey_id, 'all')\n# Returns: completed_responses, incomplete_responses, token_count, etc.\n\n\nCopy a survey:\n\nresult = client.call('copy_survey', client.session_key, \n                    source_id, \"New Survey Name\")\nnew_id = result['newsid']\n\nParticipant Management\n\nInitialize participant table:\n\n# Create table with custom attributes\nclient.call('activate_tokens', client.session_key, survey_id, [1, 2, 3])\n\n\nAdd participants:\n\nparticipants = [\n    {\"email\": \"user@example.com\", \"firstname\": \"John\", \"lastname\": \"Doe\"},\n    {\"email\": \"user2@example.com\", \"firstname\": \"Jane\", \"lastname\": \"Smith\"}\n]\nresult = client.call('add_participants', client.session_key, \n                    survey_id, participants, True)\n\n\nSend invitations:\n\n# Send to specific tokens\ntoken_ids = [1, 2, 3]\nresult = client.call('invite_participants', client.session_key, \n                    survey_id, token_ids)\n\n# Or send to all pending\nresult = client.call('invite_participants', client.session_key, \n                    survey_id, None)\n\n\nList participants with filters:\n\n# Find unused tokens\nparticipants = client.call('list_participants', client.session_key,\n                          survey_id, 0, 100, True)\n\n# Find by custom attribute\nparticipants = client.call('list_participants', client.session_key,\n                          survey_id, 0, 1000, False, False,\n                          {'attribute_1': 'ACME Corp'})\n\nResponse Operations\n\nExport all responses:\n\nencoded = client.call('export_responses', client.session_key,\n                     survey_id, 'csv')\ncsv_data = client.decode_base64(encoded)\n\nwith open('responses.csv', 'w') as f:\n    f.write(csv_data)\n\n\nExport only completed responses:\n\nencoded = client.call('export_responses', client.session_key,\n                     survey_id, 'csv', None, 'complete')\n\n\nExport by token:\n\nencoded = client.call('export_responses_by_token', client.session_key,\n                     survey_id, 'json', ['token1', 'token2'])\n\n\nAdd a response programmatically:\n\nresponse_data = {\n    'G1Q1': 'Answer text',\n    'G1Q2': '3',  # Multiple choice value\n    'token': 'xyz123'\n}\nresponse_id = client.call('add_response', client.session_key, \n                         survey_id, response_data)\n\nQuestion & Group Operations\n\nList groups:\n\ngroups = client.call('list_groups', client.session_key, survey_id)\n\n\nAdd a question group:\n\ngroup_id = client.call('add_group', client.session_key, survey_id,\n                      'Demographics', 'Basic information')\n\n\nList questions:\n\n# All questions in survey\nquestions = client.call('list_questions', client.session_key, survey_id)\n\n# Questions in specific group\nquestions = client.call('list_questions', client.session_key, \n                       survey_id, group_id)\n\n\nGet question details:\n\nprops = client.call('get_question_properties', client.session_key,\n                   question_id, ['question', 'type', 'mandatory'])\n\nExport & Reporting\n\nGenerate statistics PDF:\n\nencoded = client.call('export_statistics', client.session_key,\n                     survey_id, 'pdf', None, '1')  # With graphs\n\nimport base64\npdf_data = base64.b64decode(encoded)\n\nwith open('stats.pdf', 'wb') as f:\n    f.write(pdf_data)\n\n\nGet submission timeline:\n\ntimeline = client.call('export_timeline', client.session_key,\n                      survey_id, 'day', '2024-01-01', '2024-12-31')\n\nfor entry in timeline:\n    print(f\"{entry['period']}: {entry['count']} submissions\")\n\n\nGet survey fieldmap:\n\nfieldmap = client.call('get_fieldmap', client.session_key, survey_id)\n# Maps question codes to metadata\n\nError Handling\n\nAll API functions return status objects on error:\n\nresult = client.call('activate_survey', client.session_key, survey_id)\n\nif isinstance(result, dict) and 'status' in result:\n    print(f\"Error: {result['status']}\")\n    # Common errors:\n    # - Invalid session key\n    # - No permission\n    # - Invalid survey ID\n    # - Survey already active\nelse:\n    print(\"Success!\")\n\n\nUse try/except for connection errors:\n\nfrom scripts.limesurvey_client import LimeSurveyError\n\ntry:\n    with LimeSurveySession(url, username, password) as client:\n        result = client.call('list_surveys', client.session_key)\nexcept LimeSurveyError as e:\n    print(f\"API error: {e}\")\n\nReference Documentation\nAPI Reference - Complete function reference with parameters and return values\nExamples - Practical code examples for common tasks\nAvailable Functions\nSession\nget_session_key(username, password) - Create session\nrelease_session_key(session_key) - Close session\nSurveys\nlist_surveys(session_key) - List all surveys\nget_survey_properties(session_key, survey_id, properties) - Get properties\nset_survey_properties(session_key, survey_id, properties) - Update properties\nactivate_survey(session_key, survey_id) - Activate survey\ndelete_survey(session_key, survey_id) - Delete survey\ncopy_survey(session_key, source_id, new_name) - Duplicate survey\nimport_survey(session_key, data, type) - Import from file\nget_summary(session_key, survey_id, stat) - Get statistics\nParticipants\nactivate_tokens(session_key, survey_id, attributes) - Initialize table\nlist_participants(session_key, survey_id, start, limit, unused, attributes, conditions) - List participants\nadd_participants(session_key, survey_id, data, create_token) - Add participants\ndelete_participants(session_key, survey_id, token_ids) - Delete participants\nget_participant_properties(session_key, survey_id, query, properties) - Get properties\nset_participant_properties(session_key, survey_id, query, properties) - Update properties\ninvite_participants(session_key, survey_id, token_ids) - Send invitations\nremind_participants(session_key, survey_id, token_ids) - Send reminders\nResponses\nexport_responses(session_key, survey_id, format, ...) - Export responses\nexport_responses_by_token(session_key, survey_id, format, tokens) - Export by token\nadd_response(session_key, survey_id, data) - Add response\nupdate_response(session_key, survey_id, data) - Update response\ndelete_response(session_key, survey_id, response_id) - Delete response\nget_response_ids(session_key, survey_id, token) - Find response IDs\nQuestions & Groups\nlist_groups(session_key, survey_id) - List groups\nadd_group(session_key, survey_id, title, description) - Create group\ndelete_group(session_key, survey_id, group_id) - Delete group\nget_group_properties(session_key, group_id, properties) - Get properties\nset_group_properties(session_key, group_id, properties) - Update properties\nlist_questions(session_key, survey_id, group_id) - List questions\nget_question_properties(session_key, question_id, properties) - Get properties\nset_question_properties(session_key, question_id, properties) - Update properties\nimport_question(session_key, survey_id, group_id, data, type) - Import question\ndelete_question(session_key, question_id) - Delete question\nExport & Reporting\nexport_statistics(session_key, survey_id, doc_type, language, graph) - Export statistics\nexport_timeline(session_key, survey_id, type, start, end) - Submission timeline\nget_fieldmap(session_key, survey_id) - Get question codes\nNotes\nSession management: Always close sessions with release_session_key or use LimeSurveySession context manager\nBase64 encoding: Export functions return base64-encoded data — use client.decode_base64() or base64.b64decode()\nPermissions: API calls respect user permissions — same as logging into admin interface\nRate limiting: LimeSurvey has brute-force protection on authentication\nJSON-RPC: Content-Type must be application/json (handled automatically by client)\nFull API Documentation\n\nOfficial LimeSurvey API: https://api.limesurvey.org/classes/remotecontrol-handle.html\n\nManual: https://www.limesurvey.org/manual/RemoteControl_2_API"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/olegantonov/limesurvey-openclaw-skill",
    "publisherUrl": "https://clawhub.ai/olegantonov/limesurvey-openclaw-skill",
    "owner": "olegantonov",
    "version": "1.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/limesurvey-openclaw-skill",
    "agentUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/limesurvey-openclaw-skill/agent.md"
  }
}