۱. کلید API
در پنل: منو ← اتصالها و API ← کلیدها. کلید با up_live_ شروع میشود، فقط یک بار نمایش داده میشود و فقط مالک یا مدیر برند میتواند بسازد. هر کلید فقط یک برند را میبیند. کلید تازه فقط «خواندن» دارد؛ برای ساخت پیشنویس «ساخت پیشنویس» و برای تأیید و زمانبندی «انتشار» را هم روشن کنید.
- آدرس پایهٔ API
https://uttapost.ir/api/v1- آدرس MCP
https://uttapost.ir/api/mcp
کلید مثل رمز عبور است: در مخزن کد یا پیام نگذارید. هر کلید سقف خرج روزانه دارد و هر لحظه باطل میشود.
۲. n8n
دو الگوی آماده دارید. فایل نمونهٔ هر دو را یکجا دارد؛ دانلود کنید و در n8n با Import from File وارد کنید.
بعد کلید را در یک Credential از نوع Header Auth (نام Authorization، مقدار Bearer up_live_…) بگذارید.
الگوی الف: وقتی پستی منتشر شد (وبهوک)
- در پنل: «اتصالها و API ← وبهوکها»، آدرس https گرهٔ Webhook در n8n را بدهید و رویداد
post.publishedرا انتخاب کنید. secret را همان لحظه کپی کنید. - در n8n گرهٔ Webhook را روی روش POST و گزینهٔ Raw Body بگذارید (امضا روی بایتهای خام بدنه است).
- پشت آن یک گرهٔ Code بگذارید که هدر
X-UttaPost-Signatureرا بررسی کند (بلوک پایین؛ n8n نام هدر را با حروف کوچک میدهد). برایrequire('crypto')متغیرNODE_FUNCTION_ALLOW_BUILTIN=cryptoدر n8n لازم است. - بعدش هرچه میخواهید: پیام تلگرام، ردیف شیت، اعلان…
const crypto = require('crypto');
// rawBody: the exact bytes received (a Buffer or the raw string), never JSON.stringify(req.body).
function verifyUttaPost(secret, header, rawBody, toleranceSec = 300) {
const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || '');
if (!m) return false;
if (Math.abs(Date.now() / 1000 - Number(m[1])) > toleranceSec) return false;
const h = crypto.createHmac('sha256', secret);
h.update(m[1] + '.');
h.update(rawBody);
const expected = Buffer.from(h.digest('hex'));
const given = Buffer.from(m[2]);
return expected.length === given.length && crypto.timingSafeEqual(expected, given);
}
// In the Code node: read the secret from a credential or an n8n variable, not from the node text.
const header = $input.first().json.headers['x-uttapost-signature'];
const raw = await this.helpers.getBinaryDataBuffer(0, 'data');
if (!verifyUttaPost(YOUR_WEBHOOK_SECRET, header, raw)) {
throw new Error('invalid UttaPost signature');
}
return $input.all();رویدادهای قابل انتخاب: draft.created، approval.requested، post.published، post.failed، handoff.opened، credit.low، rule.paused
الگوی ب: زمانبندی ← ساخت ← تأیید
گرهٔ Schedule Trigger ← یک HTTP Request به POST https://uttapost.ir/api/v1/drafts/generate ← یک HTTP Request به POST https://uttapost.ir/api/v1/confirm. مرحلهٔ اول فقط قیمت و confirm_token برمیگرداند و پولی کم نمیشود؛ مرحلهٔ دوم هزینه را کم میکند.
# step 1: preview (JSON body), nothing is charged
POST https://uttapost.ir/api/v1/drafts/generate
{"item_ids": [12], "format": "post"}
# step 2: confirm (the token comes from step 1)
POST https://uttapost.ir/api/v1/confirm
{"confirm_token": "{{ $json.data.confirm_token }}"}میتوانید بین دو مرحله یک گرهٔ IF بگذارید: اگر data.cost از سقف شما بیشتر بود تأیید نکنید.
۳. Claude و MCP
یوتاپست یک سرور MCP دارد؛ با آن از Claude میگویید «آیتمهای من را نشان بده»، «یک پیشنویس بساز» یا «ترکیب هفتگی محتوا بچین». احراز هویت همان کلید API است.
Claude Code
claude mcp add --transport http uttapost https://uttapost.ir/api/mcp --header "Authorization: Bearer up_live_..."Claude Desktop
فایل claude_desktop_config.json را (از Settings ← Developer ← Edit Config) باز کنید، این بخش را اضافه کنید و برنامه را دوباره باز کنید. به Node.js نیاز دارد.
{
"mcpServers": {
"uttapost": {
"command": "npx",
"args": [
"mcp-remote",
"https://uttapost.ir/api/mcp",
"--transport",
"http-only",
"--header",
"Authorization:${UTTAPOST_AUTH}"
],
"env": {
"UTTAPOST_AUTH": "Bearer up_live_..."
}
}
}
}ابزارها
| ابزار | کار | دسترسی کلید |
|---|---|---|
list_items | فهرست آیتمهای کتابخانهٔ برند (محصول، خدمت، نمونهکار)؛ آیتمها مادهٔ ساخت پیشنویساند. | read |
get_kb | پایگاه دانش برند: آنچه هوش مصنوعی دربارهٔ کسبوکار میداند. | read |
list_topics | موضوعهای محتوای برند (منبع پستهای موضوعی و ترکیب محتوا) با شمار هر وضعیت. | read |
create_item | افزودن آیتم به کتابخانه (رایگان). تصویر از راه MCP نمیرود؛ تصویر را در پنل اضافه کنید. | draft |
generate_draft | پیشنمایش ساخت پیشنویس با هوش مصنوعی از آیتمها: قیمت و confirm_token برمیگرداند؛ تا confirm هزینهای کم نمیشود. · فقط پیشنمایش؛ اجرا با confirm | draft |
confirm | اجرای یکبارهٔ کاری که پیشنمایش شد؛ تنها ابزاری که اعتبار خرج میکند. سقف خرج روزانهٔ کلید و کیف پول دوباره بررسی میشود. | draft |
list_drafts | فهرست پیشنویسها بر اساس تب (در انتظار تأیید، زمانبندیشده، ردشده) با شمار هر تب. | read |
schedule_draft | تأیید و زمانبندی پیشنویس برای زمانی در آینده (ISO 8601). دسترسی «انتشار» و پلن فعال لازم است. | publish |
approve_draft | تأیید پیشنویس و انتشار آن در کانالهای دادهشده. انتشار عمومی است؛ دسترسی «انتشار» و پلن فعال لازم است. | publish |
list_channels | فهرست کانالهای وصلشدهٔ برند؛ شناسهٔ کانال را در approve_draft و schedule_draft بهعنوان channel_ids بدهید. | read |
list_posts | فهرست پستهای برند با وضعیت هر شبکه، ۱۵ مورد در هر صفحه. | read |
post_stats | آمار انتشار در N روز اخیر (۱ تا ۹۰): تعداد به تفکیک وضعیت و شبکه. | read |
wallet_balance | اعتبار برند به تومان (پلن، هدیه و شارژ) و فهرست قیمتهای لحظهای. | read |
list_rules | فهرست قانونهای خودکار برند (قانون هفتگی و ترکیب محتوا) با زمانبندی و وضعیت. | read |
create_mix_rule | پیشنمایش ترکیب هفتگی محتوا (مثلاً هر هفته یک نمونهکار و دو پست مرتبط)؛ تا confirm چیزی ساخته نمیشود. · فقط پیشنمایش؛ اجرا با confirm | publish |
ask_assistant | پرسش از دستیار هوشمند برند یا درخواست انجام کار؛ اگر کاری پیشنهاد کند کارت با confirm_token میآید و تا confirm چیزی اجرا نمیشود. | draft |
generate_ai_video | پیشنمایش ویدیوی کامل با هوش مصنوعی (۴، ۸ یا ۱۲ ثانیه)؛ قیمت از ریلز بسیار بیشتر است و تا confirm چیزی کم یا شروع نمیشود. · فقط پیشنمایش؛ اجرا با confirm | draft |
ابزارهایی که کلید شما اجازهشان را ندارد در فهرست نمیآیند. generate_ai_video فقط وقتی محصول ویدیو روشن است دیده میشود.
اعتبار فقط با ابزار confirm خرج میشود: ابزارهای ساخت اول قیمت و confirm_token میدهند (یکبار مصرف، ۳۰ دقیقه). سقف خرج روزانهٔ کلید و کیف پول هنگام تأیید دوباره بررسی میشود.
۴. محصول خودتان (مثال UttaLine)
اگر محصول دیگری دارید، مثلاً UttaLine که بعد از هر تماس خلاصهای دارد، همان API را از سرور خودتان صدا بزنید: آیتم بسازید، پیشنمایش بگیرید، و فقط وقتی هزینه قابلقبول بود تأیید کنید. نمونه (Laravel):
use Illuminate\Support\Facades\Http;
$api = Http::baseUrl('https://uttapost.ir/api/v1')
->withToken(config('services.uttapost.key')) // up_live_..., kept in .env, never in the repo
->acceptJson()->timeout(15);
// 1. the finished call becomes a library item (scope: draft). A post is built on a photo, so send it as multipart images[]:
// an item without a photo is refused at the preview (nothing is charged)
$item = $api->attach('images[]', file_get_contents($photoPath), 'work.jpg')
->post('items', ['title' => $summary->title, 'description' => $summary->text])->throw()->json('data');
// 2. preview a draft: nothing is charged yet
$preview = $api->post('drafts/generate', ['item_ids' => [$item['id']], 'format' => 'post'])->throw()->json('data');
// $preview['cost'] is in toman; show it, or compare it with your own limit
// 3. confirm only when it is fine (single use, 30 minutes, capped per key per day)
$api->post('confirm', ['confirm_token' => $preview['confirm_token']])->throw();برای خبر گرفتن از نتیجه (پیشنویس ساخته شد، پست منتشر شد) یک وبهوک بسازید و امضا را مثل بخش n8n بررسی کنید.
۵. محدودیتها و صداقت
- اتصالدهندههای وب claude.ai (Custom Connectors) به OAuth نیاز دارند و در این نسخه پشتیبانی نمیشوند. Claude Code و Claude Desktop (با
mcp-remote) با کلید کار میکنند. - دسترسی از خارج ایران: سرور یوتاپست در ایران است؛ بعضی کلاینتهای خارجی ممکن است نتوانند به آن برسند. اگر وصل نشد، کلاینت را روی دستگاه یا سرور داخل ایران اجرا کنید.
- هر درخواست MCP یک پیام است (بدون دستهای و بدون پخش زنده)، و سرور وضعیتی نگه نمیدارد.
- نرخ و خطاها مثل API هستند: خطاها و سقفها.