{
  "schemaVersion": "1.0",
  "item": {
    "slug": "brevo-api",
    "name": "Brevo",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/brevo-api",
    "canonicalUrl": "https://clawhub.ai/byungkyu/brevo-api",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/brevo-api",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=brevo-api",
    "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/brevo-api"
    },
    "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/brevo-api",
    "agentPageUrl": "https://openagent3.xyz/skills/brevo-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/brevo-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/brevo-api/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": "Brevo",
        "body": "Access the Brevo API with managed OAuth authentication. Send transactional emails, manage contacts and lists, create email campaigns, and work with templates."
      },
      {
        "title": "Quick Start",
        "body": "# Get account info\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/brevo/v3/account')\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/brevo/v3/{resource}\n\nThe gateway proxies requests to api.brevo.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 Brevo 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=brevo&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': 'brevo'}).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\": \"b04dd695-d056-433b-baf9-0fb4eb3bde9e\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-09T19:51:00.932629Z\",\n    \"last_updated_time\": \"2026-02-09T19:51:30.123456Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"brevo\",\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 Brevo 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/brevo/v3/account')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', 'b04dd695-d056-433b-baf9-0fb4eb3bde9e')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "Account",
        "body": "Get Account Info\n\nGET /brevo/v3/account\n\nResponse:\n\n{\n  \"email\": \"user@example.com\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"companyName\": \"Acme Inc\",\n  \"relay\": {\n    \"enabled\": true,\n    \"data\": {\n      \"userName\": \"user@smtp-brevo.com\",\n      \"relay\": \"smtp-relay.brevo.com\",\n      \"port\": 587\n    }\n  }\n}"
      },
      {
        "title": "Contacts",
        "body": "List Contacts\n\nGET /brevo/v3/contacts\n\nQuery Parameters:\n\nlimit - Number of results per page (default: 50, max: 500)\noffset - Index of first result (0-based)\nmodifiedSince - Filter by modification date (ISO 8601)\n\nResponse:\n\n{\n  \"contacts\": [\n    {\n      \"id\": 1,\n      \"email\": \"contact@example.com\",\n      \"emailBlacklisted\": false,\n      \"smsBlacklisted\": false,\n      \"createdAt\": \"2026-02-09T20:33:59.705+01:00\",\n      \"modifiedAt\": \"2026-02-09T20:35:19.529+01:00\",\n      \"listIds\": [2],\n      \"attributes\": {\n        \"FIRSTNAME\": \"John\",\n        \"LASTNAME\": \"Doe\"\n      }\n    }\n  ],\n  \"count\": 1\n}\n\nGet Contact\n\nGET /brevo/v3/contacts/{identifier}\n\nThe identifier can be email address, phone number, or contact ID.\n\nQuery Parameters:\n\nidentifierType - Type of identifier: email_id, phone_id, contact_id, ext_id\n\nCreate Contact\n\nPOST /brevo/v3/contacts\nContent-Type: application/json\n\n{\n  \"email\": \"newcontact@example.com\",\n  \"attributes\": {\n    \"FIRSTNAME\": \"Jane\",\n    \"LASTNAME\": \"Smith\"\n  },\n  \"listIds\": [2],\n  \"updateEnabled\": false\n}\n\nResponse:\n\n{\n  \"id\": 2\n}\n\nSet updateEnabled: true to update the contact if it already exists.\n\nUpdate Contact\n\nPUT /brevo/v3/contacts/{identifier}\nContent-Type: application/json\n\n{\n  \"attributes\": {\n    \"FIRSTNAME\": \"Updated\",\n    \"LASTNAME\": \"Name\"\n  }\n}\n\nReturns 204 No Content on success.\n\nDelete Contact\n\nDELETE /brevo/v3/contacts/{identifier}\n\nReturns 204 No Content on success.\n\nGet Contact Campaign Stats\n\nGET /brevo/v3/contacts/{identifier}/campaignStats"
      },
      {
        "title": "Lists",
        "body": "List All Lists\n\nGET /brevo/v3/contacts/lists\n\nResponse:\n\n{\n  \"lists\": [\n    {\n      \"id\": 2,\n      \"name\": \"Newsletter Subscribers\",\n      \"folderId\": 1,\n      \"uniqueSubscribers\": 150,\n      \"totalBlacklisted\": 2,\n      \"totalSubscribers\": 148\n    }\n  ],\n  \"count\": 1\n}\n\nGet List\n\nGET /brevo/v3/contacts/lists/{listId}\n\nCreate List\n\nPOST /brevo/v3/contacts/lists\nContent-Type: application/json\n\n{\n  \"name\": \"New List\",\n  \"folderId\": 1\n}\n\nResponse:\n\n{\n  \"id\": 3\n}\n\nUpdate List\n\nPUT /brevo/v3/contacts/lists/{listId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated List Name\"\n}\n\nReturns 204 No Content on success.\n\nDelete List\n\nDELETE /brevo/v3/contacts/lists/{listId}\n\nReturns 204 No Content on success.\n\nGet Contacts in List\n\nGET /brevo/v3/contacts/lists/{listId}/contacts\n\nAdd Contacts to List\n\nPOST /brevo/v3/contacts/lists/{listId}/contacts/add\nContent-Type: application/json\n\n{\n  \"emails\": [\"contact1@example.com\", \"contact2@example.com\"]\n}\n\nRemove Contacts from List\n\nPOST /brevo/v3/contacts/lists/{listId}/contacts/remove\nContent-Type: application/json\n\n{\n  \"emails\": [\"contact1@example.com\"]\n}"
      },
      {
        "title": "Folders",
        "body": "List Folders\n\nGET /brevo/v3/contacts/folders\n\nResponse:\n\n{\n  \"folders\": [\n    {\n      \"id\": 1,\n      \"name\": \"Marketing\",\n      \"uniqueSubscribers\": 500,\n      \"totalSubscribers\": 480,\n      \"totalBlacklisted\": 20\n    }\n  ],\n  \"count\": 1\n}\n\nGet Folder\n\nGET /brevo/v3/contacts/folders/{folderId}\n\nCreate Folder\n\nPOST /brevo/v3/contacts/folders\nContent-Type: application/json\n\n{\n  \"name\": \"New Folder\"\n}\n\nResponse:\n\n{\n  \"id\": 4\n}\n\nUpdate Folder\n\nPUT /brevo/v3/contacts/folders/{folderId}\nContent-Type: application/json\n\n{\n  \"name\": \"Renamed Folder\"\n}\n\nReturns 204 No Content on success.\n\nDelete Folder\n\nDELETE /brevo/v3/contacts/folders/{folderId}\n\nDeletes folder and all lists within it. Returns 204 No Content on success.\n\nGet Lists in Folder\n\nGET /brevo/v3/contacts/folders/{folderId}/lists"
      },
      {
        "title": "Attributes",
        "body": "List Attributes\n\nGET /brevo/v3/contacts/attributes\n\nResponse:\n\n{\n  \"attributes\": [\n    {\n      \"name\": \"FIRSTNAME\",\n      \"category\": \"normal\",\n      \"type\": \"text\"\n    },\n    {\n      \"name\": \"LASTNAME\",\n      \"category\": \"normal\",\n      \"type\": \"text\"\n    }\n  ]\n}\n\nCreate Attribute\n\nPOST /brevo/v3/contacts/attributes/{category}/{attributeName}\nContent-Type: application/json\n\n{\n  \"type\": \"text\"\n}\n\nCategories: normal, transactional, category, calculated, global\n\nUpdate Attribute\n\nPUT /brevo/v3/contacts/attributes/{category}/{attributeName}\nContent-Type: application/json\n\n{\n  \"value\": \"new value\"\n}\n\nDelete Attribute\n\nDELETE /brevo/v3/contacts/attributes/{category}/{attributeName}"
      },
      {
        "title": "Transactional Emails",
        "body": "Send Email\n\nPOST /brevo/v3/smtp/email\nContent-Type: application/json\n\n{\n  \"sender\": {\n    \"name\": \"John Doe\",\n    \"email\": \"john@example.com\"\n  },\n  \"to\": [\n    {\n      \"email\": \"recipient@example.com\",\n      \"name\": \"Jane Smith\"\n    }\n  ],\n  \"subject\": \"Welcome!\",\n  \"htmlContent\": \"<html><body><h1>Hello!</h1><p>Welcome to our service.</p></body></html>\"\n}\n\nResponse:\n\n{\n  \"messageId\": \"<202602092329.12910305853@smtp-relay.mailin.fr>\"\n}\n\nOptional Parameters:\n\ncc - Carbon copy recipients\nbcc - Blind carbon copy recipients\nreplyTo - Reply-to address\ntextContent - Plain text version\ntemplateId - Use a template instead of htmlContent\nparams - Template parameters\nattachment - File attachments\nheaders - Custom headers\ntags - Email tags for tracking\nscheduledAt - Schedule for later (ISO 8601)\n\nGet Transactional Emails\n\nGET /brevo/v3/smtp/emails\n\nQuery Parameters:\n\nemail - Filter by recipient email\ntemplateId - Filter by template\nmessageId - Filter by message ID\nstartDate - Start date (YYYY-MM-DD)\nendDate - End date (YYYY-MM-DD)\nlimit - Results per page\noffset - Starting index\n\nDelete Scheduled Email\n\nDELETE /brevo/v3/smtp/email/{identifier}\n\nThe identifier can be a messageId or batchId.\n\nGet Email Statistics\n\nGET /brevo/v3/smtp/statistics/events\n\nQuery Parameters:\n\nlimit - Results per page\noffset - Starting index\nstartDate - Start date\nendDate - End date\nemail - Filter by recipient\nevent - Filter by event type: delivered, opened, clicked, bounced, etc."
      },
      {
        "title": "Email Templates",
        "body": "List Templates\n\nGET /brevo/v3/smtp/templates\n\nResponse:\n\n{\n  \"count\": 1,\n  \"templates\": [\n    {\n      \"id\": 1,\n      \"name\": \"Welcome Email\",\n      \"subject\": \"Welcome {{params.name}}!\",\n      \"isActive\": true,\n      \"sender\": {\n        \"name\": \"Company\",\n        \"email\": \"noreply@company.com\"\n      },\n      \"htmlContent\": \"<html>...</html>\",\n      \"createdAt\": \"2026-02-09 23:29:38\",\n      \"modifiedAt\": \"2026-02-09 23:29:38\"\n    }\n  ]\n}\n\nGet Template\n\nGET /brevo/v3/smtp/templates/{templateId}\n\nCreate Template\n\nPOST /brevo/v3/smtp/templates\nContent-Type: application/json\n\n{\n  \"sender\": {\n    \"name\": \"Company\",\n    \"email\": \"noreply@company.com\"\n  },\n  \"templateName\": \"Welcome Email\",\n  \"subject\": \"Welcome {{params.name}}!\",\n  \"htmlContent\": \"<html><body><h1>Hello {{params.name}}!</h1></body></html>\"\n}\n\nResponse:\n\n{\n  \"id\": 1\n}\n\nUpdate Template\n\nPUT /brevo/v3/smtp/templates/{templateId}\nContent-Type: application/json\n\n{\n  \"templateName\": \"Updated Template Name\",\n  \"subject\": \"New Subject\"\n}\n\nReturns 204 No Content on success.\n\nDelete Template\n\nDELETE /brevo/v3/smtp/templates/{templateId}\n\nReturns 204 No Content on success.\n\nSend Test Email\n\nPOST /brevo/v3/smtp/templates/{templateId}/sendTest\nContent-Type: application/json\n\n{\n  \"emailTo\": [\"test@example.com\"]\n}"
      },
      {
        "title": "Email Campaigns",
        "body": "List Campaigns\n\nGET /brevo/v3/emailCampaigns\n\nQuery Parameters:\n\ntype - Filter by type: classic, trigger\nstatus - Filter by status: draft, sent, archive, queued, suspended, in_process\nlimit - Results per page\noffset - Starting index\n\nResponse:\n\n{\n  \"count\": 1,\n  \"campaigns\": [\n    {\n      \"id\": 2,\n      \"name\": \"Monthly Newsletter\",\n      \"subject\": \"Our March Update\",\n      \"type\": \"classic\",\n      \"status\": \"draft\",\n      \"sender\": {\n        \"name\": \"Company\",\n        \"email\": \"news@company.com\"\n      },\n      \"createdAt\": \"2026-02-09T23:29:39.000Z\"\n    }\n  ]\n}\n\nGet Campaign\n\nGET /brevo/v3/emailCampaigns/{campaignId}\n\nCreate Campaign\n\nPOST /brevo/v3/emailCampaigns\nContent-Type: application/json\n\n{\n  \"name\": \"March Newsletter\",\n  \"subject\": \"Our March Update\",\n  \"sender\": {\n    \"name\": \"Company\",\n    \"email\": \"news@company.com\"\n  },\n  \"htmlContent\": \"<html><body><h1>March News</h1></body></html>\",\n  \"recipients\": {\n    \"listIds\": [2]\n  }\n}\n\nResponse:\n\n{\n  \"id\": 2\n}\n\nUpdate Campaign\n\nPUT /brevo/v3/emailCampaigns/{campaignId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Campaign Name\",\n  \"subject\": \"Updated Subject\"\n}\n\nReturns 204 No Content on success.\n\nDelete Campaign\n\nDELETE /brevo/v3/emailCampaigns/{campaignId}\n\nReturns 204 No Content on success.\n\nSend Campaign Now\n\nPOST /brevo/v3/emailCampaigns/{campaignId}/sendNow\n\nSend Test Email\n\nPOST /brevo/v3/emailCampaigns/{campaignId}/sendTest\nContent-Type: application/json\n\n{\n  \"emailTo\": [\"test@example.com\"]\n}\n\nUpdate Campaign Status\n\nPUT /brevo/v3/emailCampaigns/{campaignId}/status\nContent-Type: application/json\n\n{\n  \"status\": \"suspended\"\n}"
      },
      {
        "title": "Senders",
        "body": "List Senders\n\nGET /brevo/v3/senders\n\nResponse:\n\n{\n  \"senders\": [\n    {\n      \"id\": 1,\n      \"name\": \"Company\",\n      \"email\": \"noreply@company.com\",\n      \"active\": true,\n      \"ips\": []\n    }\n  ]\n}\n\nGet Sender\n\nGET /brevo/v3/senders/{senderId}\n\nCreate Sender\n\nPOST /brevo/v3/senders\nContent-Type: application/json\n\n{\n  \"name\": \"Marketing\",\n  \"email\": \"marketing@company.com\"\n}\n\nUpdate Sender\n\nPUT /brevo/v3/senders/{senderId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Name\"\n}\n\nDelete Sender\n\nDELETE /brevo/v3/senders/{senderId}"
      },
      {
        "title": "Blocked Contacts",
        "body": "List Blocked Contacts\n\nGET /brevo/v3/smtp/blockedContacts\n\nUnblock Contact\n\nDELETE /brevo/v3/smtp/blockedContacts/{email}"
      },
      {
        "title": "Blocked Domains",
        "body": "List Blocked Domains\n\nGET /brevo/v3/smtp/blockedDomains\n\nAdd Blocked Domain\n\nPOST /brevo/v3/smtp/blockedDomains\nContent-Type: application/json\n\n{\n  \"domain\": \"spam-domain.com\"\n}\n\nRemove Blocked Domain\n\nDELETE /brevo/v3/smtp/blockedDomains/{domain}"
      },
      {
        "title": "Pagination",
        "body": "Brevo uses offset-based pagination:\n\nGET /brevo/v3/contacts?limit=50&offset=0\n\nParameters:\n\nlimit - Number of results per page (varies by endpoint, typically max 500)\noffset - Starting index (0-based)\n\nResponse includes count:\n\n{\n  \"contacts\": [...],\n  \"count\": 150\n}\n\nTo get the next page, increment offset by limit:\n\nPage 1: offset=0&limit=50\nPage 2: offset=50&limit=50\nPage 3: offset=100&limit=50"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/brevo/v3/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/brevo/v3/contacts',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\nprint(data['contacts'])"
      },
      {
        "title": "Python (Send Email)",
        "body": "import os\nimport requests\n\nresponse = requests.post(\n    'https://gateway.maton.ai/brevo/v3/smtp/email',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'sender': {'name': 'John', 'email': 'john@example.com'},\n        'to': [{'email': 'recipient@example.com', 'name': 'Jane'}],\n        'subject': 'Hello!',\n        'htmlContent': '<html><body><h1>Hi Jane!</h1></body></html>'\n    }\n)\nresult = response.json()\nprint(f\"Sent! Message ID: {result['messageId']}\")"
      },
      {
        "title": "Python (Create Contact and Add to List)",
        "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\nresponse = requests.post(\n    'https://gateway.maton.ai/brevo/v3/contacts',\n    headers=headers,\n    json={\n        'email': 'newuser@example.com',\n        'attributes': {'FIRSTNAME': 'New', 'LASTNAME': 'User'},\n        'listIds': [2]\n    }\n)\ncontact = response.json()\nprint(f\"Created contact ID: {contact['id']}\")"
      },
      {
        "title": "Notes",
        "body": "All endpoints require the /v3/ prefix in the path\nAttribute names must be in UPPERCASE\nContact identifiers can be email, phone, or ID\nSender email addresses must be verified in Brevo\nTemplate parameters use {{params.name}} syntax\nPUT and DELETE operations return 204 No Content on success\nRate limits: 300 calls/minute on free plans, higher on paid plans\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 Brevo connection or bad request401Invalid or missing Maton API key404Resource not found429Rate limited4xx/5xxPassthrough error from Brevo API\n\nRate limit headers in response:\n\nx-sib-ratelimit-limit - Request limit\nx-sib-ratelimit-remaining - Remaining requests\nx-sib-ratelimit-reset - Reset time"
      },
      {
        "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": "Brevo API Overview\nBrevo API Key Concepts\nBrevo OAuth 2.0\nManage Contacts\nSend Transactional Email"
      }
    ],
    "body": "Brevo\n\nAccess the Brevo API with managed OAuth authentication. Send transactional emails, manage contacts and lists, create email campaigns, and work with templates.\n\nQuick Start\n# Get account info\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/brevo/v3/account')\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/brevo/v3/{resource}\n\n\nThe gateway proxies requests to api.brevo.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 Brevo 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=brevo&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': 'brevo'}).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\": \"b04dd695-d056-433b-baf9-0fb4eb3bde9e\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-09T19:51:00.932629Z\",\n    \"last_updated_time\": \"2026-02-09T19:51:30.123456Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"brevo\",\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 Brevo 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/brevo/v3/account')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', 'b04dd695-d056-433b-baf9-0fb4eb3bde9e')\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\nAccount\nGet Account Info\nGET /brevo/v3/account\n\n\nResponse:\n\n{\n  \"email\": \"user@example.com\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"companyName\": \"Acme Inc\",\n  \"relay\": {\n    \"enabled\": true,\n    \"data\": {\n      \"userName\": \"user@smtp-brevo.com\",\n      \"relay\": \"smtp-relay.brevo.com\",\n      \"port\": 587\n    }\n  }\n}\n\nContacts\nList Contacts\nGET /brevo/v3/contacts\n\n\nQuery Parameters:\n\nlimit - Number of results per page (default: 50, max: 500)\noffset - Index of first result (0-based)\nmodifiedSince - Filter by modification date (ISO 8601)\n\nResponse:\n\n{\n  \"contacts\": [\n    {\n      \"id\": 1,\n      \"email\": \"contact@example.com\",\n      \"emailBlacklisted\": false,\n      \"smsBlacklisted\": false,\n      \"createdAt\": \"2026-02-09T20:33:59.705+01:00\",\n      \"modifiedAt\": \"2026-02-09T20:35:19.529+01:00\",\n      \"listIds\": [2],\n      \"attributes\": {\n        \"FIRSTNAME\": \"John\",\n        \"LASTNAME\": \"Doe\"\n      }\n    }\n  ],\n  \"count\": 1\n}\n\nGet Contact\nGET /brevo/v3/contacts/{identifier}\n\n\nThe identifier can be email address, phone number, or contact ID.\n\nQuery Parameters:\n\nidentifierType - Type of identifier: email_id, phone_id, contact_id, ext_id\nCreate Contact\nPOST /brevo/v3/contacts\nContent-Type: application/json\n\n{\n  \"email\": \"newcontact@example.com\",\n  \"attributes\": {\n    \"FIRSTNAME\": \"Jane\",\n    \"LASTNAME\": \"Smith\"\n  },\n  \"listIds\": [2],\n  \"updateEnabled\": false\n}\n\n\nResponse:\n\n{\n  \"id\": 2\n}\n\n\nSet updateEnabled: true to update the contact if it already exists.\n\nUpdate Contact\nPUT /brevo/v3/contacts/{identifier}\nContent-Type: application/json\n\n{\n  \"attributes\": {\n    \"FIRSTNAME\": \"Updated\",\n    \"LASTNAME\": \"Name\"\n  }\n}\n\n\nReturns 204 No Content on success.\n\nDelete Contact\nDELETE /brevo/v3/contacts/{identifier}\n\n\nReturns 204 No Content on success.\n\nGet Contact Campaign Stats\nGET /brevo/v3/contacts/{identifier}/campaignStats\n\nLists\nList All Lists\nGET /brevo/v3/contacts/lists\n\n\nResponse:\n\n{\n  \"lists\": [\n    {\n      \"id\": 2,\n      \"name\": \"Newsletter Subscribers\",\n      \"folderId\": 1,\n      \"uniqueSubscribers\": 150,\n      \"totalBlacklisted\": 2,\n      \"totalSubscribers\": 148\n    }\n  ],\n  \"count\": 1\n}\n\nGet List\nGET /brevo/v3/contacts/lists/{listId}\n\nCreate List\nPOST /brevo/v3/contacts/lists\nContent-Type: application/json\n\n{\n  \"name\": \"New List\",\n  \"folderId\": 1\n}\n\n\nResponse:\n\n{\n  \"id\": 3\n}\n\nUpdate List\nPUT /brevo/v3/contacts/lists/{listId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated List Name\"\n}\n\n\nReturns 204 No Content on success.\n\nDelete List\nDELETE /brevo/v3/contacts/lists/{listId}\n\n\nReturns 204 No Content on success.\n\nGet Contacts in List\nGET /brevo/v3/contacts/lists/{listId}/contacts\n\nAdd Contacts to List\nPOST /brevo/v3/contacts/lists/{listId}/contacts/add\nContent-Type: application/json\n\n{\n  \"emails\": [\"contact1@example.com\", \"contact2@example.com\"]\n}\n\nRemove Contacts from List\nPOST /brevo/v3/contacts/lists/{listId}/contacts/remove\nContent-Type: application/json\n\n{\n  \"emails\": [\"contact1@example.com\"]\n}\n\nFolders\nList Folders\nGET /brevo/v3/contacts/folders\n\n\nResponse:\n\n{\n  \"folders\": [\n    {\n      \"id\": 1,\n      \"name\": \"Marketing\",\n      \"uniqueSubscribers\": 500,\n      \"totalSubscribers\": 480,\n      \"totalBlacklisted\": 20\n    }\n  ],\n  \"count\": 1\n}\n\nGet Folder\nGET /brevo/v3/contacts/folders/{folderId}\n\nCreate Folder\nPOST /brevo/v3/contacts/folders\nContent-Type: application/json\n\n{\n  \"name\": \"New Folder\"\n}\n\n\nResponse:\n\n{\n  \"id\": 4\n}\n\nUpdate Folder\nPUT /brevo/v3/contacts/folders/{folderId}\nContent-Type: application/json\n\n{\n  \"name\": \"Renamed Folder\"\n}\n\n\nReturns 204 No Content on success.\n\nDelete Folder\nDELETE /brevo/v3/contacts/folders/{folderId}\n\n\nDeletes folder and all lists within it. Returns 204 No Content on success.\n\nGet Lists in Folder\nGET /brevo/v3/contacts/folders/{folderId}/lists\n\nAttributes\nList Attributes\nGET /brevo/v3/contacts/attributes\n\n\nResponse:\n\n{\n  \"attributes\": [\n    {\n      \"name\": \"FIRSTNAME\",\n      \"category\": \"normal\",\n      \"type\": \"text\"\n    },\n    {\n      \"name\": \"LASTNAME\",\n      \"category\": \"normal\",\n      \"type\": \"text\"\n    }\n  ]\n}\n\nCreate Attribute\nPOST /brevo/v3/contacts/attributes/{category}/{attributeName}\nContent-Type: application/json\n\n{\n  \"type\": \"text\"\n}\n\n\nCategories: normal, transactional, category, calculated, global\n\nUpdate Attribute\nPUT /brevo/v3/contacts/attributes/{category}/{attributeName}\nContent-Type: application/json\n\n{\n  \"value\": \"new value\"\n}\n\nDelete Attribute\nDELETE /brevo/v3/contacts/attributes/{category}/{attributeName}\n\nTransactional Emails\nSend Email\nPOST /brevo/v3/smtp/email\nContent-Type: application/json\n\n{\n  \"sender\": {\n    \"name\": \"John Doe\",\n    \"email\": \"john@example.com\"\n  },\n  \"to\": [\n    {\n      \"email\": \"recipient@example.com\",\n      \"name\": \"Jane Smith\"\n    }\n  ],\n  \"subject\": \"Welcome!\",\n  \"htmlContent\": \"<html><body><h1>Hello!</h1><p>Welcome to our service.</p></body></html>\"\n}\n\n\nResponse:\n\n{\n  \"messageId\": \"<202602092329.12910305853@smtp-relay.mailin.fr>\"\n}\n\n\nOptional Parameters:\n\ncc - Carbon copy recipients\nbcc - Blind carbon copy recipients\nreplyTo - Reply-to address\ntextContent - Plain text version\ntemplateId - Use a template instead of htmlContent\nparams - Template parameters\nattachment - File attachments\nheaders - Custom headers\ntags - Email tags for tracking\nscheduledAt - Schedule for later (ISO 8601)\nGet Transactional Emails\nGET /brevo/v3/smtp/emails\n\n\nQuery Parameters:\n\nemail - Filter by recipient email\ntemplateId - Filter by template\nmessageId - Filter by message ID\nstartDate - Start date (YYYY-MM-DD)\nendDate - End date (YYYY-MM-DD)\nlimit - Results per page\noffset - Starting index\nDelete Scheduled Email\nDELETE /brevo/v3/smtp/email/{identifier}\n\n\nThe identifier can be a messageId or batchId.\n\nGet Email Statistics\nGET /brevo/v3/smtp/statistics/events\n\n\nQuery Parameters:\n\nlimit - Results per page\noffset - Starting index\nstartDate - Start date\nendDate - End date\nemail - Filter by recipient\nevent - Filter by event type: delivered, opened, clicked, bounced, etc.\nEmail Templates\nList Templates\nGET /brevo/v3/smtp/templates\n\n\nResponse:\n\n{\n  \"count\": 1,\n  \"templates\": [\n    {\n      \"id\": 1,\n      \"name\": \"Welcome Email\",\n      \"subject\": \"Welcome {{params.name}}!\",\n      \"isActive\": true,\n      \"sender\": {\n        \"name\": \"Company\",\n        \"email\": \"noreply@company.com\"\n      },\n      \"htmlContent\": \"<html>...</html>\",\n      \"createdAt\": \"2026-02-09 23:29:38\",\n      \"modifiedAt\": \"2026-02-09 23:29:38\"\n    }\n  ]\n}\n\nGet Template\nGET /brevo/v3/smtp/templates/{templateId}\n\nCreate Template\nPOST /brevo/v3/smtp/templates\nContent-Type: application/json\n\n{\n  \"sender\": {\n    \"name\": \"Company\",\n    \"email\": \"noreply@company.com\"\n  },\n  \"templateName\": \"Welcome Email\",\n  \"subject\": \"Welcome {{params.name}}!\",\n  \"htmlContent\": \"<html><body><h1>Hello {{params.name}}!</h1></body></html>\"\n}\n\n\nResponse:\n\n{\n  \"id\": 1\n}\n\nUpdate Template\nPUT /brevo/v3/smtp/templates/{templateId}\nContent-Type: application/json\n\n{\n  \"templateName\": \"Updated Template Name\",\n  \"subject\": \"New Subject\"\n}\n\n\nReturns 204 No Content on success.\n\nDelete Template\nDELETE /brevo/v3/smtp/templates/{templateId}\n\n\nReturns 204 No Content on success.\n\nSend Test Email\nPOST /brevo/v3/smtp/templates/{templateId}/sendTest\nContent-Type: application/json\n\n{\n  \"emailTo\": [\"test@example.com\"]\n}\n\nEmail Campaigns\nList Campaigns\nGET /brevo/v3/emailCampaigns\n\n\nQuery Parameters:\n\ntype - Filter by type: classic, trigger\nstatus - Filter by status: draft, sent, archive, queued, suspended, in_process\nlimit - Results per page\noffset - Starting index\n\nResponse:\n\n{\n  \"count\": 1,\n  \"campaigns\": [\n    {\n      \"id\": 2,\n      \"name\": \"Monthly Newsletter\",\n      \"subject\": \"Our March Update\",\n      \"type\": \"classic\",\n      \"status\": \"draft\",\n      \"sender\": {\n        \"name\": \"Company\",\n        \"email\": \"news@company.com\"\n      },\n      \"createdAt\": \"2026-02-09T23:29:39.000Z\"\n    }\n  ]\n}\n\nGet Campaign\nGET /brevo/v3/emailCampaigns/{campaignId}\n\nCreate Campaign\nPOST /brevo/v3/emailCampaigns\nContent-Type: application/json\n\n{\n  \"name\": \"March Newsletter\",\n  \"subject\": \"Our March Update\",\n  \"sender\": {\n    \"name\": \"Company\",\n    \"email\": \"news@company.com\"\n  },\n  \"htmlContent\": \"<html><body><h1>March News</h1></body></html>\",\n  \"recipients\": {\n    \"listIds\": [2]\n  }\n}\n\n\nResponse:\n\n{\n  \"id\": 2\n}\n\nUpdate Campaign\nPUT /brevo/v3/emailCampaigns/{campaignId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Campaign Name\",\n  \"subject\": \"Updated Subject\"\n}\n\n\nReturns 204 No Content on success.\n\nDelete Campaign\nDELETE /brevo/v3/emailCampaigns/{campaignId}\n\n\nReturns 204 No Content on success.\n\nSend Campaign Now\nPOST /brevo/v3/emailCampaigns/{campaignId}/sendNow\n\nSend Test Email\nPOST /brevo/v3/emailCampaigns/{campaignId}/sendTest\nContent-Type: application/json\n\n{\n  \"emailTo\": [\"test@example.com\"]\n}\n\nUpdate Campaign Status\nPUT /brevo/v3/emailCampaigns/{campaignId}/status\nContent-Type: application/json\n\n{\n  \"status\": \"suspended\"\n}\n\nSenders\nList Senders\nGET /brevo/v3/senders\n\n\nResponse:\n\n{\n  \"senders\": [\n    {\n      \"id\": 1,\n      \"name\": \"Company\",\n      \"email\": \"noreply@company.com\",\n      \"active\": true,\n      \"ips\": []\n    }\n  ]\n}\n\nGet Sender\nGET /brevo/v3/senders/{senderId}\n\nCreate Sender\nPOST /brevo/v3/senders\nContent-Type: application/json\n\n{\n  \"name\": \"Marketing\",\n  \"email\": \"marketing@company.com\"\n}\n\nUpdate Sender\nPUT /brevo/v3/senders/{senderId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Name\"\n}\n\nDelete Sender\nDELETE /brevo/v3/senders/{senderId}\n\nBlocked Contacts\nList Blocked Contacts\nGET /brevo/v3/smtp/blockedContacts\n\nUnblock Contact\nDELETE /brevo/v3/smtp/blockedContacts/{email}\n\nBlocked Domains\nList Blocked Domains\nGET /brevo/v3/smtp/blockedDomains\n\nAdd Blocked Domain\nPOST /brevo/v3/smtp/blockedDomains\nContent-Type: application/json\n\n{\n  \"domain\": \"spam-domain.com\"\n}\n\nRemove Blocked Domain\nDELETE /brevo/v3/smtp/blockedDomains/{domain}\n\nPagination\n\nBrevo uses offset-based pagination:\n\nGET /brevo/v3/contacts?limit=50&offset=0\n\n\nParameters:\n\nlimit - Number of results per page (varies by endpoint, typically max 500)\noffset - Starting index (0-based)\n\nResponse includes count:\n\n{\n  \"contacts\": [...],\n  \"count\": 150\n}\n\n\nTo get the next page, increment offset by limit:\n\nPage 1: offset=0&limit=50\nPage 2: offset=50&limit=50\nPage 3: offset=100&limit=50\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/brevo/v3/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/brevo/v3/contacts',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\nprint(data['contacts'])\n\nPython (Send Email)\nimport os\nimport requests\n\nresponse = requests.post(\n    'https://gateway.maton.ai/brevo/v3/smtp/email',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'sender': {'name': 'John', 'email': 'john@example.com'},\n        'to': [{'email': 'recipient@example.com', 'name': 'Jane'}],\n        'subject': 'Hello!',\n        'htmlContent': '<html><body><h1>Hi Jane!</h1></body></html>'\n    }\n)\nresult = response.json()\nprint(f\"Sent! Message ID: {result['messageId']}\")\n\nPython (Create Contact and Add to List)\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\nresponse = requests.post(\n    'https://gateway.maton.ai/brevo/v3/contacts',\n    headers=headers,\n    json={\n        'email': 'newuser@example.com',\n        'attributes': {'FIRSTNAME': 'New', 'LASTNAME': 'User'},\n        'listIds': [2]\n    }\n)\ncontact = response.json()\nprint(f\"Created contact ID: {contact['id']}\")\n\nNotes\nAll endpoints require the /v3/ prefix in the path\nAttribute names must be in UPPERCASE\nContact identifiers can be email, phone, or ID\nSender email addresses must be verified in Brevo\nTemplate parameters use {{params.name}} syntax\nPUT and DELETE operations return 204 No Content on success\nRate limits: 300 calls/minute on free plans, higher on paid plans\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 Brevo connection or bad request\n401\tInvalid or missing Maton API key\n404\tResource not found\n429\tRate limited\n4xx/5xx\tPassthrough error from Brevo API\n\nRate limit headers in response:\n\nx-sib-ratelimit-limit - Request limit\nx-sib-ratelimit-remaining - Remaining requests\nx-sib-ratelimit-reset - Reset time\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\nBrevo API Overview\nBrevo API Key Concepts\nBrevo OAuth 2.0\nManage Contacts\nSend Transactional Email"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/brevo-api",
    "publisherUrl": "https://clawhub.ai/byungkyu/brevo-api",
    "owner": "byungkyu",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/brevo-api",
    "downloadUrl": "https://openagent3.xyz/downloads/brevo-api",
    "agentUrl": "https://openagent3.xyz/skills/brevo-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/brevo-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/brevo-api/agent.md"
  }
}