{
  "schemaVersion": "1.0",
  "item": {
    "slug": "active-campaign",
    "name": "ActiveCampaign",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/active-campaign",
    "canonicalUrl": "https://clawhub.ai/byungkyu/active-campaign",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/active-campaign",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=active-campaign",
    "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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/active-campaign"
    },
    "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/active-campaign",
    "agentPageUrl": "https://openagent3.xyz/skills/active-campaign/agent",
    "manifestUrl": "https://openagent3.xyz/skills/active-campaign/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/active-campaign/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": "ActiveCampaign",
        "body": "Access the ActiveCampaign API with managed OAuth authentication. Manage contacts, deals, tags, lists, automations, and email campaigns."
      },
      {
        "title": "Quick Start",
        "body": "# List all contacts\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/active-campaign/api/3/contacts')\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/active-campaign/{native-api-path}\n\nReplace {native-api-path} with the actual ActiveCampaign API endpoint path. The gateway proxies requests to {account}.api-us1.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 ActiveCampaign 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=active-campaign&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': 'active-campaign'}).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\": \"9e8ba2aa-25ec-4ba0-8815-3068be304dca\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-09T20:03:16.595823Z\",\n    \"last_updated_time\": \"2026-02-09T20:04:09.550767Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"active-campaign\",\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 ActiveCampaign 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/active-campaign/api/3/contacts')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '9e8ba2aa-25ec-4ba0-8815-3068be304dca')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Contacts",
        "body": "List Contacts\n\nGET /active-campaign/api/3/contacts\n\nQuery Parameters:\n\nlimit - Number of results (default: 20)\noffset - Starting index\nsearch - Search by email\nfilters[email] - Filter by email\nfilters[listid] - Filter by list ID\n\nResponse:\n\n{\n  \"contacts\": [\n    {\n      \"id\": \"1\",\n      \"email\": \"user@example.com\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"\",\n      \"cdate\": \"2026-02-09T14:03:19-06:00\",\n      \"udate\": \"2026-02-09T14:03:19-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Contact\n\nGET /active-campaign/api/3/contacts/{contactId}\n\nReturns contact with related data including lists, tags, deals, and field values.\n\nCreate Contact\n\nPOST /active-campaign/api/3/contacts\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"email\": \"newcontact@example.com\",\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"phone\": \"555-1234\"\n  }\n}\n\nResponse:\n\n{\n  \"contact\": {\n    \"id\": \"2\",\n    \"email\": \"newcontact@example.com\",\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"cdate\": \"2026-02-09T17:51:39-06:00\",\n    \"udate\": \"2026-02-09T17:51:39-06:00\"\n  }\n}\n\nUpdate Contact\n\nPUT /active-campaign/api/3/contacts/{contactId}\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"firstName\": \"Updated\",\n    \"lastName\": \"Name\"\n  }\n}\n\nDelete Contact\n\nDELETE /active-campaign/api/3/contacts/{contactId}\n\nReturns 200 OK on success.\n\nSync Contact (Create or Update)\n\nPOST /active-campaign/api/3/contact/sync\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"email\": \"user@example.com\",\n    \"firstName\": \"Updated Name\"\n  }\n}\n\nCreates the contact if it doesn't exist, updates if it does."
      },
      {
        "title": "Tags",
        "body": "List Tags\n\nGET /active-campaign/api/3/tags\n\nResponse:\n\n{\n  \"tags\": [\n    {\n      \"id\": \"1\",\n      \"tag\": \"VIP Customer\",\n      \"tagType\": \"contact\",\n      \"description\": \"High-value customers\",\n      \"cdate\": \"2026-02-09T17:51:39-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Tag\n\nGET /active-campaign/api/3/tags/{tagId}\n\nCreate Tag\n\nPOST /active-campaign/api/3/tags\nContent-Type: application/json\n\n{\n  \"tag\": {\n    \"tag\": \"New Tag\",\n    \"tagType\": \"contact\",\n    \"description\": \"Tag description\"\n  }\n}\n\nUpdate Tag\n\nPUT /active-campaign/api/3/tags/{tagId}\nContent-Type: application/json\n\n{\n  \"tag\": {\n    \"tag\": \"Updated Tag Name\"\n  }\n}\n\nDelete Tag\n\nDELETE /active-campaign/api/3/tags/{tagId}"
      },
      {
        "title": "Contact Tags",
        "body": "Add Tag to Contact\n\nPOST /active-campaign/api/3/contactTags\nContent-Type: application/json\n\n{\n  \"contactTag\": {\n    \"contact\": \"2\",\n    \"tag\": \"1\"\n  }\n}\n\nRemove Tag from Contact\n\nDELETE /active-campaign/api/3/contactTags/{contactTagId}\n\nGet Contact's Tags\n\nGET /active-campaign/api/3/contacts/{contactId}/contactTags"
      },
      {
        "title": "Lists",
        "body": "List All Lists\n\nGET /active-campaign/api/3/lists\n\nResponse:\n\n{\n  \"lists\": [\n    {\n      \"id\": \"1\",\n      \"stringid\": \"master-contact-list\",\n      \"name\": \"Master Contact List\",\n      \"cdate\": \"2026-02-09T14:03:20-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet List\n\nGET /active-campaign/api/3/lists/{listId}\n\nCreate List\n\nPOST /active-campaign/api/3/lists\nContent-Type: application/json\n\n{\n  \"list\": {\n    \"name\": \"New List\",\n    \"stringid\": \"new-list\",\n    \"sender_url\": \"https://example.com\",\n    \"sender_reminder\": \"You signed up on our website\"\n  }\n}\n\nUpdate List\n\nPUT /active-campaign/api/3/lists/{listId}\nContent-Type: application/json\n\n{\n  \"list\": {\n    \"name\": \"Updated List Name\"\n  }\n}\n\nDelete List\n\nDELETE /active-campaign/api/3/lists/{listId}"
      },
      {
        "title": "Contact Lists",
        "body": "Subscribe Contact to List\n\nPOST /active-campaign/api/3/contactLists\nContent-Type: application/json\n\n{\n  \"contactList\": {\n    \"contact\": \"2\",\n    \"list\": \"1\",\n    \"status\": \"1\"\n  }\n}\n\nStatus values: 1 = subscribed, 2 = unsubscribed"
      },
      {
        "title": "Deals",
        "body": "List Deals\n\nGET /active-campaign/api/3/deals\n\nQuery Parameters:\n\nsearch - Search by title, contact, or org\nfilters[stage] - Filter by stage ID\nfilters[owner] - Filter by owner ID\n\nResponse:\n\n{\n  \"deals\": [\n    {\n      \"id\": \"1\",\n      \"title\": \"New Deal\",\n      \"value\": \"10000\",\n      \"currency\": \"usd\",\n      \"stage\": \"1\",\n      \"owner\": \"1\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 0,\n    \"currencies\": []\n  }\n}\n\nGet Deal\n\nGET /active-campaign/api/3/deals/{dealId}\n\nCreate Deal\n\nPOST /active-campaign/api/3/deals\nContent-Type: application/json\n\n{\n  \"deal\": {\n    \"title\": \"New Deal\",\n    \"value\": \"10000\",\n    \"currency\": \"usd\",\n    \"contact\": \"2\",\n    \"stage\": \"1\",\n    \"owner\": \"1\"\n  }\n}\n\nUpdate Deal\n\nPUT /active-campaign/api/3/deals/{dealId}\nContent-Type: application/json\n\n{\n  \"deal\": {\n    \"title\": \"Updated Deal\",\n    \"value\": \"15000\"\n  }\n}\n\nDelete Deal\n\nDELETE /active-campaign/api/3/deals/{dealId}"
      },
      {
        "title": "Deal Stages",
        "body": "List Deal Stages\n\nGET /active-campaign/api/3/dealStages\n\nCreate Deal Stage\n\nPOST /active-campaign/api/3/dealStages\nContent-Type: application/json\n\n{\n  \"dealStage\": {\n    \"title\": \"New Stage\",\n    \"group\": \"1\",\n    \"order\": \"1\"\n  }\n}"
      },
      {
        "title": "Deal Groups (Pipelines)",
        "body": "List Pipelines\n\nGET /active-campaign/api/3/dealGroups\n\nCreate Pipeline\n\nPOST /active-campaign/api/3/dealGroups\nContent-Type: application/json\n\n{\n  \"dealGroup\": {\n    \"title\": \"Sales Pipeline\",\n    \"currency\": \"usd\"\n  }\n}"
      },
      {
        "title": "Automations",
        "body": "List Automations\n\nGET /active-campaign/api/3/automations\n\nResponse:\n\n{\n  \"automations\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Welcome Series\",\n      \"cdate\": \"2026-02-09T14:00:00-06:00\",\n      \"mdate\": \"2026-02-09T14:00:00-06:00\",\n      \"status\": \"1\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Automation\n\nGET /active-campaign/api/3/automations/{automationId}"
      },
      {
        "title": "Campaigns",
        "body": "List Campaigns\n\nGET /active-campaign/api/3/campaigns\n\nResponse:\n\n{\n  \"campaigns\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Newsletter\",\n      \"type\": \"single\",\n      \"status\": \"0\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Campaign\n\nGET /active-campaign/api/3/campaigns/{campaignId}"
      },
      {
        "title": "Users",
        "body": "List Users\n\nGET /active-campaign/api/3/users\n\nResponse:\n\n{\n  \"users\": [\n    {\n      \"id\": \"1\",\n      \"username\": \"admin\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"email\": \"admin@example.com\"\n    }\n  ]\n}\n\nGet User\n\nGET /active-campaign/api/3/users/{userId}"
      },
      {
        "title": "Accounts",
        "body": "List Accounts\n\nGET /active-campaign/api/3/accounts\n\nCreate Account\n\nPOST /active-campaign/api/3/accounts\nContent-Type: application/json\n\n{\n  \"account\": {\n    \"name\": \"Acme Inc\"\n  }\n}"
      },
      {
        "title": "Custom Fields",
        "body": "List Fields\n\nGET /active-campaign/api/3/fields\n\nCreate Field\n\nPOST /active-campaign/api/3/fields\nContent-Type: application/json\n\n{\n  \"field\": {\n    \"type\": \"text\",\n    \"title\": \"Custom Field\",\n    \"descript\": \"A custom field\"\n  }\n}"
      },
      {
        "title": "Field Values",
        "body": "Update Contact Field Value\n\nPUT /active-campaign/api/3/fieldValues/{fieldValueId}\nContent-Type: application/json\n\n{\n  \"fieldValue\": {\n    \"value\": \"New Value\"\n  }\n}"
      },
      {
        "title": "Notes",
        "body": "List Notes\n\nGET /active-campaign/api/3/notes\n\nCreate Note\n\nPOST /active-campaign/api/3/notes\nContent-Type: application/json\n\n{\n  \"note\": {\n    \"note\": \"This is a note\",\n    \"relid\": \"2\",\n    \"reltype\": \"Subscriber\"\n  }\n}"
      },
      {
        "title": "Webhooks",
        "body": "List Webhooks\n\nGET /active-campaign/api/3/webhooks\n\nCreate Webhook\n\nPOST /active-campaign/api/3/webhooks\nContent-Type: application/json\n\n{\n  \"webhook\": {\n    \"name\": \"My Webhook\",\n    \"url\": \"https://example.com/webhook\",\n    \"events\": [\"subscribe\", \"unsubscribe\"],\n    \"sources\": [\"public\", \"admin\"]\n  }\n}"
      },
      {
        "title": "Pagination",
        "body": "ActiveCampaign uses offset-based pagination:\n\nGET /active-campaign/api/3/contacts?limit=20&offset=0\n\nParameters:\n\nlimit - Results per page (default: 20)\noffset - Starting index\n\nResponse includes meta:\n\n{\n  \"contacts\": [...],\n  \"meta\": {\n    \"total\": \"150\"\n  }\n}\n\nFor large datasets, use orders[id]=ASC and id_greater parameter for better performance:\n\nGET /active-campaign/api/3/contacts?orders[id]=ASC&id_greater=100"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/active-campaign/api/3/contacts',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\nconsole.log(data.contacts);"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/active-campaign/api/3/contacts',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\nprint(data['contacts'])"
      },
      {
        "title": "Python (Create Contact with Tag)",
        "body": "import os\nimport requests\n\nheaders = {\n    'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n    'Content-Type': 'application/json'\n}\n\n# Create contact\ncontact_response = requests.post(\n    'https://gateway.maton.ai/active-campaign/api/3/contacts',\n    headers=headers,\n    json={\n        'contact': {\n            'email': 'newuser@example.com',\n            'firstName': 'New',\n            'lastName': 'User'\n        }\n    }\n)\ncontact = contact_response.json()['contact']\nprint(f\"Created contact ID: {contact['id']}\")\n\n# Add tag to contact\ntag_response = requests.post(\n    'https://gateway.maton.ai/active-campaign/api/3/contactTags',\n    headers=headers,\n    json={\n        'contactTag': {\n            'contact': contact['id'],\n            'tag': '1'\n        }\n    }\n)\nprint(\"Tag added to contact\")"
      },
      {
        "title": "Notes",
        "body": "All endpoints require the /api/3/ prefix\nRequest bodies use singular resource names wrapped in an object (e.g., {\"contact\": {...}})\nIDs are returned as strings\nTimestamps are in ISO 8601 format with timezone\nRate limit: 5 requests per second per account\nDELETE operations return 200 OK (not 204)\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 ActiveCampaign connection or bad request401Invalid or missing Maton API key404Resource not found422Validation error429Rate limited (5 req/sec)4xx/5xxPassthrough error from ActiveCampaign API\n\nError responses include details:\n\n{\n  \"errors\": [\n    {\n      \"title\": \"The contact email is required\",\n      \"source\": {\n        \"pointer\": \"/data/attributes/email\"\n      }\n    }\n  ]\n}"
      },
      {
        "title": "Troubleshooting: Invalid API Key",
        "body": "When you receive an \"Invalid API key\" error, ALWAYS follow these steps before concluding there is an issue:\n\nCheck 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": "Resources",
        "body": "ActiveCampaign API Overview\nActiveCampaign Developer Portal\nAPI Base URL\nContacts API\nTags API\nDeals API"
      }
    ],
    "body": "ActiveCampaign\n\nAccess the ActiveCampaign API with managed OAuth authentication. Manage contacts, deals, tags, lists, automations, and email campaigns.\n\nQuick Start\n# List all contacts\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/active-campaign/api/3/contacts')\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/active-campaign/{native-api-path}\n\n\nReplace {native-api-path} with the actual ActiveCampaign API endpoint path. The gateway proxies requests to {account}.api-us1.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 ActiveCampaign 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=active-campaign&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': 'active-campaign'}).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\": \"9e8ba2aa-25ec-4ba0-8815-3068be304dca\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-09T20:03:16.595823Z\",\n    \"last_updated_time\": \"2026-02-09T20:04:09.550767Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"active-campaign\",\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 ActiveCampaign 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/active-campaign/api/3/contacts')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '9e8ba2aa-25ec-4ba0-8815-3068be304dca')\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\nContacts\nList Contacts\nGET /active-campaign/api/3/contacts\n\n\nQuery Parameters:\n\nlimit - Number of results (default: 20)\noffset - Starting index\nsearch - Search by email\nfilters[email] - Filter by email\nfilters[listid] - Filter by list ID\n\nResponse:\n\n{\n  \"contacts\": [\n    {\n      \"id\": \"1\",\n      \"email\": \"user@example.com\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"\",\n      \"cdate\": \"2026-02-09T14:03:19-06:00\",\n      \"udate\": \"2026-02-09T14:03:19-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Contact\nGET /active-campaign/api/3/contacts/{contactId}\n\n\nReturns contact with related data including lists, tags, deals, and field values.\n\nCreate Contact\nPOST /active-campaign/api/3/contacts\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"email\": \"newcontact@example.com\",\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"phone\": \"555-1234\"\n  }\n}\n\n\nResponse:\n\n{\n  \"contact\": {\n    \"id\": \"2\",\n    \"email\": \"newcontact@example.com\",\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"cdate\": \"2026-02-09T17:51:39-06:00\",\n    \"udate\": \"2026-02-09T17:51:39-06:00\"\n  }\n}\n\nUpdate Contact\nPUT /active-campaign/api/3/contacts/{contactId}\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"firstName\": \"Updated\",\n    \"lastName\": \"Name\"\n  }\n}\n\nDelete Contact\nDELETE /active-campaign/api/3/contacts/{contactId}\n\n\nReturns 200 OK on success.\n\nSync Contact (Create or Update)\nPOST /active-campaign/api/3/contact/sync\nContent-Type: application/json\n\n{\n  \"contact\": {\n    \"email\": \"user@example.com\",\n    \"firstName\": \"Updated Name\"\n  }\n}\n\n\nCreates the contact if it doesn't exist, updates if it does.\n\nTags\nList Tags\nGET /active-campaign/api/3/tags\n\n\nResponse:\n\n{\n  \"tags\": [\n    {\n      \"id\": \"1\",\n      \"tag\": \"VIP Customer\",\n      \"tagType\": \"contact\",\n      \"description\": \"High-value customers\",\n      \"cdate\": \"2026-02-09T17:51:39-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Tag\nGET /active-campaign/api/3/tags/{tagId}\n\nCreate Tag\nPOST /active-campaign/api/3/tags\nContent-Type: application/json\n\n{\n  \"tag\": {\n    \"tag\": \"New Tag\",\n    \"tagType\": \"contact\",\n    \"description\": \"Tag description\"\n  }\n}\n\nUpdate Tag\nPUT /active-campaign/api/3/tags/{tagId}\nContent-Type: application/json\n\n{\n  \"tag\": {\n    \"tag\": \"Updated Tag Name\"\n  }\n}\n\nDelete Tag\nDELETE /active-campaign/api/3/tags/{tagId}\n\nContact Tags\nAdd Tag to Contact\nPOST /active-campaign/api/3/contactTags\nContent-Type: application/json\n\n{\n  \"contactTag\": {\n    \"contact\": \"2\",\n    \"tag\": \"1\"\n  }\n}\n\nRemove Tag from Contact\nDELETE /active-campaign/api/3/contactTags/{contactTagId}\n\nGet Contact's Tags\nGET /active-campaign/api/3/contacts/{contactId}/contactTags\n\nLists\nList All Lists\nGET /active-campaign/api/3/lists\n\n\nResponse:\n\n{\n  \"lists\": [\n    {\n      \"id\": \"1\",\n      \"stringid\": \"master-contact-list\",\n      \"name\": \"Master Contact List\",\n      \"cdate\": \"2026-02-09T14:03:20-06:00\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet List\nGET /active-campaign/api/3/lists/{listId}\n\nCreate List\nPOST /active-campaign/api/3/lists\nContent-Type: application/json\n\n{\n  \"list\": {\n    \"name\": \"New List\",\n    \"stringid\": \"new-list\",\n    \"sender_url\": \"https://example.com\",\n    \"sender_reminder\": \"You signed up on our website\"\n  }\n}\n\nUpdate List\nPUT /active-campaign/api/3/lists/{listId}\nContent-Type: application/json\n\n{\n  \"list\": {\n    \"name\": \"Updated List Name\"\n  }\n}\n\nDelete List\nDELETE /active-campaign/api/3/lists/{listId}\n\nContact Lists\nSubscribe Contact to List\nPOST /active-campaign/api/3/contactLists\nContent-Type: application/json\n\n{\n  \"contactList\": {\n    \"contact\": \"2\",\n    \"list\": \"1\",\n    \"status\": \"1\"\n  }\n}\n\n\nStatus values: 1 = subscribed, 2 = unsubscribed\n\nDeals\nList Deals\nGET /active-campaign/api/3/deals\n\n\nQuery Parameters:\n\nsearch - Search by title, contact, or org\nfilters[stage] - Filter by stage ID\nfilters[owner] - Filter by owner ID\n\nResponse:\n\n{\n  \"deals\": [\n    {\n      \"id\": \"1\",\n      \"title\": \"New Deal\",\n      \"value\": \"10000\",\n      \"currency\": \"usd\",\n      \"stage\": \"1\",\n      \"owner\": \"1\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 0,\n    \"currencies\": []\n  }\n}\n\nGet Deal\nGET /active-campaign/api/3/deals/{dealId}\n\nCreate Deal\nPOST /active-campaign/api/3/deals\nContent-Type: application/json\n\n{\n  \"deal\": {\n    \"title\": \"New Deal\",\n    \"value\": \"10000\",\n    \"currency\": \"usd\",\n    \"contact\": \"2\",\n    \"stage\": \"1\",\n    \"owner\": \"1\"\n  }\n}\n\nUpdate Deal\nPUT /active-campaign/api/3/deals/{dealId}\nContent-Type: application/json\n\n{\n  \"deal\": {\n    \"title\": \"Updated Deal\",\n    \"value\": \"15000\"\n  }\n}\n\nDelete Deal\nDELETE /active-campaign/api/3/deals/{dealId}\n\nDeal Stages\nList Deal Stages\nGET /active-campaign/api/3/dealStages\n\nCreate Deal Stage\nPOST /active-campaign/api/3/dealStages\nContent-Type: application/json\n\n{\n  \"dealStage\": {\n    \"title\": \"New Stage\",\n    \"group\": \"1\",\n    \"order\": \"1\"\n  }\n}\n\nDeal Groups (Pipelines)\nList Pipelines\nGET /active-campaign/api/3/dealGroups\n\nCreate Pipeline\nPOST /active-campaign/api/3/dealGroups\nContent-Type: application/json\n\n{\n  \"dealGroup\": {\n    \"title\": \"Sales Pipeline\",\n    \"currency\": \"usd\"\n  }\n}\n\nAutomations\nList Automations\nGET /active-campaign/api/3/automations\n\n\nResponse:\n\n{\n  \"automations\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Welcome Series\",\n      \"cdate\": \"2026-02-09T14:00:00-06:00\",\n      \"mdate\": \"2026-02-09T14:00:00-06:00\",\n      \"status\": \"1\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Automation\nGET /active-campaign/api/3/automations/{automationId}\n\nCampaigns\nList Campaigns\nGET /active-campaign/api/3/campaigns\n\n\nResponse:\n\n{\n  \"campaigns\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Newsletter\",\n      \"type\": \"single\",\n      \"status\": \"0\"\n    }\n  ],\n  \"meta\": {\n    \"total\": \"1\"\n  }\n}\n\nGet Campaign\nGET /active-campaign/api/3/campaigns/{campaignId}\n\nUsers\nList Users\nGET /active-campaign/api/3/users\n\n\nResponse:\n\n{\n  \"users\": [\n    {\n      \"id\": \"1\",\n      \"username\": \"admin\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"email\": \"admin@example.com\"\n    }\n  ]\n}\n\nGet User\nGET /active-campaign/api/3/users/{userId}\n\nAccounts\nList Accounts\nGET /active-campaign/api/3/accounts\n\nCreate Account\nPOST /active-campaign/api/3/accounts\nContent-Type: application/json\n\n{\n  \"account\": {\n    \"name\": \"Acme Inc\"\n  }\n}\n\nCustom Fields\nList Fields\nGET /active-campaign/api/3/fields\n\nCreate Field\nPOST /active-campaign/api/3/fields\nContent-Type: application/json\n\n{\n  \"field\": {\n    \"type\": \"text\",\n    \"title\": \"Custom Field\",\n    \"descript\": \"A custom field\"\n  }\n}\n\nField Values\nUpdate Contact Field Value\nPUT /active-campaign/api/3/fieldValues/{fieldValueId}\nContent-Type: application/json\n\n{\n  \"fieldValue\": {\n    \"value\": \"New Value\"\n  }\n}\n\nNotes\nList Notes\nGET /active-campaign/api/3/notes\n\nCreate Note\nPOST /active-campaign/api/3/notes\nContent-Type: application/json\n\n{\n  \"note\": {\n    \"note\": \"This is a note\",\n    \"relid\": \"2\",\n    \"reltype\": \"Subscriber\"\n  }\n}\n\nWebhooks\nList Webhooks\nGET /active-campaign/api/3/webhooks\n\nCreate Webhook\nPOST /active-campaign/api/3/webhooks\nContent-Type: application/json\n\n{\n  \"webhook\": {\n    \"name\": \"My Webhook\",\n    \"url\": \"https://example.com/webhook\",\n    \"events\": [\"subscribe\", \"unsubscribe\"],\n    \"sources\": [\"public\", \"admin\"]\n  }\n}\n\nPagination\n\nActiveCampaign uses offset-based pagination:\n\nGET /active-campaign/api/3/contacts?limit=20&offset=0\n\n\nParameters:\n\nlimit - Results per page (default: 20)\noffset - Starting index\n\nResponse includes meta:\n\n{\n  \"contacts\": [...],\n  \"meta\": {\n    \"total\": \"150\"\n  }\n}\n\n\nFor large datasets, use orders[id]=ASC and id_greater parameter for better performance:\n\nGET /active-campaign/api/3/contacts?orders[id]=ASC&id_greater=100\n\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/active-campaign/api/3/contacts',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\nconsole.log(data.contacts);\n\nPython\nimport os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/active-campaign/api/3/contacts',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\nprint(data['contacts'])\n\nPython (Create Contact with Tag)\nimport os\nimport requests\n\nheaders = {\n    'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n    'Content-Type': 'application/json'\n}\n\n# Create contact\ncontact_response = requests.post(\n    'https://gateway.maton.ai/active-campaign/api/3/contacts',\n    headers=headers,\n    json={\n        'contact': {\n            'email': 'newuser@example.com',\n            'firstName': 'New',\n            'lastName': 'User'\n        }\n    }\n)\ncontact = contact_response.json()['contact']\nprint(f\"Created contact ID: {contact['id']}\")\n\n# Add tag to contact\ntag_response = requests.post(\n    'https://gateway.maton.ai/active-campaign/api/3/contactTags',\n    headers=headers,\n    json={\n        'contactTag': {\n            'contact': contact['id'],\n            'tag': '1'\n        }\n    }\n)\nprint(\"Tag added to contact\")\n\nNotes\nAll endpoints require the /api/3/ prefix\nRequest bodies use singular resource names wrapped in an object (e.g., {\"contact\": {...}})\nIDs are returned as strings\nTimestamps are in ISO 8601 format with timezone\nRate limit: 5 requests per second per account\nDELETE operations return 200 OK (not 204)\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 ActiveCampaign connection or bad request\n401\tInvalid or missing Maton API key\n404\tResource not found\n422\tValidation error\n429\tRate limited (5 req/sec)\n4xx/5xx\tPassthrough error from ActiveCampaign API\n\nError responses include details:\n\n{\n  \"errors\": [\n    {\n      \"title\": \"The contact email is required\",\n      \"source\": {\n        \"pointer\": \"/data/attributes/email\"\n      }\n    }\n  ]\n}\n\nTroubleshooting: Invalid API Key\n\nWhen you receive an \"Invalid API key\" error, ALWAYS follow these steps before concluding there is an issue:\n\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\nResources\nActiveCampaign API Overview\nActiveCampaign Developer Portal\nAPI Base URL\nContacts API\nTags API\nDeals API"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/active-campaign",
    "publisherUrl": "https://clawhub.ai/byungkyu/active-campaign",
    "owner": "byungkyu",
    "version": "1.0.6",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/active-campaign",
    "downloadUrl": "https://openagent3.xyz/downloads/active-campaign",
    "agentUrl": "https://openagent3.xyz/skills/active-campaign/agent",
    "manifestUrl": "https://openagent3.xyz/skills/active-campaign/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/active-campaign/agent.md"
  }
}