← Back to Skills Marketplace
unione-repo

Unione - Email API

by UniOne · GitHub ↗ · v0.1.2
cross-platform ✓ Security Clean
561
Downloads
8
Stars
0
Active Installs
2
Versions
Install in OpenClaw
/install unione-api-skill
Description
Send transactional and marketing emails via UniOne Email API. Manage email templates, validate email addresses, check delivery statistics, manage suppression...
README (SKILL.md)

UniOne Email API

UniOne is a transactional email service with Web API for sending transactional and marketing emails at scale (up to 3,000 emails/sec). This skill lets you send emails, manage templates, validate addresses, track delivery, and more.

Authentication

All requests require the UNIONE_API_KEY environment variable. Pass it as the X-API-KEY header.

Base URL: https://api.unione.io/en/transactional/api/v1/{method}.json?platform=openclaw

All methods use POST with JSON body.


CRITICAL: Domain Setup (Required Before Sending)

Emails will not be delivered until the sender's domain is verified. Before attempting to send any email, ensure the domain is set up:

Step 1: Get DNS Record Values — domain/get-dns-records.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/domain/get-dns-records.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"domain": "yourdomain.com"}'

API response returns raw values (not ready-to-paste DNS records):

{
  "status": "success",
  "domain": "yourdomain.com",
  "verification-record": "unione-validate-hash=483bb362ebdbeedd755cfb1d4d661",
  "dkim": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7"
}

The user must create 3 DNS TXT records from these values:

Record Host Record Type Value
@ TXT unione-validate-hash=\x3Cverification-record from response>
us._domainkey TXT k=rsa; p=\x3Cdkim from response>
@ TXT v=spf1 include:spf.unione.io ~all

Present these 3 records clearly to the user and instruct them to add them at their DNS provider (Cloudflare, Route53, GoDaddy, etc.). The SPF record is always the same — it is not returned by the API.

Step 2: Verify Domain Ownership — domain/validate-verification.json

After the user has added DNS records:

curl -X POST "https://api.unione.io/en/transactional/api/v1/domain/validate-verification.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"domain": "yourdomain.com"}'

Step 3: Validate DKIM — domain/validate-dkim.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/domain/validate-dkim.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"domain": "yourdomain.com"}'

Step 4: List All Domains — domain/list.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/domain/list.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{}'

If domain verification fails: DNS propagation can take up to 48 hours. Suggest the user waits and retries, or checks their DNS records for typos.


Error Handling & Retry Policy

Retry Logic

When making API requests, implement exponential backoff for retryable errors:

Retryable errors (DO retry with exponential backoff):

HTTP Code Meaning Retry Strategy
429 Rate limited Wait, then retry. Respect Retry-After header if present
500 Internal server error Retry up to 3 times
502 Bad gateway Retry up to 3 times
503 Service unavailable Retry up to 3 times
504 Gateway timeout Retry up to 3 times

Recommended retry schedule:

Attempt Delay
1 Immediate
2 1 second
3 5 seconds
4 30 seconds

Non-retryable errors (do NOT retry):

HTTP Code Meaning Action
400 Bad request Fix the request parameters
401 Unauthorized Check API key
403 Forbidden Check permissions / domain verification
404 Endpoint not found Check the method path
413 Payload too large Reduce request size

Idempotency

For email/send.json, always include an idempotency_key to prevent duplicate sends during retries. This is critical for production systems.

The idempotency_key is a unique string (UUID recommended) passed in the request body. If UniOne receives two requests with the same key, the second request returns the result of the first without sending another email.

Always generate a unique idempotency key per logical send operation, and reuse the same key when retrying the same send.


1. Send Email — email/send.json

Send a transactional or marketing email to one or more recipients. Supports personalization via substitutions, templates, attachments, tracking, and metadata.

curl

curl -X POST "https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{
    "idempotency_key": "unique-uuid-here",
    "message": {
      "recipients": [
        {
          "email": "[email protected]",
          "substitutions": {
            "to_name": "John Smith"
          }
        }
      ],
      "body": {
        "html": "\x3Ch1>Hello, {{to_name}}!\x3C/h1>\x3Cp>Your order has been confirmed.\x3C/p>",
        "plaintext": "Hello, {{to_name}}! Your order has been confirmed."
      },
      "subject": "Order Confirmation",
      "from_email": "[email protected]",
      "from_name": "Your Store"
    }
  }'

Node.js

const response = await fetch("https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-KEY": process.env.UNIONE_API_KEY
  },
  body: JSON.stringify({
    idempotency_key: crypto.randomUUID(),
    message: {
      recipients: [{ email: "[email protected]", substitutions: { to_name: "John" } }],
      body: {
        html: "\x3Ch1>Hello, {{to_name}}!\x3C/h1>\x3Cp>Your order has been confirmed.\x3C/p>",
        plaintext: "Hello, {{to_name}}! Your order has been confirmed."
      },
      subject: "Order Confirmation",
      from_email: "[email protected]",
      from_name: "Your Store"
    }
  })
});
const data = await response.json();
// data.status === "success" → data.job_id, data.emails

Python

import requests, uuid, os

response = requests.post(
    "https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw",
    headers={
        "Content-Type": "application/json",
        "X-API-KEY": os.environ["UNIONE_API_KEY"]
    },
    json={
        "idempotency_key": str(uuid.uuid4()),
        "message": {
            "recipients": [{"email": "[email protected]", "substitutions": {"to_name": "John"}}],
            "body": {
                "html": "\x3Ch1>Hello, {{to_name}}!\x3C/h1>\x3Cp>Your order has been confirmed.\x3C/p>",
                "plaintext": "Hello, {{to_name}}! Your order has been confirmed."
            },
            "subject": "Order Confirmation",
            "from_email": "[email protected]",
            "from_name": "Your Store"
        }
    }
)
data = response.json()  # data["status"] == "success" → data["job_id"], data["emails"]

Go

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "os"
    "github.com/google/uuid"
)

func sendEmail() error {
    payload := map[string]interface{}{
        "idempotency_key": uuid.New().String(),
        "message": map[string]interface{}{
            "recipients": []map[string]interface{}{
                {"email": "[email protected]", "substitutions": map[string]string{"to_name": "John"}},
            },
            "body": map[string]string{
                "html":      "\x3Ch1>Hello, {{to_name}}!\x3C/h1>\x3Cp>Your order has been confirmed.\x3C/p>",
                "plaintext": "Hello, {{to_name}}! Your order has been confirmed.",
            },
            "subject":    "Order Confirmation",
            "from_email": "[email protected]",
            "from_name":  "Your Store",
        },
    }
    body, _ := json.Marshal(payload)
    req, _ := http.NewRequest("POST",
        "https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw",
        bytes.NewReader(body))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("X-API-KEY", os.Getenv("UNIONE_API_KEY"))
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    fmt.Println(result) // result["status"] == "success"
    return nil
}

PHP

$ch = curl_init("https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "X-API-KEY: " . getenv("UNIONE_API_KEY")
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "idempotency_key" => bin2hex(random_bytes(16)),
        "message" => [
            "recipients" => [["email" => "[email protected]", "substitutions" => ["to_name" => "John"]]],
            "body" => [
                "html" => "\x3Ch1>Hello, {{to_name}}!\x3C/h1>\x3Cp>Your order has been confirmed.\x3C/p>",
                "plaintext" => "Hello, {{to_name}}! Your order has been confirmed."
            ],
            "subject" => "Order Confirmation",
            "from_email" => "[email protected]",
            "from_name" => "Your Store"
        ]
    ])
]);
$response = curl_exec($ch);
$data = json_decode($response, true); // $data["status"] === "success"

Success response:

{
  "status": "success",
  "job_id": "1ZymBc-00041N-9X",
  "emails": ["[email protected]"]
}

Full parameters for message object:

Parameter Type Required Description
recipients array Yes Array of recipient objects. Each has email (required), substitutions (object), metadata (object)
body.html string Yes* HTML content. Use {{variable}} for substitutions
body.plaintext string No Plain text version
subject string Yes* Email subject line. Supports {{substitutions}}
from_email string Yes* Sender email (must be from a verified domain)
from_name string No Sender display name
reply_to string No Reply-to email address
template_id string No Use a stored template instead of body/subject
tags array No Tags for categorizing and filtering
track_links 0/1 No Enable click tracking (default: 0)
track_read 0/1 No Enable open tracking (default: 0)
global_language string No Language for unsubscribe footer: en, de, fr, es, it, pl, pt, ru, ua, be
template_engine string No "simple" (default) or "velocity" or "liquid"
global_substitutions object No Variables available to all recipients
attachments array No Array of {type, name, content} where content is base64
skip_unsubscribe 0/1 No Skip unsubscribe footer (use 1 only for transactional)
headers object No Custom email headers

*Not required if template_id is used.

Top-level parameter:

Parameter Type Required Description
idempotency_key string Recommended Unique key (UUID) to prevent duplicate sends on retry. Max 36 chars.

Send with template:

curl -X POST "https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{
    "idempotency_key": "unique-uuid-here",
    "message": {
      "recipients": [
        {
          "email": "[email protected]",
          "substitutions": {
            "to_name": "Alice",
            "order_id": "ORD-12345",
            "total": "$59.99"
          }
        }
      ],
      "template_id": "your-template-id",
      "from_email": "[email protected]",
      "from_name": "My Shop"
    }
  }'

Send to multiple recipients with personalization:

curl -X POST "https://api.unione.io/en/transactional/api/v1/email/send.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{
    "idempotency_key": "unique-uuid-here",
    "message": {
      "recipients": [
        {"email": "[email protected]", "substitutions": {"to_name": "Alice"}},
        {"email": "[email protected]", "substitutions": {"to_name": "Bob"}}
      ],
      "body": {
        "html": "\x3Cp>Hi {{to_name}}, check out our new {{promo_name}}!\x3C/p>"
      },
      "subject": "Special offer for you, {{to_name}}!",
      "from_email": "[email protected]",
      "from_name": "Marketing Team",
      "global_substitutions": {"promo_name": "Summer Sale"},
      "track_links": 1,
      "track_read": 1,
      "tags": ["promo", "summer-2026"]
    }
  }'

2. Email Validation — email-validation/single.json

Validate an email address to check if it exists and is deliverable.

curl -X POST "https://api.unione.io/en/transactional/api/v1/email-validation/single.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"email": "[email protected]"}'

Response:

{
  "status": "success",
  "email": "[email protected]",
  "result": "valid",
  "local_part": "user",
  "domain": "example.com",
  "mx_found": true,
  "mx_record": "mail.example.com"
}

Possible result values: "valid", "invalid", "unresolvable", "unknown".


3. Template Management

3.1 Create/Update Template — template/set.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/template/set.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{
    "template": {
      "name": "Order Confirmation",
      "subject": "Your order {{order_id}} is confirmed",
      "template_engine": "simple",
      "body": {
        "html": "\x3Ch1>Thank you, {{to_name}}!\x3C/h1>\x3Cp>Order {{order_id}} total: {{total}}\x3C/p>",
        "plaintext": "Thank you, {{to_name}}! Order {{order_id}} total: {{total}}"
      },
      "from_email": "[email protected]",
      "from_name": "My Shop"
    }
  }'

Response: {"status": "success", "template": {"id": "generated-template-id"}}

To update an existing template, include the "id" field in the template object.

3.2 Get Template — template/get.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/template/get.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"id": "template-id-here"}'

3.3 List Templates — template/list.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/template/list.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"limit": 50, "offset": 0}'

3.4 Delete Template — template/delete.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/template/delete.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"id": "template-id-here"}'

4. Webhook Management

Webhooks send real-time notifications about email events to your URL.

4.1 Set Webhook — webhook/set.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/webhook/set.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{
    "url": "https://yourapp.com/unione-webhook",
    "events": {
      "email_status": [
        "delivered", "opened", "clicked", "unsubscribed",
        "soft_bounced", "hard_bounced", "spam"
      ]
    }
  }'

4.2 List Webhooks — webhook/list.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/webhook/list.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{}'

4.3 Get / Delete Webhook — webhook/get.json / webhook/delete.json

# Get
curl -X POST ".../webhook/get.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"url": "https://yourapp.com/unione-webhook"}'

# Delete
curl -X POST ".../webhook/delete.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"url": "https://yourapp.com/unione-webhook"}'

5. Suppression List Management

5.1 Add — suppression/set.json

curl -X POST "https://api.unione.io/en/transactional/api/v1/suppression/set.json?platform=openclaw" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $UNIONE_API_KEY" \
  -d '{"email": "[email protected]", "cause": "unsubscribed", "created": "2026-01-15 12:00:00"}'

Cause values: "unsubscribed", "temporary_unavailable", "permanent_unavailable", "complained".

5.2 Check — suppression/get.json

curl -X POST ".../suppression/get.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"email": "[email protected]"}'

5.3 List — suppression/list.json

curl -X POST ".../suppression/list.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"cause": "hard_bounced", "limit": 50, "offset": 0}'

5.4 Delete — suppression/delete.json

curl -X POST ".../suppression/delete.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"email": "[email protected]"}'

6. Event Dumps

6.1 Create — event-dump/create.json

curl -X POST ".../event-dump/create.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"start_time": "2026-01-01 00:00:00", "end_time": "2026-01-31 23:59:59", "limit": 50000, "all_events": true}'

6.2 Get / List / Delete

# Get dump status and download URL
curl -X POST ".../event-dump/get.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"dump_id": "dump-id"}'

# List all dumps
curl -X POST ".../event-dump/list.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{}'

# Delete a dump
curl -X POST ".../event-dump/delete.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"dump_id": "dump-id"}'

7. Tags — tag/list.json / tag/delete.json

# List tags
curl -X POST ".../tag/list.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{}'

# Delete tag
curl -X POST ".../tag/delete.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{"tag_id": 123}'

8. Projects — project/create.json / project/list.json

# Create project
curl -X POST ".../project/create.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project": {"name": "My Project", "send_enabled": true}}'

# List projects
curl -X POST ".../project/list.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{}'

9. System Info — system/info.json

curl -X POST ".../system/info.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" -d '{}'

10. Subscribe (Double Opt-In) — email/subscribe.json

curl -X POST ".../email/subscribe.json?platform=openclaw" -H "X-API-KEY: $UNIONE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from_email": "[email protected]", "from_name": "Newsletter", "to_email": "[email protected]"}'

Instructions for the Agent

  1. Domain setup is mandatory. Before the first send, always check if the user's domain is verified. Run domain/list.json to check. If not verified, guide them through the domain setup process (Section: Domain Setup).
  2. Always use api.unione.io as the API host for all requests.
  3. Never send an email without explicit user confirmation. Always show the recipient, subject, and body summary before executing email/send.json. Wait for the user to approve. This applies to every send — including test emails and retries with new content.
  4. Never modify or delete templates, webhooks, or suppressions without explicit user confirmation. Show what will be changed and wait for approval.
  5. Always include idempotency_key in email/send.json requests. Generate a UUID for each unique send. Reuse the same key when retrying.
  6. Implement retry logic for 429 and 5xx errors with exponential backoff (see Error Handling section). Never retry 400, 401, 403, 404, 413 errors.
  7. For template operations, list available templates first before asking which one to use.
  8. For validation, report the result clearly and suggest action.
  9. Handle errors gracefully. If a request returns an error, explain what went wrong and suggest a fix.
  10. Remind users that the from_email domain must be verified in their UniOne account.
  11. Substitution syntax uses double curly braces: {{variable_name}}.
  12. Attachments must be base64-encoded. Help the user encode files if needed.
  13. Security: Never log or display the full API key. Remind users to keep their API key secret. Recommend using a least-privilege API key scoped to only the required actions.
  14. DNS safety: When guiding users through domain DNS setup, instruct them to add records at their DNS provider themselves. Never ask users to paste private keys, certificates, or unrelated secrets into the conversation.
  15. Code language: When the user's project uses a specific language (Node.js, Python, Go, PHP, etc.), provide code examples in that language. The examples in this skill can be adapted to any language that can make HTTP POST requests with JSON.
  16. Scope: Only interact with UniOne API endpoints documented in this skill. Do not read unrelated files, environment variables, or access third-party services.

Common Workflows

"Send a test email"

  1. Check domain verification (domain/list.json)
  2. If domain not verified, guide through domain setup
  3. Ask for recipient email address
  4. Compose a simple test message
  5. Confirm with user before sending
  6. Execute email/send.json with idempotency_key
  7. Report the job_id on success

"Check my deliverability setup"

  1. Run system/info.json to get account status
  2. Run domain/list.json to check domain verification
  3. For each unverified domain, run domain/get-dns-records.json and show required records
  4. Run domain/validate-dkim.json to check DKIM
  5. Suggest fixes if domains are not fully verified

"Validate a list of emails"

  1. For each email, call email-validation/single.json
  2. Categorize results: valid, invalid, unknown
  3. Report summary

"Set up delivery tracking"

  1. Ask for webhook URL and events to track
  2. Execute webhook/set.json
  3. Confirm setup

Resources

Usage Guidance
This skill appears to be what it claims (a UniOne email API adapter) and only needs your UniOne API key. Before installing: (1) Verify the source links in SKILL.md/README (unione.io and the GitHub repo) match an official UniOne release; the registry metadata you were shown earlier was inconsistent. (2) Use a least-privilege/scoped API key (not a production master key) and avoid pasting other secrets. (3) Expect to manually add DNS TXT records at your DNS provider for domain verification—do this yourself and do not share private keys. (4) Confirm curl and jq are available if you plan to use the optional scripts. (5) If you're uncomfortable with autonomous invocation, you can disable or require user confirmation for the skill in your agent settings. If you want higher assurance, ask the publisher for an authoritative repository URL and checksum for the skill package before installing.
Capability Analysis
Package: unione (xpi) Version: 1.0.0 Description: Send transactional and marketing emails via UniOne Email API. Manage templates, validate addresses, track delivery, and handle domain settings. The `unione` package is an OpenClaw Skill designed to enable AI agents to interact with the UniOne Email API. Its functionality is strictly limited to email-related operations such as sending emails, managing templates, validating addresses, and configuring webhooks. All API calls are directed to the official UniOne API endpoint. The skill requires an API key (`UNIONE_API_KEY`) from environment variables, and the agent is explicitly instructed not to log or display this key. Crucially, the `SKILL.md` provides explicit instructions for the AI agent to always seek **explicit user confirmation** before performing sensitive actions like sending emails or modifying resources. Furthermore, the agent is instructed to limit its scope strictly to UniOne API interactions and not to access unrelated files, environment variables, or third-party services. The domain verification process is designed to be secure, requiring manual user action for DNS record updates. The overall design incorporates robust security practices for an API integration within an AI agent framework, relying on the agent's adherence to these well-defined security instructions.
Capability Assessment
Purpose & Capability
The skill is clearly an adapter for the UniOne transactional email API and legitimately needs an API key. However, the registry metadata you provided says no required binaries while the README and SKILL.md use curl (and the manifest lists curl and jq). Also the top-level registry metadata listed 'Source: unknown' and 'Homepage: none' while SKILL.md/README include links to unione.io and a GitHub repo—these metadata mismatches should be checked.
Instruction Scope
SKILL.md's runtime instructions are limited to calling UniOne HTTP endpoints, domain verification steps (DNS records) and email management operations. It only references the declared env var (UNIONE_API_KEY) and does not instruct reading unrelated local files or other credentials. It asks the user to add DNS records at their DNS provider—this is expected for domain verification.
Install Mechanism
This is an instruction-only skill (no install spec, no code files), which is low risk. The README and manifest expect tools (curl, jq) but there is no install step that fetches code or binaries. Confirm you have curl/jq locally if you plan to use the optional CLI helpers; there are no remote downloads or archives presented by the skill itself.
Credentials
The only required environment variable is UNIONE_API_KEY (declared as primaryEnv). That is appropriate for an HTTP API integration. No unrelated secrets or multiple credentials are requested.
Persistence & Privilege
always: false (the skill is not forced into every agent run). disable-model-invocation is false (agent can call it autonomously), which is the platform default; this is acceptable here because the skill's scope and credential needs are narrow.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install unione-api-skill
  3. After installation, invoke the skill by name or use /unione-api-skill
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v0.1.2
unione-api-skill v0.1.2 - Documentation and metadata updates only. - README.md, SKILL.md, and manifest.json modified with no functional/API changes. - No code or API behavior changes in this release.
v0.1.1
- Added detailed documentation for UniOne Email API usage, including email sending, domain verification, DNS setup steps, and error handling. - Explained required authentication via UNIONE_API_KEY environment variable. - Included curl, Node.js, Python, and Go API usage examples for sending emails. - Documented critical domain setup instructions with step-by-step DNS setup and verification. - Clarified retry policies, error handling strategies, and idempotency for reliable production use. - Improved user onboarding guidance and explicitly outlined requirements for email deliverability.
Metadata
Slug unione-api-skill
Version 0.1.2
License
All-time Installs 0
Active Installs 0
Total Versions 2
Frequently Asked Questions

What is Unione - Email API?

Send transactional and marketing emails via UniOne Email API. Manage email templates, validate email addresses, check delivery statistics, manage suppression... It is an AI Agent Skill for Claude Code / OpenClaw, with 561 downloads so far.

How do I install Unione - Email API?

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

Is Unione - Email API free?

Yes, Unione - Email API is completely free (open-source). You can download, install and use it at no cost.

Which platforms does Unione - Email API support?

Unione - Email API is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Unione - Email API?

It is built and maintained by UniOne (@unione-repo); the current version is v0.1.2.

💬 Comments