دبیر کلودمستندات برنامه‌نویسان ورود به پنل

API دبیر کلود

با چند درخواست HTTP، مقاله‌ی کامل و سئوشده (با تصویر، FAQ و اسکیمای آن) بسازید و مستقیم در سایت‌تان منتشر کنید. همه‌ی پاسخ‌ها JSON هستند.

آدرس پایهhttps://cloud.ali-programmer.ir/api/v1

شروع سریع

  1. در پنل پروژه بسازید (یا با API) و توکن پروژه را بردارید.
  2. مقاله سفارش بدهید؛ پاسخ فوری است و نوشتن در صف انجام می‌شود (۱ تا ۴ دقیقه).
  3. نتیجه را با Webhook دریافت کنید، یا وضعیت را بخوانید، یا با رابط دبیر مستقیم در سایت منتشر کنید.
bash
                        curl -X POST {{BASE}}/articles \
                        -H "Authorization: Bearer dbc_YOUR_TOKEN" \
                        -H "Content-Type: application/json" \
                        -d '{"title":"گاندولا چیست و چه کاربردی دارد؟","keyword":"گاندولا","with_images":true}'

                        curl {{BASE}}/articles/42 -H "Authorization: Bearer dbc_YOUR_TOKEN"
                    

احراز هویت و محدودیت‌ها

همه‌ی درخواست‌ها (جز ساخت پروژه) هدر زیر را لازم دارند. توکن با dbc_ شروع می‌شود و فقط یک بار، هنگام ساخت پروژه یا «ساخت توکن جدید»، نمایش داده می‌شود.

http
Authorization: Bearer dbc_YOUR_TOKEN
Accept: application/json
محدودیت مقدار
درخواست‌های API ۶۰ در دقیقه برای هر IP
پیشنهاد موضوع ۱۰ در دقیقه
ساخت پروژه ۵ در دقیقه
توکن نامعتبر ۲۰ تلاش ناموفق = ۱۵ دقیقه مسدود (پاسخ 429)
نوشتن مقاله به اندازه‌ی «حداکثر مقاله در دقیقه» در تنظیمات پروژه

خطاها

کد یعنی
401 توکن نیست یا نامعتبر است (code: unauthorized).
403 پروژه معلق است (code: suspended).
404 مقاله پیدا نشد (یا مال پروژه‌ی شما نیست).
422 ورودی نامعتبر؛ جزئیات در errors. یا عملیات در این وضعیت مجاز نیست (پیام در message).
429 درخواست بیش از حد؛ کمی بعد دوباره تلاش کنید.
json
                        {
                        "message": "The title field is required.",
                        "errors": { "title": ["The title field is required."] }
                        }
                    

ساخت پروژه

/projectsPOST

بدون توکن. هر لایسنس دبیر کلود فقط برای یک پروژه (یک دامنه) است و پیش از ساخت، روی سرور لایسنس بررسی می‌شود. دامنه بعداً قابل تغییر نیست.

فیلد توضیح
name الزامی نام پروژه
domain الزامی دامنه‌ی سایت، مثل example.com
license_key الزامی لایسنس دبیر کلود
liara_api_key الزامی کلید API هوش مصنوعی لیارا
liara_workspace_id الزامی شناسه‌ی Workspace لیارا
text_model، image_model اختیاری مدل‌های لیارا
output_mode اختیاری rich (حرفه‌ای دبیر) ، theme (پیروی از قالب سایت) ، sample (مطابق مقاله‌ی نمونه‌ی سایت)
webhook_url اختیاری فقط روی دامنه‌ی خود پروژه
json — 201
                        {
                        "success": true,
                        "project_id": 7,
                        "api_token": "dbc_…",
                        "webhook_secret": "whsec_…"
                        }
                    
api_token و webhook_secret فقط همین یک بار برگردانده می‌شوند.

اطلاعات پروژه

/projectGET

نام، دامنه، مدل متن، قالب خروجی، webhook و خطای لایسنس (اگر باشد).

سفارش مقاله

/articlesPOST

پاسخ 202 و شیء مقاله با وضعیت queued است. سه نوع کار دارید:

type کار نیاز
article (پیش‌فرض) مقاله‌ی جدید از صفر —
rewrite نسخه‌ی تازه و یونیک از یک مقاله‌ی دیگر source_url
refresh_light / refresh_full به‌روزرسانی سبک یا بازنویسی کامل مقاله‌ی قدیمی current_content یا source_url یا remote_post_id

فیلدها

فیلد توضیح
title الزامی عنوان (حداکثر ۲۵۵)
keyword الزامی کلیدواژه‌ی اصلی
keywords_secondary کلیدواژه‌های فرعی، جداشده با کاما
tone formal (رسمی و آکادمیک) ، professional (حرفه‌ای و تخصصی) ، conversational (محاوره‌ای و ساده) ، friendly (دوستانه و صمیمی)
word_count ۳۰۰ تا ۴۰۰۰ (پیش‌فرض ۱۰۰۰)
meta_description متای دلخواه (خالی = دبیر می‌نویسد)
instructions توضیح برای نویسنده (حداکثر ۲۰۰۰)
internal_links / external_links هر خط یک لینک. اگر internal_links خالی باشد، دبیر از مطالب خود سایت لینک می‌دهد.
with_images true = ساخت تصویر (اولی تصویر شاخص است)
image_count ۱ تا ۴ (خالی = خودکار بر اساس طول)
image_style flat_illustration ، editorial_photo ، product_photo ، industrial ، isometric ، 3d_render ، line_art ، watercolor
image_size 1024x1024 ، 1536x1024 ، 1024x1536
output_mode rich ، theme ، sample
publish_at زمان تحویل، ISO 8601 با منطقه‌ی زمانی، مثل 2026-10-25T09:00:00+03:30. مقاله زودتر نوشته می‌شود و سر همین زمان به webhook/سایت می‌رسد.
source_url برای rewrite و refresh. آدرس‌های داخلی شبکه پذیرفته نمی‌شوند.
current_content HTML یا متن مقاله‌ی قدیمی (refresh)
remote_post_id شناسه‌ی پست در سایت شما (refresh از طریق رابط دبیر)
json
                        {
                        "type": "article",
                        "title": "راهنمای کامل خرید قفسه‌ی فروشگاهی",
                        "keyword": "قفسه فروشگاهی",
                        "tone": "professional",
                        "word_count": 1500,
                        "with_images": true,
                        "image_style": "product_photo",
                        "image_size": "1536x1024",
                        "publish_at": "2026-10-25T09:00:00+03:30"
                        }
                    

شیء مقاله

status یعنی
queued در صف
processing در حال نوشتن
review نوشته شده، منتظر تأیید (اگر «تأیید دستی» روشن باشد)
done آماده
failed ناموفق؛ علت در error

article فقط در وضعیت review و done پر است:

json
                        {
                        "data": {
                        "id": 42,
                        "type": "article",
                        "status": "done",
                        "title": "…",
                        "keyword": "…",
                        "source_url": null,
                        "error": null,
                        "tokens": 2913,
                        "generated_at": "2026-10-19T08:21:00+00:00",
                        "publish_at": null,
                        "delivered_at": "2026-10-19T08:21:05+00:00",
                        "remote_post_id": "131",
                        "remote_url": "https://example.com/blog/…",
                        "created_at": "…",
                        "article": {
                        "content": "<h2>…</h2>… (with visible FAQ)",
                        "content_without_faq": "… (if your theme renders faq itself)",
                        "css": "… (rich output only)",
                        "html": "<style>…</style> + content — ready to paste",
                        "output_mode": "rich",
                        "faq_schema": "<script type=\"application/ld+json\">…</script>",
                        "meta_description": "…",
                        "slug": "…",
                        "category": "…",
                        "faq": [{ "question": "…", "answer": "…" }],
                        "featured_image": { "url": "https://…/media/…webp", "alt": "…" },
                        "images": [{ "url": "…", "alt": "…" }]
                        }
                        }
                        }
                    
faq_schema را در <head> صفحه‌ی مقاله بگذارید. تصاویر روی سرور دبیر کلود هستند؛ بهتر است آن‌ها را در سایت خودتان کپی کنید (رابط دبیر این کار را خودکار انجام می‌دهد).

فهرست و دریافت مقاله

/articles?status=done&since=2026-10-18T00:00:00Z&per_page=20GET

صفحه‌بندی‌شده، جدیدترین اول. status یکی از وضعیت‌ها؛ since = تغییرکرده از این زمان؛ per_page تا ۵۰.

/articles/{id}GET

یک مقاله. اگر Webhook ندارید، هر ۳۰ ثانیه تا چند دقیقه وضعیت را بخوانید.

تأیید، تلاش دوباره، حذف

/articles/{id}/approvePOST

فقط برای review؛ مقاله done می‌شود و تحویل (webhook / سایت) انجام می‌شود.

/articles/{id}/retryPOST

فقط برای failed؛ دوباره در صف می‌رود.

/articles/{id}DELETE

مقاله و تصاویرش حذف می‌شوند. مقاله‌ی در حال نوشتن قابل حذف نیست.

آمار مصرف

/usageGET
json
                        { "success": true, "usage": { "total": 24, "done": 15, "review": 3, "pending": 2, "failed": 4,
                        "tokens": 70210, "tokens_this_month": 21900 } }
                    

پیشنهاد موضوع

/suggestionsPOST

همزمان است (۱۰ تا ۴۰ ثانیه). ورودی: {"topic": "قفسه فروشگاهی"}

json
                        { "success": true, "titles": ["…", "…", "…"] }
                    

Webhook

اگر آدرس Webhook در تنظیمات پروژه باشد (فقط روی دامنه‌ی خود پروژه)، دبیر کلود یک POST با بدنه‌ی JSON می‌فرستد:

رویداد کی
article.completed مقاله آماده شد (بعد از تأیید دستی، و در صورت زمان‌بندی، سر زمان publish_at)
article.failed نوشتن ناموفق شد
http
                        POST /your-webhook
                        Content-Type: application/json
                        X-Dabir-Event: article.completed
                        X-Dabir-Timestamp: 1760862000
                        X-Dabir-Signature: sha256=5f1c…

                        {"event":"article.completed","data":{ …article object… }}
                    

امضا: HMAC-SHA256("{timestamp}.{body}", webhook_secret). همیشه امضا و تازگی (حداکثر ۵ دقیقه) را بررسی کنید. پاسخ غیر 2xx تا ۵ بار با فاصله‌ی ۱، ۵، ۱۵ و ۶۰ دقیقه تکرار می‌شود؛ پس دریافت را idempotent بنویسید (بر اساس data.id).

PHP

php
                        $secret = getenv('DABIR_WEBHOOK_SECRET');
                        $body   = file_get_contents('php://input');
                        $ts     = $_SERVER['HTTP_X_DABIR_TIMESTAMP'] ?? '';
                        $sig    = $_SERVER['HTTP_X_DABIR_SIGNATURE'] ?? '';

                        $expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
                        if (!ctype_digit($ts) || abs(time() - (int)$ts) > 300 || !hash_equals($expected, $sig)) {
                        http_response_code(401);
                        exit;
                        }

                        $payload = json_decode($body, true);
                        if ($payload['event'] === 'article.completed') {
                        $article = $payload['data']['article'];
                        // save $payload['data']['title'], $article['content'], $article['meta_description'] …
                        }
                        http_response_code(200);
                    

Node.js

js
                        import crypto from 'node:crypto';

                        // use the RAW body (express.raw({ type: 'application/json' }))
                        function verify(rawBody, ts, sig, secret) {
                        const expected = 'sha256=' + crypto.createHmac('sha256',
                        secret).update(`${ts}.${rawBody}`).digest('hex');
                        const fresh = Math.abs(Date.now() / 1000 - Number(ts)) <= 300;
                        return fresh && sig.length === expected.length &&
                        crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
                        }
                    

رابط دبیر (انتشار مستقیم در سایت)

به جای نوشتن کد Webhook، رابط دبیر را روی سایت نصب کنید تا دبیر کلود خودش مقاله را (با تصویر شاخص، دسته، متا و FAQ) در بلاگ ثبت کند، پست‌ها و دسته‌های واقعی سایت را برای لینک‌سازی و جلوگیری از مقاله‌ی تکراری بخواند و پست‌های قدیمی را به‌روز کند.

راه‌اندازی

  1. پنل ← تنظیمات ← «انتشار مستقیم در سایت» ← روشن ← ذخیره؛ کلید رابط ساخته می‌شود.
  2. کلید را روی سایت بگذارید (DABIR_CONNECTOR_SECRET در .env، یا CONFIG فایل PHP).
  3. آدرس رابط: لاراول https://your-site.com/dabir-connector / فایل PHP https://your-site.com/dabir-connector.php
  4. «تست اتصال» را بزنید.

پروتکل

درخواست کار
GET /ping سلامت و نسخه
GET /site نام سایت، دسته‌ها، ۳۰۰ پست آخر
POST /posts ساخت پست (پاسخ 201 با id، url، status)
GET /posts/{id} متن یک پست (برای به‌روزرسانی)
PUT /posts/{id} جایگزینی متن، متا و FAQ پست

هر درخواست امضا دارد: X-Dabir-Signature: sha256=HMAC("{timestamp}.{METHOD}.{path}.{body}", secret) و X-Dabir-Timestamp. رابط درخواستِ بدون امضای درست یا قدیمی‌تر از ۵ دقیقه را با 401 رد می‌کند، تصاویر را فقط با HTTPS از دامنه‌ی دبیر کلود دانلود و بررسی می‌کند، و تا کلید تنظیم نشده اصلاً فعال نیست.

نکات امنیتی

  • توکن API مثل رمز است: فقط سمت سرور نگه دارید، هرگز در جاوااسکریپت مرورگر یا مخزن کد. اگر لو رفت، از پنل «ساخت توکن جدید» بزنید.
  • امضای Webhook و زمان آن را همیشه بررسی کنید؛ بدون بررسی، هر کسی می‌تواند به آدرس شما مقاله‌ی جعلی بفرستد.
  • Webhook، رابط، نقشه‌ی سایت و مقاله‌ی نمونه فقط روی دامنه‌ی خود پروژه پذیرفته می‌شوند و آدرس‌هایی که به شبکه‌ی داخلی اشاره کنند رد می‌شوند.
  • ورودها، تغییر تنظیمات و ساخت توکن در «فعالیت‌های اخیر» پنل ثبت می‌شوند؛ اگر موردی را نمی‌شناسید، فوراً توکن را عوض کنید.