unione
??ランザクションメールやマーケティングメールを送信し、テンプレート管理、アドレス検証、配信統計、抑制リスト、Webhook設定、ドメイン設定など、メール配信に関するあらゆる機能を一元的に管理するためのSkill。
📜 元の英語説明(参考)
Send transactional and marketing emails via UniOne Email API. Manage email templates, validate email addresses, check delivery statistics, manage suppression lists, configure webhooks, and handle domain settings. UniOne delivers billions of emails annually with 99.88% deliverability.
🇯🇵 日本人クリエイター向け解説
??ランザクションメールやマーケティングメールを送信し、テンプレート管理、アドレス検証、配信統計、抑制リスト、Webhook設定、ドメイン設定など、メール配信に関するあらゆる機能を一元的に管理するためのSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o unione.zip https://jpskill.com/download/5520.zip && unzip -o unione.zip && rm unione.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5520.zip -OutFile "$d\unione.zip"; Expand-Archive "$d\unione.zip" -DestinationPath $d -Force; ri "$d\unione.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
unione.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
unioneフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 2
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] unione
UniOne Email API
UniOne は、トランザクションメールとマーケティングメールを大規模に(最大 3,000 通/秒)送信するための Web API を備えたトランザクションメールサービスです。このスキルを使用すると、メールの送信、テンプレートの管理、アドレスの検証、配信の追跡などを行うことができます。
認証
すべてのリクエストには、UNIONE_API_KEY 環境変数が必要です。これを X-API-KEY ヘッダーとして渡してください。
ベース URL: https://api.unione.io/en/transactional/api/v1/{method}.json?platform=openclaw
すべてのメソッドは JSON ボディで POST を使用します。
重要: ドメイン設定(送信前に必須)
送信者のドメインが検証されるまで、メールは配信されません。 メールを送信する前に、ドメインが設定されていることを確認してください。
ステップ 1: DNS レコード値の取得 — 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 レスポンスは生の値(そのまま貼り付けられる DNS レコードではない)を返します。
{
"status": "success",
"domain": "yourdomain.com",
"verification-record": "unione-validate-hash=483bb362ebdbeedd755cfb1d4d661",
"dkim": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7"
}
ユーザーはこれらの値から 3 つの DNS TXT レコードを作成する必要があります。
| レコードホスト | レコードタイプ | 値 |
|---|---|---|
@ |
TXT | unione-validate-hash=<verification-record from response> |
us._domainkey |
TXT | k=rsa; p=<dkim from response> |
@ |
TXT | v=spf1 include:spf.unione.io ~all |
これら 3 つのレコードをユーザーに明確に提示し、DNS プロバイダー(Cloudflare、Route53、GoDaddy など)に追加するよう指示してください。SPF レコードは常に同じであり、API からは返されません。
ステップ 2: ドメイン所有権の検証 — domain/validate-verification.json
ユーザーが DNS レコードを追加した後:
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"}'
ステップ 3: 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"}'
ステップ 4: すべてのドメインをリスト表示 — 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 '{}'
ドメイン検証が失敗した場合: DNS の伝播には最大 48 時間かかることがあります。ユーザーに待ってから再試行するか、DNS レコードにタイプミスがないか確認するよう提案してください。
エラー処理と再試行ポリシー
再試行ロジック
API リクエストを行う際は、再試行可能なエラーに対して指数バックオフを実装してください。
再試行可能なエラー(指数バックオフで再試行する):
| HTTP コード | 意味 | 再試行戦略 |
|---|---|---|
| 429 | レート制限 | 待機後、再試行。Retry-After ヘッダーが存在する場合は尊重する |
| 500 | 内部サーバーエラー | 最大 3 回再試行 |
| 502 | 不正なゲートウェイ | 最大 3 回再試行 |
| 503 | サービス利用不可 | 最大 3 回再試行 |
| 504 | ゲートウェイタイムアウト | 最大 3 回再試行 |
推奨される再試行スケジュール:
| 試行回数 | 遅延 |
|---|---|
| 1 | 即時 |
| 2 | 1 秒 |
| 3 | 5 秒 |
| 4 | 30 秒 |
再試行不可能なエラー(再試行しない):
| HTTP コード | 意味 | アクション |
|---|---|---|
| 400 | 不正なリクエスト | リクエストパラメータを修正する |
| 401 | 未認証 | API キーを確認する |
| 403 | 禁止 | 権限 / ドメイン検証を確認する |
| 404 | エンドポイントが見つかりません | メソッドパスを確認する |
| 413 | ペイロードが大きすぎます | リクエストサイズを減らす |
冪等性
email/send.json の場合、再試行中の重複送信を防ぐために、常に idempotency_key を含めてください。これは本番システムにとって重要です。
idempotency_key は、リクエストボディで渡される一意の文字列(UUID を推奨)です。UniOne が同じキーを持つ 2 つのリクエストを受信した場合、2 番目のリクエストは別のメールを送信せずに最初の結果を返します。
論理的な送信操作ごとに常に一意の冪等性キーを生成し、同じ送信を再試行する際には同じキーを再利用してください。
1. メールを送信 — email/send.json
1 人以上の受信者にトランザクションメールまたはマーケティングメールを送信します。置換、テンプレート、添付ファイル、追跡、メタデータによるパーソナライズをサポートしています。
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": "recipient@example.com",
"substitutions": {
"to_name": "John Smith"
}
}
],
"body": {
"html": "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
"plaintext": "Hello, {{to_name}}! Your order has been confirmed."
},
"subject": "Order Confirmation",
"from_email": "noreply@yourdomain.com",
"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: "recipient@example.com", substitutions: { to_name: "John" } }],
body: {
html: "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
plaintext: "Hello, {{to_name}}! Your order has been confirmed."
},
sub 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
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=<verification-record from response> |
us._domainkey |
TXT | k=rsa; p=<dkim 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": "recipient@example.com",
"substitutions": {
"to_name": "John Smith"
}
}
],
"body": {
"html": "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
"plaintext": "Hello, {{to_name}}! Your order has been confirmed."
},
"subject": "Order Confirmation",
"from_email": "noreply@yourdomain.com",
"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: "recipient@example.com", substitutions: { to_name: "John" } }],
body: {
html: "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
plaintext: "Hello, {{to_name}}! Your order has been confirmed."
},
subject: "Order Confirmation",
from_email: "noreply@yourdomain.com",
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": "recipient@example.com", "substitutions": {"to_name": "John"}}],
"body": {
"html": "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
"plaintext": "Hello, {{to_name}}! Your order has been confirmed."
},
"subject": "Order Confirmation",
"from_email": "noreply@yourdomain.com",
"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": "recipient@example.com", "substitutions": map[string]string{"to_name": "John"}},
},
"body": map[string]string{
"html": "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
"plaintext": "Hello, {{to_name}}! Your order has been confirmed.",
},
"subject": "Order Confirmation",
"from_email": "noreply@yourdomain.com",
"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" => "recipient@example.com", "substitutions" => ["to_name" => "John"]]],
"body" => [
"html" => "<h1>Hello, {{to_name}}!</h1><p>Your order has been confirmed.</p>",
"plaintext" => "Hello, {{to_name}}! Your order has been confirmed."
],
"subject" => "Order Confirmation",
"from_email" => "noreply@yourdomain.com",
"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": ["recipient@example.com"]
}
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": "customer@example.com",
"substitutions": {
"to_name": "Alice",
"order_id": "ORD-12345",
"total": "$59.99"
}
}
],
"template_id": "your-template-id",
"from_email": "shop@yourdomain.com",
"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": "alice@example.com", "substitutions": {"to_name": "Alice"}},
{"email": "bob@example.com", "substitutions": {"to_name": "Bob"}}
],
"body": {
"html": "<p>Hi {{to_name}}, check out our new {{promo_name}}!</p>"
},
"subject": "Special offer for you, {{to_name}}!",
"from_email": "marketing@yourdomain.com",
"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": "user@example.com"}'
Response:
{
"status": "success",
"email": "user@example.com",
"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": "<h1>Thank you, {{to_name}}!</h1><p>Order {{order_id}} total: {{total}}</p>",
"plaintext": "Thank you, {{to_name}}! Order {{order_id}} total: {{total}}"
},
"from_email": "shop@yourdomain.com",
"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": "user@example.com", "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": "user@example.com"}'
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": "user@example.com"}'
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": "newsletter@yourdomain.com", "from_name": "Newsletter", "to_email": "newsubscriber@example.com"}'
Instructions for the Agent
- Domain setup is mandatory. Before the first send, always check if the user's domain is verified. Run
domain/list.jsonto check. If not verified, guide them through the domain setup process (Section: Domain Setup). - Always use
api.unione.ioas the API host for all requests. - 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. - Never modify or delete templates, webhooks, or suppressions without explicit user confirmation. Show what will be changed and wait for approval.
- Always include
idempotency_keyinemail/send.jsonrequests. Generate a UUID for each unique send. Reuse the same key when retrying. - Implement retry logic for 429 and 5xx errors with exponential backoff (see Error Handling section). Never retry 400, 401, 403, 404, 413 errors.
- For template operations, list available templates first before asking which one to use.
- For validation, report the result clearly and suggest action.
- Handle errors gracefully. If a request returns an error, explain what went wrong and suggest a fix.
- Remind users that the
from_emaildomain must be verified in their UniOne account. - Substitution syntax uses double curly braces:
{{variable_name}}. - Attachments must be base64-encoded. Help the user encode files if needed.
- 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.
- 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.
- 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.
- 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"
- Check domain verification (
domain/list.json) - If domain not verified, guide through domain setup
- Ask for recipient email address
- Compose a simple test message
- Confirm with user before sending
- Execute
email/send.jsonwithidempotency_key - Report the job_id on success
"Check my deliverability setup"
- Run
system/info.jsonto get account status - Run
domain/list.jsonto check domain verification - For each unverified domain, run
domain/get-dns-records.jsonand show required records - Run
domain/validate-dkim.jsonto check DKIM - Suggest fixes if domains are not fully verified
"Validate a list of emails"
- For each email, call
email-validation/single.json - Categorize results: valid, invalid, unknown
- Report summary
"Set up delivery tracking"
- Ask for webhook URL and events to track
- Execute
webhook/set.json - Confirm setup
Resources
- Full API Reference: https://docs.unione.io/en/web-api-ref
- Getting Started: https://docs.unione.io/en/
- Template Engines: https://docs.unione.io/en/web-api#section-template-engines
- Sign Up: https://cp.unione.io/en/user/registration/
同梱ファイル
※ ZIPに含まれるファイル一覧。`SKILL.md` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。
- 📄 SKILL.md (24,203 bytes)
- 📎 README.md (4,152 bytes)