{
  "schemaVersion": "1.0",
  "item": {
    "slug": "mailerlite",
    "name": "MailerLite",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/mailerlite",
    "canonicalUrl": "https://clawhub.ai/byungkyu/mailerlite",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/mailerlite",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=mailerlite",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "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. 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. 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/mailerlite"
    },
    "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/mailerlite",
    "agentPageUrl": "https://openagent3.xyz/skills/mailerlite/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mailerlite/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mailerlite/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. 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. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "MailerLite",
        "body": "Access the MailerLite API with managed OAuth authentication. Manage subscribers, groups, campaigns, automations, forms, fields, segments, and webhooks."
      },
      {
        "title": "Quick Start",
        "body": "# List subscribers\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/mailerlite/api/subscribers?limit=10')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Base URL",
        "body": "https://gateway.maton.ai/mailerlite/{native-api-path}\n\nReplace {native-api-path} with the actual MailerLite API endpoint path. The gateway proxies requests to connect.mailerlite.com and automatically injects your OAuth token."
      },
      {
        "title": "Authentication",
        "body": "All requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\""
      },
      {
        "title": "Getting Your API Key",
        "body": "Sign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key"
      },
      {
        "title": "Connection Management",
        "body": "Manage your MailerLite OAuth connections at https://ctrl.maton.ai."
      },
      {
        "title": "List Connections",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=mailerlite&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Create Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'mailerlite'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"21fd90f9-5935-43cd-b6c8-bde9d915ca80\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2025-12-08T07:20:53.488460Z\",\n    \"last_updated_time\": \"2026-01-31T20:03:32.593153Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"mailerlite\",\n    \"metadata\": {}\n  }\n}\n\nOpen the returned url in a browser to complete OAuth authorization."
      },
      {
        "title": "Delete Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Specifying Connection",
        "body": "If you have multiple MailerLite connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/mailerlite/api/subscribers')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Subscriber Operations",
        "body": "List Subscribers\n\nGET /mailerlite/api/subscribers\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (default: 25)\ncursor - Pagination cursor\ninclude - Include related data: groups\n\nGet Subscriber\n\nGET /mailerlite/api/subscribers/{subscriber_id_or_email}\n\nCreate/Upsert Subscriber\n\nPOST /mailerlite/api/subscribers\nContent-Type: application/json\n\n{\n  \"email\": \"subscriber@example.com\",\n  \"fields\": {\n    \"name\": \"John Doe\",\n    \"company\": \"Acme Inc\"\n  },\n  \"groups\": [\"12345678901234567\"],\n  \"status\": \"active\"\n}\n\nReturns 201 for new subscribers, 200 for updates.\n\nUpdate Subscriber\n\nPUT /mailerlite/api/subscribers/{subscriber_id}\nContent-Type: application/json\n\n{\n  \"fields\": {\n    \"name\": \"Jane Doe\"\n  },\n  \"status\": \"active\"\n}\n\nDelete Subscriber\n\nDELETE /mailerlite/api/subscribers/{subscriber_id}\n\nGet Subscriber Activity\n\nGET /mailerlite/api/subscribers/{subscriber_id}/activity-log\n\nQuery parameters:\n\nfilter[log_name] - Filter by activity type: campaign_send, automation_email_sent, email_open, link_click, email_bounce, spam_complaint, unsubscribed\nlimit - Results per page (default: 100)\npage - Page number (starts from 1)\n\nForget Subscriber (GDPR)\n\nPOST /mailerlite/api/subscribers/{subscriber_id}/forget"
      },
      {
        "title": "Group Operations",
        "body": "List Groups\n\nGET /mailerlite/api/groups\n\nQuery parameters:\n\nlimit - Results per page\npage - Page number (starts from 1)\nfilter[name] - Filter by name (partial match)\nsort - Sort by: name, total, open_rate, click_rate, created_at (prepend - for descending)\n\nCreate Group\n\nPOST /mailerlite/api/groups\nContent-Type: application/json\n\n{\n  \"name\": \"Newsletter Subscribers\"\n}\n\nUpdate Group\n\nPUT /mailerlite/api/groups/{group_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Group Name\"\n}\n\nDelete Group\n\nDELETE /mailerlite/api/groups/{group_id}\n\nGet Group Subscribers\n\nGET /mailerlite/api/groups/{group_id}/subscribers\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (1-1000, default: 50)\ncursor - Pagination cursor\n\nAssign Subscriber to Group\n\nPOST /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}\n\nRemove Subscriber from Group\n\nDELETE /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}"
      },
      {
        "title": "Campaign Operations",
        "body": "List Campaigns\n\nGET /mailerlite/api/campaigns\n\nQuery parameters:\n\nfilter[status] - Filter by status: sent, draft, ready\nfilter[type] - Filter by type: regular, ab, resend, rss\nlimit - Results per page: 10, 25, 50, or 100 (default: 25)\npage - Page number (starts from 1)\n\nGet Campaign\n\nGET /mailerlite/api/campaigns/{campaign_id}\n\nCreate Campaign\n\nPOST /mailerlite/api/campaigns\nContent-Type: application/json\n\n{\n  \"name\": \"My Newsletter\",\n  \"type\": \"regular\",\n  \"emails\": [\n    {\n      \"subject\": \"Weekly Update\",\n      \"from_name\": \"Newsletter\",\n      \"from\": \"newsletter@example.com\"\n    }\n  ],\n  \"groups\": [\"12345678901234567\"]\n}\n\nUpdate Campaign\n\nPUT /mailerlite/api/campaigns/{campaign_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Campaign Name\",\n  \"emails\": [\n    {\n      \"subject\": \"New Subject Line\",\n      \"from_name\": \"Newsletter\",\n      \"from\": \"newsletter@example.com\"\n    }\n  ]\n}\n\nNote: Only draft campaigns can be updated.\n\nSchedule Campaign\n\nPOST /mailerlite/api/campaigns/{campaign_id}/schedule\nContent-Type: application/json\n\n{\n  \"delivery\": \"instant\"\n}\n\nFor scheduled delivery:\n\n{\n  \"delivery\": \"scheduled\",\n  \"schedule\": {\n    \"date\": \"2026-03-15\",\n    \"hours\": \"10\",\n    \"minutes\": \"30\"\n  }\n}\n\nCancel Campaign\n\nPOST /mailerlite/api/campaigns/{campaign_id}/cancel\n\nReverts a ready campaign to draft status.\n\nDelete Campaign\n\nDELETE /mailerlite/api/campaigns/{campaign_id}\n\nGet Campaign Subscriber Activity\n\nGET /mailerlite/api/campaigns/{campaign_id}/reports/subscriber-activity\n\nQuery parameters:\n\nfilter[type] - Filter by activity: opened, unopened, clicked, unsubscribed, forwarded, hardbounced, softbounced, junk\nfilter[search] - Search by email\nlimit - Results per page (10, 25, 50, or 100)\npage - Page number (starts from 1)"
      },
      {
        "title": "Automation Operations",
        "body": "List Automations\n\nGET /mailerlite/api/automations\n\nQuery parameters:\n\nfilter[enabled] - Filter by status: true or false\nfilter[name] - Filter by name\nfilter[group] - Filter by group ID\npage - Page number (starts from 1)\nlimit - Results per page (default: 10)\n\nGet Automation\n\nGET /mailerlite/api/automations/{automation_id}\n\nCreate Automation\n\nPOST /mailerlite/api/automations\nContent-Type: application/json\n\n{\n  \"name\": \"Welcome Series\"\n}\n\nCreates a draft automation.\n\nGet Automation Activity\n\nGET /mailerlite/api/automations/{automation_id}/activity\n\nQuery parameters:\n\nfilter[status] - Required: completed, active, canceled, failed\nfilter[date_from] - Start date (Y-m-d)\nfilter[date_to] - End date (Y-m-d)\nfilter[search] - Search by email\npage - Page number (starts from 1)\nlimit - Results per page (default: 10)\n\nDelete Automation\n\nDELETE /mailerlite/api/automations/{automation_id}"
      },
      {
        "title": "Field Operations",
        "body": "List Fields\n\nGET /mailerlite/api/fields\n\nQuery parameters:\n\nlimit - Results per page (max 100)\npage - Page number (starts from 1)\nfilter[keyword] - Filter by keyword (partial match)\nfilter[type] - Filter by type: text, number, date\nsort - Sort by: name, type (prepend - for descending)\n\nCreate Field\n\nPOST /mailerlite/api/fields\nContent-Type: application/json\n\n{\n  \"name\": \"Company\",\n  \"type\": \"text\"\n}\n\nUpdate Field\n\nPUT /mailerlite/api/fields/{field_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Organization\"\n}\n\nDelete Field\n\nDELETE /mailerlite/api/fields/{field_id}"
      },
      {
        "title": "Segment Operations",
        "body": "List Segments\n\nGET /mailerlite/api/segments\n\nQuery parameters:\n\nlimit - Results per page (max 250)\npage - Page number (starts from 1)\n\nGet Segment Subscribers\n\nGET /mailerlite/api/segments/{segment_id}/subscribers\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page\ncursor - Pagination cursor\n\nUpdate Segment\n\nPUT /mailerlite/api/segments/{segment_id}\nContent-Type: application/json\n\n{\n  \"name\": \"High Engagement Subscribers\"\n}\n\nDelete Segment\n\nDELETE /mailerlite/api/segments/{segment_id}"
      },
      {
        "title": "Form Operations",
        "body": "List Forms\n\nGET /mailerlite/api/forms/{type}\n\nPath parameters:\n\ntype - Form type: popup, embedded, promotion\n\nQuery parameters:\n\nlimit - Results per page\npage - Page number (starts from 1)\nfilter[name] - Filter by name (partial match)\nsort - Sort by: created_at, name, conversions_count, opens_count, visitors, conversion_rate, last_registration_at (prepend - for descending)\n\nGet Form\n\nGET /mailerlite/api/forms/{form_id}\n\nUpdate Form\n\nPUT /mailerlite/api/forms/{form_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Newsletter Signup\"\n}\n\nDelete Form\n\nDELETE /mailerlite/api/forms/{form_id}\n\nGet Form Subscribers\n\nGET /mailerlite/api/forms/{form_id}/subscribers\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (default: 25)\ncursor - Pagination cursor"
      },
      {
        "title": "Webhook Operations",
        "body": "List Webhooks\n\nGET /mailerlite/api/webhooks\n\nGet Webhook\n\nGET /mailerlite/api/webhooks/{webhook_id}\n\nCreate Webhook\n\nPOST /mailerlite/api/webhooks\nContent-Type: application/json\n\n{\n  \"name\": \"Subscriber Updates\",\n  \"events\": [\"subscriber.created\", \"subscriber.updated\"],\n  \"url\": \"https://example.com/webhook\"\n}\n\nUpdate Webhook\n\nPUT /mailerlite/api/webhooks/{webhook_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Webhook\",\n  \"enabled\": true\n}\n\nDelete Webhook\n\nDELETE /mailerlite/api/webhooks/{webhook_id}"
      },
      {
        "title": "Pagination",
        "body": "MailerLite uses cursor-based pagination for most endpoints and page-based pagination for some."
      },
      {
        "title": "Cursor-based Pagination",
        "body": "GET /mailerlite/api/subscribers?limit=25&cursor=eyJpZCI6MTIzNDU2fQ\n\nResponse includes pagination links:\n\n{\n  \"data\": [...],\n  \"links\": {\n    \"first\": \"https://connect.mailerlite.com/api/subscribers?cursor=...\",\n    \"last\": null,\n    \"prev\": null,\n    \"next\": \"https://connect.mailerlite.com/api/subscribers?cursor=eyJpZCI6MTIzNDU2fQ\"\n  },\n  \"meta\": {\n    \"path\": \"https://connect.mailerlite.com/api/subscribers\",\n    \"per_page\": 25,\n    \"next_cursor\": \"eyJpZCI6MTIzNDU2fQ\",\n    \"prev_cursor\": null\n  }\n}"
      },
      {
        "title": "Page-based Pagination",
        "body": "GET /mailerlite/api/groups?limit=25&page=2\n\nResponse includes page metadata:\n\n{\n  \"data\": [...],\n  \"meta\": {\n    \"current_page\": 2,\n    \"from\": 26,\n    \"last_page\": 4,\n    \"per_page\": 25,\n    \"to\": 50,\n    \"total\": 100\n  }\n}"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/mailerlite/api/subscribers?limit=10',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/mailerlite/api/subscribers',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'limit': 10}\n)\ndata = response.json()"
      },
      {
        "title": "Create Subscriber Example",
        "body": "import os\nimport requests\n\nresponse = requests.post(\n    'https://gateway.maton.ai/mailerlite/api/subscribers',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'email': 'newuser@example.com',\n        'fields': {'name': 'John Doe'},\n        'status': 'active'\n    }\n)\ndata = response.json()"
      },
      {
        "title": "Notes",
        "body": "Rate limit: 120 requests per minute\nSubscriber emails are used as unique identifiers (POST creates or updates)\nGroup names have a maximum length of 255 characters\nOnly draft campaigns can be updated\nAPI versioning can be overridden via X-Version: YYYY-MM-DD header\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning400Missing MailerLite connection401Invalid or missing Maton API key403Forbidden - insufficient permissions404Resource not found422Validation error429Rate limited (120 req/min)4xx/5xxPassthrough error from MailerLite API"
      },
      {
        "title": "Troubleshooting: API Key Issues",
        "body": "Check that the MATON_API_KEY environment variable is set:\n\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Troubleshooting: Invalid App Name",
        "body": "Ensure your URL path starts with mailerlite. For example:\n\nCorrect: https://gateway.maton.ai/mailerlite/api/subscribers\nIncorrect: https://gateway.maton.ai/api/subscribers"
      },
      {
        "title": "Resources",
        "body": "MailerLite API Documentation\nMailerLite Subscribers API\nMailerLite Groups API\nMailerLite Campaigns API\nMaton Community\nMaton Support"
      }
    ],
    "body": "MailerLite\n\nAccess the MailerLite API with managed OAuth authentication. Manage subscribers, groups, campaigns, automations, forms, fields, segments, and webhooks.\n\nQuick Start\n# List subscribers\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/mailerlite/api/subscribers?limit=10')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nBase URL\nhttps://gateway.maton.ai/mailerlite/{native-api-path}\n\n\nReplace {native-api-path} with the actual MailerLite API endpoint path. The gateway proxies requests to connect.mailerlite.com and automatically injects your OAuth token.\n\nAuthentication\n\nAll requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\"\n\nGetting Your API Key\nSign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key\nConnection Management\n\nManage your MailerLite OAuth connections at https://ctrl.maton.ai.\n\nList Connections\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=mailerlite&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nCreate Connection\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'mailerlite'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"21fd90f9-5935-43cd-b6c8-bde9d915ca80\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2025-12-08T07:20:53.488460Z\",\n    \"last_updated_time\": \"2026-01-31T20:03:32.593153Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"mailerlite\",\n    \"metadata\": {}\n  }\n}\n\n\nOpen the returned url in a browser to complete OAuth authorization.\n\nDelete Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nSpecifying Connection\n\nIf you have multiple MailerLite connections, specify which one to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/mailerlite/api/subscribers')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nIf omitted, the gateway uses the default (oldest) active connection.\n\nAPI Reference\nSubscriber Operations\nList Subscribers\nGET /mailerlite/api/subscribers\n\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (default: 25)\ncursor - Pagination cursor\ninclude - Include related data: groups\nGet Subscriber\nGET /mailerlite/api/subscribers/{subscriber_id_or_email}\n\nCreate/Upsert Subscriber\nPOST /mailerlite/api/subscribers\nContent-Type: application/json\n\n{\n  \"email\": \"subscriber@example.com\",\n  \"fields\": {\n    \"name\": \"John Doe\",\n    \"company\": \"Acme Inc\"\n  },\n  \"groups\": [\"12345678901234567\"],\n  \"status\": \"active\"\n}\n\n\nReturns 201 for new subscribers, 200 for updates.\n\nUpdate Subscriber\nPUT /mailerlite/api/subscribers/{subscriber_id}\nContent-Type: application/json\n\n{\n  \"fields\": {\n    \"name\": \"Jane Doe\"\n  },\n  \"status\": \"active\"\n}\n\nDelete Subscriber\nDELETE /mailerlite/api/subscribers/{subscriber_id}\n\nGet Subscriber Activity\nGET /mailerlite/api/subscribers/{subscriber_id}/activity-log\n\n\nQuery parameters:\n\nfilter[log_name] - Filter by activity type: campaign_send, automation_email_sent, email_open, link_click, email_bounce, spam_complaint, unsubscribed\nlimit - Results per page (default: 100)\npage - Page number (starts from 1)\nForget Subscriber (GDPR)\nPOST /mailerlite/api/subscribers/{subscriber_id}/forget\n\nGroup Operations\nList Groups\nGET /mailerlite/api/groups\n\n\nQuery parameters:\n\nlimit - Results per page\npage - Page number (starts from 1)\nfilter[name] - Filter by name (partial match)\nsort - Sort by: name, total, open_rate, click_rate, created_at (prepend - for descending)\nCreate Group\nPOST /mailerlite/api/groups\nContent-Type: application/json\n\n{\n  \"name\": \"Newsletter Subscribers\"\n}\n\nUpdate Group\nPUT /mailerlite/api/groups/{group_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Group Name\"\n}\n\nDelete Group\nDELETE /mailerlite/api/groups/{group_id}\n\nGet Group Subscribers\nGET /mailerlite/api/groups/{group_id}/subscribers\n\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (1-1000, default: 50)\ncursor - Pagination cursor\nAssign Subscriber to Group\nPOST /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}\n\nRemove Subscriber from Group\nDELETE /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}\n\nCampaign Operations\nList Campaigns\nGET /mailerlite/api/campaigns\n\n\nQuery parameters:\n\nfilter[status] - Filter by status: sent, draft, ready\nfilter[type] - Filter by type: regular, ab, resend, rss\nlimit - Results per page: 10, 25, 50, or 100 (default: 25)\npage - Page number (starts from 1)\nGet Campaign\nGET /mailerlite/api/campaigns/{campaign_id}\n\nCreate Campaign\nPOST /mailerlite/api/campaigns\nContent-Type: application/json\n\n{\n  \"name\": \"My Newsletter\",\n  \"type\": \"regular\",\n  \"emails\": [\n    {\n      \"subject\": \"Weekly Update\",\n      \"from_name\": \"Newsletter\",\n      \"from\": \"newsletter@example.com\"\n    }\n  ],\n  \"groups\": [\"12345678901234567\"]\n}\n\nUpdate Campaign\nPUT /mailerlite/api/campaigns/{campaign_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Campaign Name\",\n  \"emails\": [\n    {\n      \"subject\": \"New Subject Line\",\n      \"from_name\": \"Newsletter\",\n      \"from\": \"newsletter@example.com\"\n    }\n  ]\n}\n\n\nNote: Only draft campaigns can be updated.\n\nSchedule Campaign\nPOST /mailerlite/api/campaigns/{campaign_id}/schedule\nContent-Type: application/json\n\n{\n  \"delivery\": \"instant\"\n}\n\n\nFor scheduled delivery:\n\n{\n  \"delivery\": \"scheduled\",\n  \"schedule\": {\n    \"date\": \"2026-03-15\",\n    \"hours\": \"10\",\n    \"minutes\": \"30\"\n  }\n}\n\nCancel Campaign\nPOST /mailerlite/api/campaigns/{campaign_id}/cancel\n\n\nReverts a ready campaign to draft status.\n\nDelete Campaign\nDELETE /mailerlite/api/campaigns/{campaign_id}\n\nGet Campaign Subscriber Activity\nGET /mailerlite/api/campaigns/{campaign_id}/reports/subscriber-activity\n\n\nQuery parameters:\n\nfilter[type] - Filter by activity: opened, unopened, clicked, unsubscribed, forwarded, hardbounced, softbounced, junk\nfilter[search] - Search by email\nlimit - Results per page (10, 25, 50, or 100)\npage - Page number (starts from 1)\nAutomation Operations\nList Automations\nGET /mailerlite/api/automations\n\n\nQuery parameters:\n\nfilter[enabled] - Filter by status: true or false\nfilter[name] - Filter by name\nfilter[group] - Filter by group ID\npage - Page number (starts from 1)\nlimit - Results per page (default: 10)\nGet Automation\nGET /mailerlite/api/automations/{automation_id}\n\nCreate Automation\nPOST /mailerlite/api/automations\nContent-Type: application/json\n\n{\n  \"name\": \"Welcome Series\"\n}\n\n\nCreates a draft automation.\n\nGet Automation Activity\nGET /mailerlite/api/automations/{automation_id}/activity\n\n\nQuery parameters:\n\nfilter[status] - Required: completed, active, canceled, failed\nfilter[date_from] - Start date (Y-m-d)\nfilter[date_to] - End date (Y-m-d)\nfilter[search] - Search by email\npage - Page number (starts from 1)\nlimit - Results per page (default: 10)\nDelete Automation\nDELETE /mailerlite/api/automations/{automation_id}\n\nField Operations\nList Fields\nGET /mailerlite/api/fields\n\n\nQuery parameters:\n\nlimit - Results per page (max 100)\npage - Page number (starts from 1)\nfilter[keyword] - Filter by keyword (partial match)\nfilter[type] - Filter by type: text, number, date\nsort - Sort by: name, type (prepend - for descending)\nCreate Field\nPOST /mailerlite/api/fields\nContent-Type: application/json\n\n{\n  \"name\": \"Company\",\n  \"type\": \"text\"\n}\n\nUpdate Field\nPUT /mailerlite/api/fields/{field_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Organization\"\n}\n\nDelete Field\nDELETE /mailerlite/api/fields/{field_id}\n\nSegment Operations\nList Segments\nGET /mailerlite/api/segments\n\n\nQuery parameters:\n\nlimit - Results per page (max 250)\npage - Page number (starts from 1)\nGet Segment Subscribers\nGET /mailerlite/api/segments/{segment_id}/subscribers\n\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page\ncursor - Pagination cursor\nUpdate Segment\nPUT /mailerlite/api/segments/{segment_id}\nContent-Type: application/json\n\n{\n  \"name\": \"High Engagement Subscribers\"\n}\n\nDelete Segment\nDELETE /mailerlite/api/segments/{segment_id}\n\nForm Operations\nList Forms\nGET /mailerlite/api/forms/{type}\n\n\nPath parameters:\n\ntype - Form type: popup, embedded, promotion\n\nQuery parameters:\n\nlimit - Results per page\npage - Page number (starts from 1)\nfilter[name] - Filter by name (partial match)\nsort - Sort by: created_at, name, conversions_count, opens_count, visitors, conversion_rate, last_registration_at (prepend - for descending)\nGet Form\nGET /mailerlite/api/forms/{form_id}\n\nUpdate Form\nPUT /mailerlite/api/forms/{form_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Newsletter Signup\"\n}\n\nDelete Form\nDELETE /mailerlite/api/forms/{form_id}\n\nGet Form Subscribers\nGET /mailerlite/api/forms/{form_id}/subscribers\n\n\nQuery parameters:\n\nfilter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junk\nlimit - Results per page (default: 25)\ncursor - Pagination cursor\nWebhook Operations\nList Webhooks\nGET /mailerlite/api/webhooks\n\nGet Webhook\nGET /mailerlite/api/webhooks/{webhook_id}\n\nCreate Webhook\nPOST /mailerlite/api/webhooks\nContent-Type: application/json\n\n{\n  \"name\": \"Subscriber Updates\",\n  \"events\": [\"subscriber.created\", \"subscriber.updated\"],\n  \"url\": \"https://example.com/webhook\"\n}\n\nUpdate Webhook\nPUT /mailerlite/api/webhooks/{webhook_id}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Webhook\",\n  \"enabled\": true\n}\n\nDelete Webhook\nDELETE /mailerlite/api/webhooks/{webhook_id}\n\nPagination\n\nMailerLite uses cursor-based pagination for most endpoints and page-based pagination for some.\n\nCursor-based Pagination\nGET /mailerlite/api/subscribers?limit=25&cursor=eyJpZCI6MTIzNDU2fQ\n\n\nResponse includes pagination links:\n\n{\n  \"data\": [...],\n  \"links\": {\n    \"first\": \"https://connect.mailerlite.com/api/subscribers?cursor=...\",\n    \"last\": null,\n    \"prev\": null,\n    \"next\": \"https://connect.mailerlite.com/api/subscribers?cursor=eyJpZCI6MTIzNDU2fQ\"\n  },\n  \"meta\": {\n    \"path\": \"https://connect.mailerlite.com/api/subscribers\",\n    \"per_page\": 25,\n    \"next_cursor\": \"eyJpZCI6MTIzNDU2fQ\",\n    \"prev_cursor\": null\n  }\n}\n\nPage-based Pagination\nGET /mailerlite/api/groups?limit=25&page=2\n\n\nResponse includes page metadata:\n\n{\n  \"data\": [...],\n  \"meta\": {\n    \"current_page\": 2,\n    \"from\": 26,\n    \"last_page\": 4,\n    \"per_page\": 25,\n    \"to\": 50,\n    \"total\": 100\n  }\n}\n\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/mailerlite/api/subscribers?limit=10',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\n\nPython\nimport os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/mailerlite/api/subscribers',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'},\n    params={'limit': 10}\n)\ndata = response.json()\n\nCreate Subscriber Example\nimport os\nimport requests\n\nresponse = requests.post(\n    'https://gateway.maton.ai/mailerlite/api/subscribers',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'email': 'newuser@example.com',\n        'fields': {'name': 'John Doe'},\n        'status': 'active'\n    }\n)\ndata = response.json()\n\nNotes\nRate limit: 120 requests per minute\nSubscriber emails are used as unique identifiers (POST creates or updates)\nGroup names have a maximum length of 255 characters\nOnly draft campaigns can be updated\nAPI versioning can be overridden via X-Version: YYYY-MM-DD header\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments\nError Handling\nStatus\tMeaning\n400\tMissing MailerLite connection\n401\tInvalid or missing Maton API key\n403\tForbidden - insufficient permissions\n404\tResource not found\n422\tValidation error\n429\tRate limited (120 req/min)\n4xx/5xx\tPassthrough error from MailerLite API\nTroubleshooting: API Key Issues\nCheck that the MATON_API_KEY environment variable is set:\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nTroubleshooting: Invalid App Name\nEnsure your URL path starts with mailerlite. For example:\nCorrect: https://gateway.maton.ai/mailerlite/api/subscribers\nIncorrect: https://gateway.maton.ai/api/subscribers\nResources\nMailerLite API Documentation\nMailerLite Subscribers API\nMailerLite Groups API\nMailerLite Campaigns API\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/mailerlite",
    "publisherUrl": "https://clawhub.ai/byungkyu/mailerlite",
    "owner": "byungkyu",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/mailerlite",
    "downloadUrl": "https://openagent3.xyz/downloads/mailerlite",
    "agentUrl": "https://openagent3.xyz/skills/mailerlite/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mailerlite/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mailerlite/agent.md"
  }
}