← Back to Skills Marketplace
byungkyu

Resend

by byungkyu · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ✓ Security Clean
238
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install resend-api
Description
Resend API integration with managed authentication. Send transactional emails, manage domains, contacts, templates, and broadcasts. Use this skill when users...
README (SKILL.md)

Resend

Access the Resend API with managed authentication. Send transactional emails, manage domains, contacts, templates, broadcasts, and webhooks.

Quick Start

# List sent emails
python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/emails')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://gateway.maton.ai/resend/{endpoint}

The gateway proxies requests to api.resend.com and automatically injects your API key.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your Resend connections at https://ctrl.maton.ai.

List Connections

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=resend&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'resend'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "528c8f70-23f4-46d5-bd9f-01d0d043e573",
    "status": "ACTIVE",
    "creation_time": "2026-03-13T00:19:36.809599Z",
    "last_updated_time": "2026-03-13T09:59:08.443568Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "resend",
    "metadata": {},
    "method": "API_KEY"
  }
}

Delete Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple Resend connections, specify which one to use with the Maton-Connection header:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/emails')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '528c8f70-23f4-46d5-bd9f-01d0d043e573')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

API Reference

Emails

Send and manage transactional emails.

Send Email

POST /resend/emails

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'from': '[email protected]',
    'to': ['[email protected]'],
    'subject': 'Hello from Resend',
    'html': '\x3Cp>Welcome to our service!\x3C/p>'
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/emails', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Request Body:

Field Type Required Description
from string Yes Sender email (must be from verified domain)
to string[] Yes Recipient email addresses
subject string Yes Email subject
html string No HTML content
text string No Plain text content
cc string[] No CC recipients
bcc string[] No BCC recipients
reply_to string[] No Reply-to addresses
attachments object[] No File attachments
tags object[] No Email tags for tracking
scheduled_at string No ISO 8601 datetime for scheduled send

Response:

{
  "id": "a52ac168-338f-4fbc-9354-e6049b193d99"
}

Send Batch Emails

POST /resend/emails/batch

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps([
    {'from': '[email protected]', 'to': ['[email protected]'], 'subject': 'Email 1', 'text': 'Content 1'},
    {'from': '[email protected]', 'to': ['[email protected]'], 'subject': 'Email 2', 'text': 'Content 2'}
]).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/emails/batch', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

List Emails

GET /resend/emails

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/emails')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "data": [
    {
      "id": "a52ac168-338f-4fbc-9354-e6049b193d99",
      "from": "[email protected]",
      "to": ["[email protected]"],
      "subject": "Hello from Resend",
      "created_at": "2026-03-13T10:00:00.000Z"
    }
  ]
}

Get Email

GET /resend/emails/{email_id}

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/emails/{email_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Update Email

PATCH /resend/emails/{email_id}

Cancel Scheduled Email

DELETE /resend/emails/{email_id}

Domains

Manage sending domains.

List Domains

GET /resend/domains

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/domains')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "data": [
    {
      "id": "5eb93a2e-e849-40a1-81b7-ed0fb574ddd8",
      "name": "yourdomain.com",
      "status": "verified",
      "created_at": "2026-03-13T10:00:00.000Z"
    }
  ]
}

Create Domain

POST /resend/domains

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({'name': 'yourdomain.com'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/domains', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "id": "5eb93a2e-e849-40a1-81b7-ed0fb574ddd8",
  "name": "yourdomain.com",
  "status": "pending",
  "records": [
    {"type": "MX", "name": "...", "value": "..."},
    {"type": "TXT", "name": "...", "value": "..."}
  ]
}

Get Domain

GET /resend/domains/{domain_id}

Update Domain

PATCH /resend/domains/{domain_id}

Delete Domain

DELETE /resend/domains/{domain_id}

Verify Domain

POST /resend/domains/{domain_id}/verify

Contacts

Manage contact lists.

List Contacts

GET /resend/contacts

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/contacts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Contact

POST /resend/contacts

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'email': '[email protected]',
    'first_name': 'John',
    'last_name': 'Doe'
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/contacts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "id": "3cdc4bbb-0c79-46e5-be2a-48a89c29203d"
}

Get Contact

GET /resend/contacts/{contact_id}

Update Contact

PATCH /resend/contacts/{contact_id}

Delete Contact

DELETE /resend/contacts/{contact_id}

Templates

Manage email templates.

List Templates

GET /resend/templates

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/templates')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Template

POST /resend/templates

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'name': 'Welcome Email',
    'subject': 'Welcome to our service!',
    'html': '\x3Ch1>Welcome!\x3C/h1>\x3Cp>Thanks for signing up.\x3C/p>'
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/templates', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "id": "9b84737c-8a80-448a-aca1-c6e1fddd0f23"
}

Get Template

GET /resend/templates/{template_id}

Update Template

PATCH /resend/templates/{template_id}

Delete Template

DELETE /resend/templates/{template_id}

Publish Template

POST /resend/templates/{template_id}/publish

Duplicate Template

POST /resend/templates/{template_id}/duplicate

Segments

Create audience segments for targeting.

List Segments

GET /resend/segments

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/segments')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Segment

POST /resend/segments

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'name': 'Active Users',
    'filter': {
        'and': [
            {'field': 'email', 'operator': 'contains', 'value': '@'}
        ]
    }
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/segments', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Segment

GET /resend/segments/{segment_id}

Delete Segment

DELETE /resend/segments/{segment_id}

Broadcasts

Send emails to segments.

List Broadcasts

GET /resend/broadcasts

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/broadcasts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Broadcast

POST /resend/broadcasts

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'name': 'Weekly Newsletter',
    'from': '[email protected]',
    'subject': 'This Week\'s Update',
    'html': '\x3Ch1>Weekly Update\x3C/h1>\x3Cp>Here\'s what happened...\x3C/p>',
    'segment_id': 'segment-uuid'
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/broadcasts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Broadcast

GET /resend/broadcasts/{broadcast_id}

Update Broadcast

PATCH /resend/broadcasts/{broadcast_id}

Delete Broadcast

DELETE /resend/broadcasts/{broadcast_id}

Send Broadcast

POST /resend/broadcasts/{broadcast_id}/send

Webhooks

Configure event notifications.

List Webhooks

GET /resend/webhooks

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/webhooks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Webhook

POST /resend/webhooks

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'endpoint': 'https://yoursite.com/webhook',
    'events': ['email.delivered', 'email.bounced', 'email.opened']
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/webhooks', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Webhook Events:

  • email.sent - Email was sent
  • email.delivered - Email was delivered
  • email.opened - Email was opened
  • email.clicked - Link in email was clicked
  • email.bounced - Email bounced
  • email.complained - Recipient marked as spam

Get Webhook

GET /resend/webhooks/{webhook_id}

Update Webhook

PATCH /resend/webhooks/{webhook_id}

Delete Webhook

DELETE /resend/webhooks/{webhook_id}

API Keys

Manage API keys.

List API Keys

GET /resend/api-keys

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/resend/api-keys')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create API Key

POST /resend/api-keys

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({'name': 'Production Key'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/api-keys', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Note: The actual API key value is only returned once on creation.

Delete API Key

DELETE /resend/api-keys/{api_key_id}

Topics

Manage subscription topics.

List Topics

GET /resend/topics

Create Topic

POST /resend/topics

Example:

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({
    'name': 'Newsletter',
    'default_subscription': 'subscribed'
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/resend/topics', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Note: default_subscription is required. Values: subscribed or unsubscribed.

Get Topic

GET /resend/topics/{topic_id}

Update Topic

PATCH /resend/topics/{topic_id}

Delete Topic

DELETE /resend/topics/{topic_id}

Contact Properties

Manage custom contact properties.

List Contact Properties

GET /resend/contact-properties

Create Contact Property

POST /resend/contact-properties

Get Contact Property

GET /resend/contact-properties/{property_id}

Update Contact Property

PATCH /resend/contact-properties/{property_id}

Delete Contact Property

DELETE /resend/contact-properties/{property_id}

Code Examples

JavaScript

// Send an email
const response = await fetch('https://gateway.maton.ai/resend/emails', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    from: '[email protected]',
    to: ['[email protected]'],
    subject: 'Hello!',
    html: '\x3Cp>Welcome!\x3C/p>'
  })
});
const data = await response.json();
console.log(data.id);

Python

import os
import requests

response = requests.post(
    'https://gateway.maton.ai/resend/emails',
    headers={
        'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
        'Content-Type': 'application/json'
    },
    json={
        'from': '[email protected]',
        'to': ['[email protected]'],
        'subject': 'Hello!',
        'html': '\x3Cp>Welcome!\x3C/p>'
    }
)
email = response.json()
print(f"Email sent: {email['id']}")

Notes

  • Sending emails requires a verified domain
  • Rate limit: 2 requests per second
  • Batch emails accept up to 100 emails per request
  • Scheduled emails can be set up to 7 days in advance
  • Attachments support base64 encoded content or URLs
  • The from address must use a verified domain
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments

Error Handling

Status Meaning
400 Bad request or missing Resend connection
401 Invalid or missing Maton API key
403 Domain not verified or permission denied
404 Resource not found
422 Validation error (missing required fields)
429 Rate limited (2 req/sec)
4xx/5xx Passthrough error from Resend API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Domain Not Verified

To send emails, you must first add and verify a domain:

  1. Create a domain: POST /resend/domains
  2. Add the DNS records provided in the response
  3. Verify the domain: POST /resend/domains/{id}/verify

Resources

Usage Guidance
This skill appears to do what it says: it sends requests to Maton's gateway to interact with Resend. Before installing, confirm you trust maton.ai because your API key and the full email contents (including attachments) will pass through their service. Use a dedicated, limited-scope API key you can rotate or revoke if needed, avoid sending highly sensitive data through the gateway, and verify Maton's privacy/retention policies and account settings. If you prefer not to proxy through a third party, consider calling api.resend.com directly with a Resend API key instead.
Capability Analysis
Type: OpenClaw Skill Name: resend-api Version: 1.0.0 The skill provides a standard interface for the Resend API via a managed gateway (gateway.maton.ai). It uses the MATON_API_KEY environment variable for authentication as documented. The provided Python snippets in SKILL.md are straightforward implementations using standard libraries for HTTP requests and do not contain any malicious logic, obfuscation, or unauthorized data exfiltration beyond the intended API communication.
Capability Assessment
Purpose & Capability
Name/description, required env var (MATON_API_KEY), and the SKILL.md all describe sending and managing emails via a Maton gateway that proxies to Resend. The requested credential is appropriate for that purpose.
Instruction Scope
Instructions only perform HTTP requests to gateway.maton.ai and ctrl.maton.ai and require MATON_API_KEY. They do not instruct reading unrelated files or system state. Note: the gateway proxies requests (so Maton will see email content and headers) — this is expected behavior but important for privacy.
Install Mechanism
No install spec and no code files — the skill is instruction-only and does not write or execute new binaries on disk.
Credentials
Only one required env var (MATON_API_KEY) is requested, which is proportional to the described gateway integration. Registry metadata lists no primary credential field, but the SKILL.md consistently uses MATON_API_KEY; this is a minor metadata omission rather than an incoherence.
Persistence & Privilege
always is false and the skill does not request persistent system-wide changes or other skills' credentials. Autonomous invocation is allowed by platform default (not a problem here).
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install resend-api
  3. After installation, invoke the skill by name or use /resend-api
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial release of resend skill — provides managed integration with the Resend API for email operations via Maton. - Send single or batch transactional emails through the Resend API. - Manage email domains, templates, contacts, broadcasts, and webhooks. - Full authentication via Maton API key with easy connection management. - Includes Python example code for all supported API endpoints. - Supports multiple Resend connections with connection selection via headers.
Metadata
Slug resend-api
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is Resend?

Resend API integration with managed authentication. Send transactional emails, manage domains, contacts, templates, and broadcasts. Use this skill when users... It is an AI Agent Skill for Claude Code / OpenClaw, with 238 downloads so far.

How do I install Resend?

Run "/install resend-api" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Resend free?

Yes, Resend is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Resend support?

Resend is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Resend?

It is built and maintained by byungkyu (@byungkyu); the current version is v1.0.0.

💬 Comments