مستندات API
یک کلید و یک کیف پول برای همهٔ سرویسها: استعلام، هوش مصنوعی و پیامک. آنچه در ادامه آمده توصیف رفتار واقعی سامانه است، نه فهرست وعدهها.
قیمت هر سرویس در تعرفهٔ API آمده است.
همین حالا شروع کنید
حساب کسبوکار بیدرنگ ساخته میشود، کلید را خودتان میسازید و پنل را آنلاین شارژ میکنید. هیچ مرحلهٔ دستی و هیچ انتظاری برای تأیید در کار نیست.
سند OpenAPI OAS 3.0.3
فایل را در Postman یا Swagger وارد کنید، یا از رویش کلاینت تولید کنید. ⚠️ سند در لحظهٔ دانلود ساخته میشود، پس فهرست سرویسها و قیمتها همانی است که همان لحظه فعال است.
برای چه کسی
برای کسبوکارهایی که میخواهند استعلام، هوش مصنوعی یا پیامک تأیید را داخل محصول خودشان داشته باشند. مثلاً تطبیق کد ملی با شمارهٔ موبایل در لحظهٔ ثبتنام، خلاصهکردن تیکت با یک مدل زبانی، یا فرستادن کد ورود. همه با یک کلید و یک موجودی.
حساب کسبوکار را خودتان در پنل میسازید، بیدرنگ و بدون تأیید دستی، و کلید را هم خودتان میسازید و میچرخانید.
شروع در سه گام
- با شمارهٔ موبایل وارد میشوید و در پنل کسبوکار نام کسبوکار را ثبت میکنید. حساب همان لحظه ساخته میشود.
- پنل را از همان صفحه شارژ میکنید، کمترین مبلغ ۵۰۰٬۰۰۰ تومان، و کلید میسازید. متن کلید فقط یک بار نشان داده میشود.
- کلید را در هدر میگذارید و فراخوان میزنید.
احراز هویت
کلید را در یکی از این دو هدر بفرستید، هر دو پذیرفته میشوند:
Authorization: Bearer melli_live_…
# یا
X-API-Key: melli_live_…⚠️ کلید را هرگز در کد سمت مرورگر نگذارید. هر کسی که کلید را ببیند میتواند از موجودی شما خرج کند. اگر نشت کرد، از پنل باطلش کنید؛ ابطال بیدرنگ اثر میکند.
اگر IP سرورتان ثابت است، هنگام ساخت کلید فهرست IP مجاز را پر کنید. خالیگذاشتنش یعنی کلید از هر جای دنیا کار میکند.
API استعلام
نشانی و قالب درخواست
هر سرویس یک نشانی دارد و فقط 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-inquiry | iban, شباIR و ۲۴ رقم، بی فاصله. | ۸۰۰ تومان |
| استعلام نام صاحب کارت | card-inquiry | cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله. | ۸۰۰ تومان |
| استعلام چک برگشتی | bounced-check | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.nationalityType, نوع تابعیت (اختیاری)1 یا 2؛ اگر نفرستید، 1. | ۱۴٬۰۰۰ تومان |
| استعلام چک صیادی | sayad-check | sayadId, شناسهٔ صیادشانزده رقم. | ۱۰٬۴۰۰ تومان |
| تبدیل حساب به شبا | account-to-iban | bankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همانطور بفرستید.bank, بانکشناسهٔ لاتین بانک از جدول «کد بانکها»، مثل mellat. کد سهرقمی بانک در شبا (مثل 012) هم پذیرفته میشود.جدول کد بانکها | ۸۰۰ تومان |
| تبدیل کارت به حساب | card-to-account | cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله. | ۸۰۰ تومان |
| تبدیل کارت به شبا | card-to-iban | cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله. | ۱٬۱۰۰ تومان |
| تطابق شبا و نام | iban-name-match | iban, شباIR و ۲۴ رقم، بی فاصله.name, نامنام و نام خانوادگی به فارسی، دستکم سه حرف. | ۸۰۰ تومان |
| تطابق شماره حساب و نام | account-name-match | bank, بانکشناسهٔ لاتین بانک از جدول «کد بانکها»، مثل mellat. کد سهرقمی بانک در شبا (مثل 012) هم پذیرفته میشود.جدول کد بانکهاbankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همانطور بفرستید.name, نامنام و نام خانوادگی به فارسی، دستکم سه حرف. | ۸۰۰ تومان |
| تطابق کارت و نام | card-name-match | cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله.name, نامنام و نام خانوادگی به فارسی، دستکم سه حرف. | ۸۰۰ تومان |
| زنجیره انتقالات چک صیادی | sayad-chain | sayadId, شناسهٔ صیادشانزده رقم.nationalCode, کد ملی یا شناسهٔ ملی صادرکنندهٔ چکشخص حقیقی: کد ملی دهرقمی. شخص حقوقی: شناسهٔ ملی یازدهرقمی شرکت.chequeType, نوع چک (اختیاری)اگر نفرستید، 1. | ۴٬۷۰۰ تومان |
| استعلام قبض آب | bill-water | billId, شناسهٔ قبضشش تا سیزده رقم. | ۵۰۰ تومان |
| استعلام قبض ایرانسل | bill-irancell | mobile, شمارهٔ موبایلیازده رقم که با 09 شروع میشود. | ۵۰۰ تومان |
| استعلام قبض برق | bill-electricity | billId, شناسهٔ قبضشش تا سیزده رقم. | ۵۰۰ تومان |
| استعلام قبض تلفن ثابت | bill-landline | phoneNumber, شماره تلفن ثابتشمارهٔ تلفن ثابت با کد شهر، یازده رقم، مثل 02188776655. | ۵۰۰ تومان |
| استعلام قبض رایتل | bill-rightel | mobile, شمارهٔ موبایلیازده رقم که با 09 شروع میشود. | ۵۰۰ تومان |
| استعلام قبض همراه اول | bill-mci | mobile, شمارهٔ موبایلیازده رقم که با 09 شروع میشود. | ۵۰۰ تومان |
| استعلام قبض گاز | bill-gas | billId, شناسهٔ قبضشش تا سیزده رقم. | ۵۰۰ تومان |
| استعلام اطلاعات شرکت | company-inquiry | companyNationalId, شناسهٔ ملی شخص حقوقییازده رقم. | ۷٬۷۰۰ تومان |
| استعلام اطلاعات صنف | guild-inquiry | guildCode, شناسهٔ صنفیده رقم. | ۱۰٬۸۰۰ تومان |
| استعلام اینماد | enamad | website, نشانی وبگاهنام دامنه، مثل example.com؛ https:// و www. خودکار حذف میشوند. | ۶٬۲۰۰ تومان |
| اعضای هیئتمدیره | board-members | companyNationalId, شناسهٔ ملی شخص حقوقییازده رقم. | ۷٬۷۰۰ تومان |
| تاریخچه هیئتمدیره | board-members-history | companyNationalId, شناسهٔ ملی شخص حقوقییازده رقم. | ۱۴٬۰۰۰ تومان |
| استعلام اطلاعات هویتی | national-id-inquiry | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته میشوند. | ۷٬۰۰۰ تومان |
| استعلام شاهکار | shahkar | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.mobile, شمارهٔ موبایلیازده رقم که با 09 شروع میشود. | ۱٬۵۰۰ تومان |
| تطابق درصدی اطلاعات هویتی | identity-similarity | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته میشوند.name, نامنام و نام خانوادگی به فارسی، دستکم سه حرف.fatherName, نام پدراختیاری؛ نام پدر به فارسی. | ۷٬۰۰۰ تومان |
| تطابق کد ملی و شبا | iban-national-id-match | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته میشوند.iban, شباIR و ۲۴ رقم، بی فاصله. | ۳٬۲۰۰ تومان |
| تطابق کد ملی و شماره حساب | account-national-id-match | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته میشوند.bank, بانکشناسهٔ لاتین بانک از جدول «کد بانکها»، مثل mellat. کد سهرقمی بانک در شبا (مثل 012) هم پذیرفته میشود.جدول کد بانکهاbankAccount, شمارهٔ حسابشماره حساب دقیقاً با همان قالبی که بانک داده؛ اگر خط تیره، اسلش یا نقطه دارد، همانطور بفرستید. | ۳٬۲۰۰ تومان |
| تطابق کد ملی و کارت | card-national-id-match | nationalCode, کد ملیده رقم، با رقم کنترل معتبر.birthDate, تاریخ تولدتاریخ شمسی (نه میلادی): سال چهاررقمی، ماه و روز دورقمی. 1370/01/05، 1370-01-05 و 13700105 هر سه پذیرفته میشوند.cardNumber, شمارهٔ کارتشانزده رقم، بی فاصله یا با فاصله. | ۳٬۲۰۰ تومان |
| تبدیل فارسی به فینگلیش | persian-to-finglish | persianText, متن فارسیدو تا دویست نویسه. | ۹۰۰ تومان |
| تبدیل کد پستی به آدرس | address-lookup | postalCode, کد پستیده رقم. | ۳٬۹۰۰ تومان |
| مختصات جغرافیایی کد پستی | postal-code-geo | postalCode, کد پستیده رقم. | ۷٬۷۰۰ تومان |
| استعلام خلافی خودرو | vehicle-fines | plate.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-details | plate.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 | کد در شبا |
|---|---|---|
| آینده | ayandeh | 062 |
| اقتصاد نوین | eghtesad-novin | 055 |
| ایران زمین | iran-zamin | 069 |
| پارسیان | parsian | 054 |
| پاسارگاد | pasargad | 057 |
| پست بانک | post-bank | 021 |
| تجارت | tejarat | 018 |
| توسعه تعاون | tosee-taavon | 022 |
| توسعه صادرات | tosee-saderat | 020 |
| خاورمیانه | khavarmianeh | 078 |
| دی | day | 066 |
| رفاه کارگران | refah | 013 |
| سامان | saman | 056 |
| سپه | sepah | 015 |
| سرمایه | sarmayeh | 058 |
| سینا | sina | 059 |
| شهر | shahr | 061 |
| صادرات ایران | saderat | 019 |
| صنعت و معدن | sanat-madan | 011 |
| قرضالحسنه رسالت | resalat | 070 |
| قرضالحسنه مهر ایران | mehr-iran | 060 |
| کارآفرین | karafarin | 053 |
| کشاورزی | keshavarzi | 016 |
| گردشگری | gardeshgari | 064 |
| مؤسسه اعتباری توسعه | tosee | 051 |
| مؤسسه اعتباری ملل | melal | 075 |
| مؤسسه اعتباری نور | noor | 080 |
| مرکزی | markazi | 010 |
| مسکن | maskan | 014 |
| ملت | mellat | 012 |
| ملی ایران | melli | 017 |
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_allowed | IP فراخوان در فهرست مجاز کلید نیست. فهرست را در پنل بهروز کنید. |
| ۴۰۳ | 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
ارسال کد تأیید
یک درخواست 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 کل ورودی است: به پاسخ کش کسی میرسد که بتواند دقیقاً همان ورودی را بسازد، یعنی همان چیزی را بداند که پرسندهٔ اول میدانست.
شروع کنیم
حسابتان را همین حالا بسازید؛ تا رسیدن به اولین فراخوان موفق چند دقیقه بیشتر فاصله ندارید.
سؤالی دارید یا حجم ماهانهتان بالاست و تعرفهٔ اختصاصی میخواهید؟ با ما تماس بگیرید.
