ملی ای‌پی‌آی

مستندات API

یک کلید و یک کیف پول برای همهٔ سرویس‌ها: استعلام، هوش مصنوعی و پیامک. آنچه در ادامه آمده توصیف رفتار واقعی سامانه است، نه فهرست وعده‌ها.

قیمت هر سرویس در تعرفهٔ API آمده است.

همین حالا شروع کنید

حساب کسب‌وکار بی‌درنگ ساخته می‌شود، کلید را خودتان می‌سازید و پنل را آنلاین شارژ می‌کنید. هیچ مرحلهٔ دستی و هیچ انتظاری برای تأیید در کار نیست.

ساخت حساب کسب‌وکار

سند OpenAPI OAS 3.0.3

فایل را در Postman یا Swagger وارد کنید، یا از رویش کلاینت تولید کنید. ⚠️ سند در لحظهٔ دانلود ساخته می‌شود، پس فهرست سرویس‌ها و قیمت‌ها همانی است که همان لحظه فعال است.

دانلود سند OpenAPI

برای چه کسی

برای کسب‌وکارهایی که می‌خواهند استعلام، هوش مصنوعی یا پیامک تأیید را داخل محصول خودشان داشته باشند. مثلاً تطبیق کد ملی با شمارهٔ موبایل در لحظهٔ ثبت‌نام، خلاصه‌کردن تیکت با یک مدل زبانی، یا فرستادن کد ورود. همه با یک کلید و یک موجودی.

حساب کسب‌وکار را خودتان در پنل می‌سازید، بی‌درنگ و بدون تأیید دستی، و کلید را هم خودتان می‌سازید و می‌چرخانید.

شروع در سه گام

  1. با شمارهٔ موبایل وارد می‌شوید و در پنل کسب‌وکار نام کسب‌وکار را ثبت می‌کنید. حساب همان لحظه ساخته می‌شود.
  2. پنل را از همان صفحه شارژ می‌کنید، کمترین مبلغ ۵۰۰٬۰۰۰ تومان، و کلید می‌سازید. متن کلید فقط یک بار نشان داده می‌شود.
  3. کلید را در هدر می‌گذارید و فراخوان می‌زنید.

احراز هویت

کلید را در یکی از این دو هدر بفرستید، هر دو پذیرفته می‌شوند:

Authorization: Bearer melli_live_…
# یا
X-API-Key: melli_live_…

⚠️ کلید را هرگز در کد سمت مرورگر نگذارید. هر کسی که کلید را ببیند می‌تواند از موجودی شما خرج کند. اگر نشت کرد، از پنل باطلش کنید؛ ابطال بی‌درنگ اثر می‌کند.

اگر IP سرورتان ثابت است، هنگام ساخت کلید فهرست IP مجاز را پر کنید. خالی‌گذاشتنش یعنی کلید از هر جای دنیا کار می‌کند.

API استعلام

استعلام‌های هویتی، بانکی، چک، خودرو، قبوض و شرکت‌ها. هر سرویس یک نشانی دارد و فقط POST می‌پذیرد.

نشانی و قالب درخواست

هر سرویس یک نشانی دارد و فقط POST می‌پذیرد. ورودی این سرویس‌ها کد ملی و شمارهٔ کارت است؛ فرستادنش در نشانی یعنی نشستنش در لاگ سرور، تاریخچهٔ مرورگر و هدر Referer، پس GET عمداً پشتیبانی نمی‌شود.

POST https://melliapi.net/api/v1/{slug}/
Content-Type: application/json

اسلش پایانی را بگذارید. شکل بدون اسلش هم کار می‌کند، ولی شکل بالا شکل قطعی است و هیچ هدایتی نمی‌گیرد، و بعضی کتابخانه‌ها بدنهٔ POST را پس از هدایت دوباره نمی‌فرستند.

پاسخ موفق

{
  "ok": true,
  "requestId": "req_1a2b3c…",
  "service": "sana-inquiry",
  "data": { … },
  "source": { "cached": false, "stale": false, "fetchedAt": "2026-09-23T10:00:00.000Z" },
  "billing": { "amountRial": 51000, "balanceRial": 9949000 }
}
  • data، پاسخ سرویس مرجع، بدون دست‌کاری.
  • source.cached، پاسخ از کش آمد یا از سرویس مرجع. stale یعنی سرویس مرجع در دسترس نبود و آخرین پاسخ معتبر برگردانده شد؛ fetchedAt می‌گوید مال چه زمانی است.
  • billing.amountRial، همان مبلغی که همین حالا کسر شد. صفر یعنی رایگان بود.
  • requestId، برای پیگیری در پشتیبانی. نگهش دارید.

خطاهای استعلام

هر پاسخ ناموفق همین شکل را دارد و error.code ماشین‌خوان است. به کد تکیه کنید و نه به متن پیام؛ متن ممکن است بهتر شود.

{ "ok": false, "requestId": "req_…", "error": { "code": "insufficient_funds", "message": "…" } }
کدHTTPیعنیهزینه
unauthorized۴۰۱کلید نیست، غلط است یا باطل شدهندارد
ip_not_allowed۴۰۳IP شما در فهرست مجاز کلید نیستندارد
organization_inactive۴۰۳حساب کسب‌وکار فعال نیستندارد
service_not_granted۴۰۳این سرویس برای شما باز نشدهندارد
service_not_enabled۴۰۳این سرویس فعلاً از API ارائه نمی‌شودندارد
unknown_service۴۰۴چنین slugی وجود نداردندارد
async_not_supported۵۰۱این سرویس چندمرحله‌ای است و از API ارائه نمی‌شودندارد
invalid_json۴۰۰بدنهٔ درخواست JSON معتبر نیستندارد
method_not_allowed۴۰۵فقط POST پذیرفته می‌شودندارد
invalid_input۴۰۰فیلدها ناقص یا نامعتبرند، جزئیات در fieldsندارد
insufficient_funds۴۰۲موجودی کافی نیستندارد
rate_limited۴۲۹از سقف نرخ گذشتید، Retry-After را ببینیدندارد
not_found۲۰۰استعلام انجام شد و رکوردی نبوددارد
provider_failed۵۰۲سرویس مرجع پاسخ قطعی منفی داد، تکرارش همان جواب را می‌دهددارد
provider_failed_retryable۵۰۲خطای گذرای سرویس مرجع، دوباره تلاش کنیدندارد
not_inquirable۴۲۲سامانهٔ مرجع استعلام همین مورد را نمی‌پذیرد، مثلاً «استعلام این کارت امکان‌پذیر نیست.»؛ تکرارش بی‌فایده استندارد
temporarily_unavailable۵۰۳سرویس مرجع در دسترس نبود، بعداً تلاش کنیدندارد
api_disabled۵۰۳ارائهٔ API موقتاً خاموش استندارد
no_tariff۵۰۳تعرفهٔ این سرویس تعیین نشدهندارد
internal_error۵۰۰خطای داخلی ما، با requestId به پشتیبانی بگوییدندارد

⚠️ not_found با HTTP ۲۰۰ برمی‌گردد و ok:false دارد. «رکوردی نیست» یک پاسخ معتبر است که ما بابتش به سرویس مرجع پول داده‌ایم، پس هزینه دارد، ولی ۴۰۴ نمی‌دهیم چون با «چنین سرویسی نداریم» قاطی می‌شود.

هر پاسخی که به مرحلهٔ تسویه رسیده باشد، چه موفق چه ناموفق، فیلد billing دارد و می‌گوید همین حالا چقدر کسر شد و موجودی‌تان چقدر مانده. نبودنِ این فیلد یعنی هیچ مبلغی جابه‌جا نشده؛ پس برای تطبیق حساب لازم نیست حدس بزنید.

نمونهٔ کد استعلام

curl

curl -X POST 'https://melliapi.net/api/v1/sana-inquiry/' \
  -H 'Authorization: Bearer melli_live_…' \
  -H 'Content-Type: application/json' \
  -d '{"nationalCode":"0013542419","mobile":"09120000000"}'

PHP / وردپرس

$response = wp_remote_post( 'https://melliapi.net/api/v1/sana-inquiry/', array(
    'timeout' => 30,
    'headers' => array(
        'Authorization' => 'Bearer ' . MELLIAPI_API_KEY,
        'Content-Type'  => 'application/json',
    ),
    'body' => wp_json_encode( array(
        'nationalCode' => $national_code,
        'mobile'       => $mobile,
    ) ),
) );

if ( is_wp_error( $response ) ) {
    // شبکه قطع بود، دوباره تلاش کنید.
    return;
}

$body = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! empty( $body['ok'] ) ) {
    // $body['data'] پاسخ استعلام است.
}

Node.js

const response = await fetch('https://melliapi.net/api/v1/sana-inquiry/', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.MELLIAPI_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ nationalCode, mobile }),
});

const body = await response.json();
if (body.ok) {
  // body.data
}

Python

import os, requests

response = requests.post(
    "https://melliapi.net/api/v1/sana-inquiry/",
    headers={"Authorization": f"Bearer {os.environ['MELLIAPI_API_KEY']}"},
    json={"nationalCode": national_code, "mobile": mobile},
    timeout=30,
)
body = response.json()
if body.get("ok"):
    data = body["data"]

⚠️ مهلت (timeout) را دست‌کم ۳۰ ثانیه بگذارید. برخی سرویس‌های مرجع کند پاسخ می‌دهند و مهلت کوتاه یعنی شما پاسخ را نمی‌بینید در حالی که صورتحسابش صادر شده.

سرویس‌ها و ورودی‌هایشان

سرویسslugورودیهر فراخوان
استعلام شماره شباiban-inquiryiban, شباIR و ۲۴ رقم، بی فاصله.۸۰۰ تومان
استعلام نام صاحب کارتcard-inquirycardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.۸۰۰ تومان
استعلام چک برگشتیbounced-checknationalCode, کد ملیده رقم، با رقم کنترل معتبر.nationalityType, نوع تابعیت (اختیاری)1 یا 2؛ اگر نفرستید، 1.۱۴٬۰۰۰ تومان
استعلام چک صیادیsayad-checksayadId, شناسهٔ صیادشانزده رقم.۱۰٬۴۰۰ تومان
تبدیل حساب به شباaccount-to-ibanbankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همان‌طور بفرستید.bank, بانکشناسهٔ لاتین بانک از جدول «کد بانک‌ها»، مثل mellat. کد سه‌رقمی بانک در شبا (مثل 012) هم پذیرفته می‌شود.جدول کد بانک‌ها۸۰۰ تومان
تبدیل کارت به حسابcard-to-accountcardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.۸۰۰ تومان
تبدیل کارت به شباcard-to-ibancardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.۱٬۱۰۰ تومان
تطابق شبا و نامiban-name-matchiban, شباIR و ۲۴ رقم، بی فاصله.name, نامنام و نام خانوادگی به فارسی، دست‌کم سه حرف.۸۰۰ تومان
تطابق شماره حساب و نامaccount-name-matchbank, بانکشناسهٔ لاتین بانک از جدول «کد بانک‌ها»، مثل mellat. کد سه‌رقمی بانک در شبا (مثل 012) هم پذیرفته می‌شود.جدول کد بانک‌هاbankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همان‌طور بفرستید.name, نامنام و نام خانوادگی به فارسی، دست‌کم سه حرف.۸۰۰ تومان
تطابق کارت و نامcard-name-matchcardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.name, نامنام و نام خانوادگی به فارسی، دست‌کم سه حرف.۸۰۰ تومان
زنجیره انتقالات چک صیادیsayad-chainsayadId, شناسهٔ صیادشانزده رقم.nationalCode, کد ملی یا شناسهٔ ملی صادرکنندهٔ چکشخص حقیقی: کد ملی ده‌رقمی. شخص حقوقی: شناسهٔ ملی یازده‌رقمی شرکت.chequeType, نوع چک (اختیاری)اگر نفرستید، 1.۴٬۷۰۰ تومان
استعلام قبض آبbill-waterbillId, شناسهٔ قبضشش تا سیزده رقم.۵۰۰ تومان
استعلام قبض ایرانسلbill-irancellmobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.۵۰۰ تومان
استعلام قبض برقbill-electricitybillId, شناسهٔ قبضشش تا سیزده رقم.۵۰۰ تومان
استعلام قبض تلفن ثابتbill-landlinephoneNumber, شماره تلفن ثابتشمارهٔ تلفن ثابت با کد شهر، یازده رقم، مثل 02188776655.۵۰۰ تومان
استعلام قبض رایتلbill-rightelmobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.۵۰۰ تومان
استعلام قبض همراه اولbill-mcimobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.۵۰۰ تومان
استعلام قبض گازbill-gasbillId, شناسهٔ قبضشش تا سیزده رقم.۵۰۰ تومان
استعلام اطلاعات شرکتcompany-inquirycompanyNationalId, شناسهٔ ملی شخص حقوقییازده رقم.۷٬۷۰۰ تومان
استعلام اطلاعات صنفguild-inquiryguildCode, شناسهٔ صنفیده رقم.۱۰٬۸۰۰ تومان
استعلام اینمادenamadwebsite, نشانی وبگاهنام دامنه، مثل example.com؛ https:// و www. خودکار حذف می‌شوند.۶٬۲۰۰ تومان
اعضای هیئت‌مدیرهboard-memberscompanyNationalId, شناسهٔ ملی شخص حقوقییازده رقم.۷٬۷۰۰ تومان
تاریخچه هیئت‌مدیرهboard-members-historycompanyNationalId, شناسهٔ ملی شخص حقوقییازده رقم.۱۴٬۰۰۰ تومان
استعلام اطلاعات هویتیnational-id-inquirynationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته می‌شوند.۷٬۰۰۰ تومان
استعلام شاهکارshahkarnationalCode, کد ملیده رقم، با رقم کنترل معتبر.mobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.۱٬۵۰۰ تومان
تطابق درصدی اطلاعات هویتیidentity-similaritynationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته می‌شوند.name, نامنام و نام خانوادگی به فارسی، دست‌کم سه حرف.fatherName, نام پدراختیاری؛ نام پدر به فارسی.۷٬۰۰۰ تومان
تطابق کد ملی و شباiban-national-id-matchnationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته می‌شوند.iban, شباIR و ۲۴ رقم، بی فاصله.۳٬۲۰۰ تومان
تطابق کد ملی و شماره حسابaccount-national-id-matchnationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته می‌شوند.bank, بانکشناسهٔ لاتین بانک از جدول «کد بانک‌ها»، مثل mellat. کد سه‌رقمی بانک در شبا (مثل 012) هم پذیرفته می‌شود.جدول کد بانک‌هاbankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همان‌طور بفرستید.۳٬۲۰۰ تومان
تطابق کد ملی و کارتcard-national-id-matchnationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته می‌شوند.cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.۳٬۲۰۰ تومان
تبدیل فارسی به فینگلیشpersian-to-finglishpersianText, متن فارسیدو تا دویست نویسه.۹۰۰ تومان
تبدیل کد پستی به آدرسaddress-lookuppostalCode, کد پستیده رقم.۳٬۹۰۰ تومان
مختصات جغرافیایی کد پستیpostal-code-geopostalCode, کد پستیده رقم.۷٬۷۰۰ تومان
استعلام خلافی خودروvehicle-finesplate.left2, پلاک، دو رقم اولدو رقم.plate.letter, پلاک، حرفیک حرف فارسی از فهرست.یکی از: الف، ب، پ، ت، ث، ج، د، ز، س، ش، ص، ط، ع، ف، ق، ک، گ، ل، م، ن، و، ه، ی، ژplate.right3, پلاک، سه رقم میانیسه رقم.plate.iran2, پلاک، کد استان (ایران)دو رقم، از 10 تا 99.nationalCode, کد ملیده رقم، با رقم کنترل معتبر.mobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.{"plate":{"left2":"12","letter":"ب","right3":"345","iran2":"67"},"nationalCode":"0013542419","mobile":"09120000000"}۳۲٬۴۰۰ تومان
خلافی خودرو با جزئیاتvehicle-fines-detailsplate.left2, پلاک، دو رقم اولدو رقم.plate.letter, پلاک، حرفیک حرف فارسی از فهرست.یکی از: الف، ب، پ، ت، ث، ج، د، ز، س، ش، ص، ط، ع، ف، ق، ک، گ، ل، م، ن، و، ه، ی، ژplate.right3, پلاک، سه رقم میانیسه رقم.plate.iran2, پلاک، کد استان (ایران)دو رقم، از 10 تا 99.nationalCode, کد ملیده رقم، با رقم کنترل معتبر.mobile, شمارهٔ موبایلیازده رقم که با 09 شروع می‌شود.{"plate":{"left2":"12","letter":"ب","right3":"345","iran2":"67"},"nationalCode":"0013542419","mobile":"09120000000"}۳۲٬۴۰۰ تومان

قیمت‌های بالا همان چیزی است که در لحظهٔ فراخوان کسر می‌شود. تعرفهٔ اختصاصی سازمان شما، اگر داشته باشید، در پنل کسب‌وکار دیده می‌شود و بر این جدول اولویت دارد.

کد بانک‌ها

در فیلد bank شناسهٔ لاتین بانک را بفرستید. کد سه‌رقمی بانک در شبا هم پذیرفته می‌شود.

بانکbankکد در شبا
آیندهayandeh062
اقتصاد نوینeghtesad-novin055
ایران زمینiran-zamin069
پارسیانparsian054
پاسارگادpasargad057
پست بانکpost-bank021
تجارتtejarat018
توسعه تعاونtosee-taavon022
توسعه صادراتtosee-saderat020
خاورمیانهkhavarmianeh078
دیday066
رفاه کارگرانrefah013
سامانsaman056
سپهsepah015
سرمایهsarmayeh058
سیناsina059
شهرshahr061
صادرات ایرانsaderat019
صنعت و معدنsanat-madan011
قرض‌الحسنه رسالتresalat070
قرض‌الحسنه مهر ایرانmehr-iran060
کارآفرینkarafarin053
کشاورزیkeshavarzi016
گردشگریgardeshgari064
مؤسسه اعتباری توسعهtosee051
مؤسسه اعتباری مللmelal075
مؤسسه اعتباری نورnoor080
مرکزیmarkazi010
مسکنmaskan014
ملتmellat012
ملی ایرانmelli017

API هوش مصنوعی

دو نشانی، یک کلید. هر چیزی که در این صفحه است از همان کدی آمده که درخواست شما را پاسخ می‌دهد.

گفت‌وگو با مدل زبانی

POST https://melliapi.net/api/v1/ai/chat/completions/

{
  "model": "gemini-flash",
  "messages": [
    { "role": "system", "content": "پاسخ‌ها را کوتاه و فارسی بده." },
    { "role": "user", "content": "پایتخت ایران کجاست؟" }
  ],
  "max_tokens": 200,
  "temperature": 0.3
}
فیلدلازمتوضیح
modelبلهنام مدل، از جدول «مدل‌های در دسترس».
messagesبلهآرایه‌ای از پیام‌ها. هر پیام role (system | user | assistant) و content دارد. نقش ناشناخته رد می‌شود و بی‌صدا به user تبدیل نمی‌شود.
max_tokensخیرسقف طول پاسخ. بیشتر از سقف مدل بفرستید تا همان سقف کوتاه می‌شود. نفرستید، سقف پیش‌فرض مدل اعمال می‌شود.
temperatureخیرمیزان تنوع پاسخ. نفرستید، پیش‌فرض مدل.
streamخیرtrue یعنی پاسخ تکه‌تکه و به‌صورت SSE بیاید.

پاسخ موفق

{
  "ok": true,
  "requestId": "req_7f3c…",
  "model": "gemini-flash",
  "content": "تهران.",
  "usage": { "promptTokens": 42, "completionTokens": 3 },
  "finishReason": "stop",
  "billing": { "amountRial": 710, "balanceRial": 48912340 }
}

🔴 billing.amountRial مبلغی است که واقعاً کسر شد و نه سقفی که پیش از تماس قفل شده بود. تفاوت این دو همان لحظه به موجودی برمی‌گردد.

requestId را نگه دارید. تنها چیزی است که برای پیگیری یک فراخوان در پشتیبانی به کار می‌آید، چون متن پیام‌ها را نگه نمی‌داریم.

پاسخ جریانی

با فرستادن "stream": true، پاسخ به‌صورت text/event-stream تکه‌تکه می‌آید. هر تکه یک خط data: است.

data: {"requestId":"req_7f3c…","delta":"ته"}

data: {"requestId":"req_7f3c…","delta":"ران."}

data: {"requestId":"req_7f3c…","done":true,"usage":{"promptTokens":42,"completionTokens":3},"billing":{"amountRial":710}}

data: [DONE]

⚠️ صورتحساب در تکهٔ پایانی می‌آید، نه در ابتدا، چون هزینه تا پایان تولید معلوم نیست. اگر ارتباط را وسط کار قطع کنید، بابت همان مقداری که تولید شده هزینه کسر می‌شود؛ مدل تا آن لحظه کار کرده است.

اگر پیش از شروع جریان خطایی رخ دهد، کلید نامعتبر، موجودی ناکافی، مدل خاموش، پاسخ یک JSON معمولی با کد وضعیت مناسب است و نه جریان. پس همیشه content-type را بررسی کنید.

تولید تصویر

POST https://melliapi.net/api/v1/ai/chat/completions/

مدل تصویرساز مسیر جدایی ندارد: همان نشانی و همان بدنهٔ گفت‌وگو، و تصویر در کلید images پاسخ برمی‌گردد. توصیفِ تصویر را مثل یک پیام معمولی بفرستید.

{
  "model": "nano-banana",
  "messages": [
    { "role": "user", "content": "یک فنجان قهوه روی میز چوبی، نور طبیعی" }
  ],
  "max_tokens": 4096
}

پاسخ موفق

{
  "ok": true,
  "requestId": "req_9b1d…",
  "model": "nano-banana",
  "content": "",
  "images": ["data:image/png;base64,iVBORw0KGgo…"],
  "usage": { "promptTokens": 18, "completionTokens": 1290 },
  "billing": { "amountRial": 531300, "balanceRial": 48381040 }
}

🔴 content برای مدل تصویرساز معمولاً خالی است و این طبیعی است؛ خروجی در images است. هر عضو یکdata URI است، پس پاسخ می‌تواند چند مگابایت باشد.

⚠️ قیمت این مدل‌ها هم توکنی است و نه ثابت به‌ازای هر تصویر: تصویر خروجی به توکن شمرده می‌شود. مبلغ کسرشده مثل همیشه درbilling نوشته است، و timeout سمت خودتان را دست‌کم ۱۲۰ ثانیه بگذارید.

مدل‌های متنی برای همین کلید images آرایهٔ خالی می‌دهند، پس لازم نیست دو شکل پاسخ را جدا مدیریت کنید.

ساخت ویدیو

POST https://melliapi.net/api/v1/ai/videos/

درخواست، کار را ثبت می‌کند و پاسخ 202 با شناسهٔ کار برمی‌گرداند، نه خود ویدیو. فیلدها: model و prompt لازم‌اند؛ duration (ثانیه)، resolution، audio و image (تصویر آغازین، نشانی https یا data URL) اختیاری‌اند و مقدارهای مجاز هر مدل در صفحهٔ همان مدل آمده. مقدار ناشناخته رد می‌شود و به نزدیک‌ترین مقدار گرد نمی‌شود.

{
  "model": "google-veo-3.1-fast",
  "prompt": "A slow cinematic drone shot over the Persian Gulf at sunset",
  "duration": 8,
  "resolution": "720p",
  "audio": true
}
{
  "ok": true,
  "id": "vid_3f2a…",
  "status": "processing",
  "billing": { "reservedRial": 1594000, "amountRial": 0 }
}

GET https://melliapi.net/api/v1/ai/videos/{id}/

وضعیت را هر چند ثانیه بپرسید. status یکی از processing، succeeded یا failed است. در حالت موفق videoUrl و expiresAt می‌آیند؛ دریافت فایل از videoUrl همان هدر Authorization را می‌خواهد.

🔴 پول: قیمت ویدیو (نرخ هر ثانیه × مدت) هنگام ثبت از موجودی قفل می‌شود. اگر ساخت موفق شود همان مبلغ کسر می‌شود؛ اگر ناموفق باشد یا در یک ساعت تمام نشود، کامل برمی‌گردد. فایل ویدیو ۷ روز نزد ما می‌ماند و بعد پاک می‌شود؛ آن را نزد خودتان ذخیره کنید.

کاری که failed شود، error.code دارد: generation_failed (ساخت ناموفق)، timeout (در مهلت تمام نشد)، delivery_failed (فایل دریافت نشد) یا temporarily_unavailable. در همهٔ این حالت‌ها مبلغی کسر نمی‌شود.

خطاهای هوش مصنوعی

هر پاسخ ناموفق همین شکل را دارد و کد وضعیت HTTP هم با آن می‌خواند:

{
  "ok": false,
  "requestId": "req_7f3c…",
  "error": { "code": "insufficient_funds", "message": "…" },
  "billing": { "amountRial": 0, "balanceRial": 120000 }
}
وضعیتکدمعنا و کاری که باید کرد
۴۰۰invalid_jsonبدنه JSON معتبر نیست. هزینه‌ای ندارد.
۴۰۰invalid_inputنام مدل نیامده، فهرست پیام‌ها نامعتبر است، یا مدل ورودی را رد کرده. هزینه‌ای ندارد.
۴۰۱unauthorizedکلید نیامده یا معتبر نیست. کلید تازه را از پنل بسازید.
۴۰۴not_foundفقط ویدیو: کاری با این شناسه نیست، مال حساب دیگری است، یا فایلش منقضی شده.
۴۲۲provider_rejectedفقط ویدیو: سرویس سازنده توصیف یا تصویر را نپذیرفت. هزینه‌ای ندارد.
۵۰۳temporarily_unavailableفقط ویدیو: ثبت کار ممکن نشد. هزینه‌ای ندارد؛ کمی بعد دوباره بفرستید.
۴۰۳ip_not_allowedIP فراخوان در فهرست مجاز کلید نیست. فهرست را در پنل به‌روز کنید.
۴۰۳model_not_enabledاین مدل همین حالا ارائه نمی‌شود. جدول «مدل‌های در دسترس» را ببینید.
۴۰۳organization_inactiveحساب کسب‌وکار فعال نیست. با پشتیبانی تماس بگیرید.
۴۰۲insufficient_fundsموجودی برای سقف این فراخوان کافی نیست. پیام می‌گوید سقف چقدر است. پنل را شارژ کنید.
۴۰۴unknown_modelچنین مدلی وجود ندارد. املای نام مدل را بررسی کنید.
۴۲۹rate_limitedسقف فراخوان در دقیقه رد شده. به اندازهٔ Retry-After صبر کنید. هزینه‌ای ندارد.
۵۰۳model_unavailableمدل پاسخ نداد یا در مهلت مقرر نرسید. قابل تلاش دوباره. هزینه‌ای ندارد.
۵۰۳ai_disabledارائهٔ هوش مصنوعی موقتاً بسته است. سرویس‌های استعلام مستقل‌اند و باز می‌مانند.
۵۰۳api_disabledارائهٔ API موقتاً به‌کلی بسته است. با پشتیبانی تماس بگیرید.
۵۰۳pricing_unavailableپیکربندی قیمت‌گذاری ناقص است. خطای ماست و نه شما؛ با پشتیبانی تماس بگیرید.
۵۰۰internal_errorخطای پیش‌بینی‌نشدهٔ ما. شناسهٔ درخواست را به پشتیبانی بدهید.

⚠️ 429 هدر Retry-After دارد؛ به‌جای تلاش فوری، همان اندازه صبر کنید.

صورتحساب هوش مصنوعی

  • پیش از تماس با مدل، سقف هزینه از موجودی قفل می‌شود. پس از پاسخ، مبلغ واقعی کسر و باقی همان لحظه آزاد می‌شود.
  • سقف خروجی را با max_tokens خودتان تعیین می‌کنید. اگر نفرستید، سقف پیش‌فرض همان مدل اعمال می‌شود.
  • ورودی نامعتبر، در دسترس نبودن مدل و عبور از سقف نرخ هزینه‌ای ندارند.
  • اگر ارائه‌دهنده شمار توکن را گزارش نکند، فراخوان رایگان حساب می‌شود. ضررش با ماست، نه شما.

برای برآورد پیش از مصرف، ماشین‌حساب قیمت متن خودتان را می‌گیرد و عدد می‌دهد. شرح کلی سرویس و کاربردهایش در صفحهٔ API هوش مصنوعی است.

مدل‌های در دسترس

فهرست مدل‌ها همین حالا در دسترس نیست. برای دریافت فهرست با ما تماس بگیرید.

نمونهٔ کد هوش مصنوعی

curl

curl -X POST 'https://melliapi.net/api/v1/ai/chat/completions/' \
  -H 'Authorization: Bearer melli_live_…' \
  -H 'Content-Type: application/json' \
  -d '{"model":"gemini-flash","messages":[{"role":"user","content":"سلام"}],"max_tokens":200}'

Node.js

const response = await fetch('https://melliapi.net/api/v1/ai/chat/completions/', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.MELLIAPI_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gemini-flash',
    messages: [{ role: 'user', content: prompt }],
    max_tokens: 200,
  }),
});

const body = await response.json();
if (body.ok) {
  console.log(body.content, body.billing.amountRial);
}

Python

import os, requests

response = requests.post(
    "https://melliapi.net/api/v1/ai/chat/completions/",
    headers={"Authorization": f"Bearer {os.environ['MELLIAPI_API_KEY']}"},
    json={
        "model": "gemini-flash",
        "messages": [{"role": "user", "content": prompt}],
        "max_tokens": 200,
    },
    timeout=120,
)
body = response.json()
if body.get("ok"):
    print(body["content"], body["billing"]["amountRial"])

PHP / وردپرس

$response = wp_remote_post( 'https://melliapi.net/api/v1/ai/chat/completions/', array(
    'timeout' => 120,
    'headers' => array(
        'Authorization' => 'Bearer ' . MELLIAPI_API_KEY,
        'Content-Type'  => 'application/json',
    ),
    'body' => wp_json_encode( array(
        'model'      => 'gemini-flash',
        'messages'   => array( array( 'role' => 'user', 'content' => $prompt ) ),
        'max_tokens' => 200,
    ) ),
) );

if ( is_wp_error( $response ) ) {
    return; // شبکه قطع بود، دوباره تلاش کنید.
}

$body = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! empty( $body['ok'] ) ) {
    // $body['content'] پاسخ مدل است.
}

⚠️ مهلت (timeout) را دست‌کم ۱۲۰ ثانیه بگذارید. پاسخ‌های بلند زمان می‌برند و مهلت کوتاه یعنی شما پاسخ را نمی‌بینید در حالی که صورتحسابش صادر شده.

آنچه از فراخوان‌های هوش مصنوعی نگه نمی‌داریم

متن پیام‌ها و پاسخ مدل ذخیره نمی‌شود. از هر فراخوان فقط نام مدل، وضعیت، شمار توکن، مبلغ و زمان ثبت می‌شود، همان چیزی که در بخش هوش مصنوعی پنل می‌بینید.

API پیامک OTP

ارسال و سنجش کد تأیید با چند ارائه‌دهندهٔ پیامک پشتیبان. معرفی و قیمت در صفحهٔ وب سرویس پیامک OTP است.

ارسال کد تأیید

یک درخواست POST /api/v1/sms/otp/ با کلید API در هدر Authorization: Bearer (یا X-API-Key).

  • mobile: شمارهٔ موبایل ایران، با ارقام فارسی یا لاتین. لازم.
  • code: اختیاری. اگر بفرستید همان کد می‌رود؛ فقط رقم، ۴ تا ۱۰ رقم.
  • length: طول کد ساخته‌شده، ۴ تا ۸ رقم، پیش‌فرض ۵. کد ساخته‌شده در پاسخ برنمی‌گردد.
  • ttlSeconds: اعتبار کد، ۶۰ تا ۹۰۰ ثانیه، پیش‌فرض ۱۲۰.
curl -X POST https://melliapi.net/api/v1/sms/otp/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mobile": "09121234567", "length": 5, "ttlSeconds": 120}'

پاسخ موفق (مبلغ واقعی در billing.amountRial):

{
  "ok": true,
  "requestId": "req_7f3c…",
  "otpId": "otp_1a9e…",
  "status": "sent",
  "expiresAt": "2026-11-03T10:02:00.000Z",
  "billing": { "amountRial": … }
}

سنجش کد تأیید

کدی که کاربر وارد کرده را با POST /api/v1/sms/otp/verify/ بسنجید. آخرین کد ارسال‌شده به همان شماره، از همان حساب، سنجیده می‌شود. هر کد ۵ بار قابل سنجش است و کد درست فقط یک بار پذیرفته می‌شود. سنجش رایگان است.

curl -X POST https://melliapi.net/api/v1/sms/otp/verify/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mobile": "09121234567", "code": "48213"}'
{ "ok": true, "requestId": "req_…", "valid": true }

{ "ok": true, "requestId": "req_…", "valid": false,
  "reason": "invalid_code", "remainingAttempts": 3 }

مقدارهای reason: invalid_code (کد نادرست)، expired (مهلت گذشته)، already_used (قبلاً پذیرفته شده)، too_many_attempts (قفل شده) و not_found (کدی برای این شماره فرستاده نشده).

خطاهای پیامک OTP

کدHTTPمعنا
invalid_input۴۰۰شماره، کد، طول یا مهلت نامعتبر است؛ فیلد خطادار در error.field آمده.
unauthorized۴۰۱کلید API ارسال نشده یا معتبر نیست.
insufficient_funds۴۰۲موجودی برای یک پیامک کافی نیست؛ هیچ پیامکی نرفت.
ip_not_allowed۴۰۳IP شما در فهرست مجاز کلید نیست.
rate_limited۴۲۹سقف ارسال به این شماره یا سقف دقیقه‌ای رد شده؛ retryAfterSeconds را ببینید.
sms_unavailable۵۰۳هیچ مسیری پیامک را نپذیرفت؛ مبلغی کسر نشد.
service_disabled۵۰۳سرویس موقتاً ارائه نمی‌شود.

صورتحساب

  • همهٔ سرویس‌ها از یک موجودی برداشت می‌کنند: استعلام، هوش مصنوعی و پیامک. قیمت هر کدام در تعرفهٔ API است.
  • مبلغ پیش از تماس با سرویس مرجع از موجودی شما قفل می‌شود و پس از پاسخ تسویه. اگر پاسخی نیاید، کل مبلغ همان لحظه برمی‌گردد. در هوش مصنوعی سقف هزینه قفل و مبلغ واقعی به‌ازای توکن کسر می‌شود (جزئیات).
  • فراخوانی که به سرویس مرجع نرسد، موجودی ناکافی، ورودی نامعتبر، قطعی، هیچ هزینه‌ای ندارد.
  • کف شارژ حساب ۵۰۰٬۰۰۰ تومان است.

سقف نرخ

پیش‌فرض ۶۰ فراخوان در دقیقه برای هر سرویس است. عبور از آن پاسخ 429 با هدر Retry-After می‌گیرد و هیچ هزینه‌ای ندارد. اگر حجم بیشتری لازم دارید، بگویید تا برای حساب شما بالا ببریم.

⚠️ فراخوان ۴۲۹ در سابقهٔ مصرف شما ثبت نمی‌شود. سقف نرخ برای ریختن بار است و نوشتن یک ردیف به‌ازای هر درخواست ردشده، همان چیزی را می‌سازد که قرار بود جلویش را بگیرد. اگر شمارش لازم دارید، سمت خودتان پاسخ‌های ۴۲۹ را بشمارید.

آنچه نگه می‌داریم

درخواست و پاسخ هر فراخوان ذخیره می‌شود تا در پنل کسب‌وکارتان، کنار همان ردیف، ببینیدش و به‌صورت JSON دانلودش کنید. برای عیب‌یابی همین لازم است: بدون آن، «کدام ورودی غلط بود» فقط با تیکت درمی‌آمد.

این داده رمزشده در پایگاه داده می‌نشیند و فقط از حساب خودتان دیده می‌شود. نه در گزارش‌های ما جمع زده می‌شود، نه به کسی داده می‌شود، و نه برای کار دیگری به کار می‌رود.

پاسخ استعلام‌ها در کشی مشترک نگهداری می‌شود که کلیدش hash کل ورودی است: به پاسخ کش کسی می‌رسد که بتواند دقیقاً همان ورودی را بسازد، یعنی همان چیزی را بداند که پرسندهٔ اول می‌دانست.

سیاست حریم خصوصی و اقدامات امنیتی

شروع کنیم

حسابتان را همین حالا بسازید؛ تا رسیدن به اولین فراخوان موفق چند دقیقه بیشتر فاصله ندارید.

ساخت حساب کسب‌وکار

سؤالی دارید یا حجم ماهانه‌تان بالاست و تعرفهٔ اختصاصی می‌خواهید؟ با ما تماس بگیرید.