API استعلام برای کسبوکارها
یک کلید، یک نشانی، و پاسخ JSON. آنچه در ادامه آمده توصیف رفتار واقعی سامانه است، نه فهرست وعدهها.
برای چه کسی
برای کسبوکارهایی که میخواهند استعلام را داخل محصول خودشان انجام دهند — نه اینکه کاربرشان را به سایت دیگری بفرستند. مثلاً تطبیق کد ملی با شمارهٔ موبایل در لحظهٔ ثبتنام، یا تبدیل کد پستی به نشانی در فرم سفارش.
حساب کسبوکار را ما ثبت میکنیم و پس از تأیید، خودتان از پنل کلید میسازید و میچرخانید.
شروع در سه گام
- حساب کسبوکار را از صفحهٔ تماس درخواست میدهید و میگویید کدام استعلامها را لازم دارید.
- پس از تأیید و شارژ، در پنل کسبوکار کلید میسازید. متن کلید فقط یک بار نشان داده میشود.
- کلید را در هدر میگذارید و فراخوان میزنید.
احراز هویت
کلید را در یکی از این دو هدر بفرستید — هر دو پذیرفته میشوند:
Authorization: Bearer ehr_live_…
# یا
X-API-Key: ehr_live_…⚠️ کلید را هرگز در کد سمت مرورگر نگذارید. هر کسی که کلید را ببیند میتواند از موجودی شما خرج کند. اگر نشت کرد، از پنل باطلش کنید؛ ابطال بیدرنگ اثر میکند.
اگر IP سرورتان ثابت است، هنگام ساخت کلید فهرست IP مجاز را پر کنید. خالیگذاشتنش یعنی کلید از هر جای دنیا کار میکند.
نشانی و قالب درخواست
هر سرویس یک نشانی دارد و فقط POST میپذیرد. ورودی این سرویسها کد ملی و شمارهٔ کارت است؛ فرستادنش در نشانی یعنی نشستنش در لاگ سرور، تاریخچهٔ مرورگر و هدر Referer — پس GET عمداً پشتیبانی نمیشود.
POST https://ehrazino.com/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 | ۵۰۲ | خطای گذرای سرویس مرجع — دوباره تلاش کنید | ندارد |
temporarily_unavailable | ۵۰۳ | سرویس مرجع در دسترس نبود — بعداً تلاش کنید | ندارد |
api_disabled | ۵۰۳ | ارائهٔ API موقتاً خاموش است | ندارد |
no_tariff | ۵۰۳ | تعرفهٔ این سرویس تعیین نشده | ندارد |
internal_error | ۵۰۰ | خطای داخلی ما — با requestId به پشتیبانی بگویید | ندارد |
⚠️ not_found با HTTP ۲۰۰ برمیگردد و ok:false دارد. «رکوردی نیست» یک پاسخ معتبر است که ما بابتش به سرویس مرجع پول دادهایم، پس هزینه دارد — ولی ۴۰۴ نمیدهیم چون با «چنین سرویسی نداریم» قاطی میشود.
هر پاسخی که به مرحلهٔ تسویه رسیده باشد — چه موفق چه ناموفق — فیلد billing دارد و میگوید همین حالا چقدر کسر شد و موجودیتان چقدر مانده. نبودنِ این فیلد یعنی هیچ مبلغی جابهجا نشده؛ پس برای تطبیق حساب لازم نیست حدس بزنید.
نمونهٔ کد
curl
curl -X POST 'https://ehrazino.com/api/v1/sana-inquiry/' \
-H 'Authorization: Bearer ehr_live_…' \
-H 'Content-Type: application/json' \
-d '{"nationalCode":"0013542419","mobile":"09120000000"}'PHP / وردپرس
$response = wp_remote_post( 'https://ehrazino.com/api/v1/sana-inquiry/', array(
'timeout' => 30,
'headers' => array(
'Authorization' => 'Bearer ' . EHRAZINO_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://ehrazino.com/api/v1/sana-inquiry/', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EHRAZINO_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://ehrazino.com/api/v1/sana-inquiry/",
headers={"Authorization": f"Bearer {os.environ['EHRAZINO_API_KEY']}"},
json={"nationalCode": national_code, "mobile": mobile},
timeout=30,
)
body = response.json()
if body.get("ok"):
data = body["data"]⚠️ مهلت (timeout) را دستکم ۳۰ ثانیه بگذارید. برخی سرویسهای مرجع کند پاسخ میدهند و مهلت کوتاه یعنی شما پاسخ را نمیبینید در حالی که صورتحسابش صادر شده.
سرویسها و ورودیهایشان
فهرست سرویسهای فعال هنوز منتشر نشده است. بپرسید کدام استعلامها موجودند.
قیمتهای بالا همان چیزی است که در لحظهٔ فراخوان کسر میشود. تعرفهٔ اختصاصی سازمان شما — اگر داشته باشید — در پنل کسبوکار دیده میشود و بر این جدول اولویت دارد.
صورتحساب
- مبلغ پیش از تماس با سرویس مرجع از موجودی شما قفل میشود و پس از پاسخ تسویه. اگر پاسخی نیاید، کل مبلغ همان لحظه برمیگردد.
- فراخوانی که به سرویس مرجع نرسد — موجودی ناکافی، ورودی نامعتبر، قطعی — هیچ هزینهای ندارد.
- پاسخی که از کش بیاید هم صورتحساب میشود، چون همان دادهٔ خریداریشده است. پاسخ کهنه (وقتی سرویس مرجع در دسترس نیست) در هر حال رایگان است.
- کف شارژ حساب ۱٬۰۰۰٬۰۰۰ تومان است.
سقف نرخ
پیشفرض ۶۰ فراخوان در دقیقه برای هر سرویس است. عبور از آن پاسخ 429 با هدر Retry-After میگیرد و هیچ هزینهای ندارد. اگر حجم بیشتری لازم دارید، بگویید تا برای حساب شما بالا ببریم.
⚠️ فراخوان ۴۲۹ در سابقهٔ مصرف شما ثبت نمیشود. سقف نرخ برای ریختن بار است و نوشتن یک ردیف بهازای هر درخواست ردشده، همان چیزی را میسازد که قرار بود جلویش را بگیرد. اگر شمارش لازم دارید، سمت خودتان پاسخهای ۴۲۹ را بشمارید.
آنچه نگه نمیداریم
از هر فراخوان فقط نام سرویس، وضعیت، مبلغ و زمان ثبت میشود. ورودی شما و نتیجهٔ استعلام در سابقهٔ API ذخیره نمیشود — نه کد ملی، نه شمارهٔ کارت، نه پاسخ.
پاسخ استعلامها در کشی مشترک نگهداری میشود که کلیدش hash کل ورودی است: به پاسخ کش کسی میرسد که بتواند دقیقاً همان ورودی را بسازد — یعنی همان چیزی را بداند که پرسندهٔ اول میدانست.
شروع کنیم
بگویید کدام استعلامها را لازم دارید و حجم تقریبی ماهانهتان چقدر است. صفحهٔ تماس
