لیر حواله ترکیهخرده5,610 تومان▲ +0.40%دلار آمریکاخرده277,580 تومان▲ +0.76%یوروخرده308,780 تومان▲ +0.68%هر USDT به لیرخرده54.22 لیر▼ -0.02%لیر حواله ترکیهعمده5,500 تومان• —دلار آمریکاعمده273,570 تومان• —یوروعمده304,320 تومان• —هر USDT به لیرعمده53.21 لیر• —
آخرین بروزرسانی: 1405/08/21 - 16:40:08
مستندات فنی

API نرخ همکاران همتا گیفت

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

معرفی

API همتا گیفت یک سرویس REST فقط‌خواندنی است که پاسخ را در قالب JSON و با کدگذاری UTF-8 برمی‌گرداند. هر کلید API به یک حساب همکاری تعلق دارد و فقط نرخ‌های همان حساب را برمی‌گرداند: بهای تمام‌شده شما از همتا گیفت و قیمت مشتری شما با حاشیه سودی که خودتان در پنل همکاران تعیین کرده‌اید. نرخ مرجع بازار در این API ارائه نمی‌شود.

آدرس پایه

https://hamtagift.com

همه درخواست‌ها باید از طریق HTTPS ارسال شوند.

احراز هویت

هر درخواست باید کلید API را در سرآیند Authorization و به شکل Bearer ارسال کند. کلیدها با پیشوند hamta_live_ شروع می‌شوند.

  1. وارد پنل همکاران شوید و صفحه «API و تلگرام» را باز کنید.
  2. یک کلید جدید بسازید (نقش‌های مالک، مدیر و توسعه‌دهنده امکان ساخت کلید دارند).
  3. کلید فقط یک بار نمایش داده می‌شود؛ آن را در یک متغیر محیطی امن روی سرور خود نگه دارید. همتا گیفت فقط نسخه رمزنگاری‌شده کلید را ذخیره می‌کند؛ اگر کلید را گم کردید، آن را باطل کنید و کلید جدید بسازید.
سرآیند درخواست
Authorization: Bearer hamta_live_…

کلید API را هرگز در کد سمت مرورگر (JavaScript صفحه)، اپلیکیشن موبایل یا مخزن کد عمومی قرار ندهید. درخواست را فقط از سرور خود ارسال کنید.

دریافت نرخ‌ها

GET/api/partner/v1/rates

نرخ‌های فعلی ابزارهای حساب همکاری شما را برمی‌گرداند: همه آن‌ها، یا فقط ابزارهایی که با پارامتر اختیاری instruments نام می‌برید. این درخواست بدنه ندارد و پاسخ آن هرگز کش نمی‌شود (Cache-Control: no-store).

پارامتر اختیاری instruments

برای دریافت فقط برخی ابزارها، instruments= را با کدهای آن‌ها از جدول «ابزارها»، جداشده با ویرگول انگلیسی (,)، به آدرس اضافه کنید. حروف بزرگ و کوچک در کدها فرقی ندارد (rub همان RUB است)؛ فاصله‌ها و کدهای تکراری نادیده گرفته می‌شوند و فهرست rates با هر ترتیبی که کدها را بفرستید، به ترتیب جدول «ابزارها» برمی‌گردد. بدون این پارامتر یا با مقدار خالی، همه ابزارها برمی‌گردند. اگر حتی یک کد ناشناخته باشد، هیچ نرخی برنمی‌گردد: پاسخ 400 با کد unknown_instruments است، کدهای ناشناخته در invalid و همه کدهای معتبر در allowed. این پارامتر پس از بررسی کلید، IP، سقف دقیقه‌ای و ساعات بازار بررسی می‌شود؛ پس درخواست ردشده هم در سقف دقیقه‌ای شمرده می‌شود.

نمونه درخواست
GET /api/partner/v1/rates?instruments=dollar,euro
400
{
  "ok": false,
  "error": "unknown_instruments",
  "invalid": [
    "<string>"
  ],
  "allowed": [
    "havaleLir",
    "dollar",
    "euro",
    "usdtToLir",
    "AMD_1000",
    "usdtPrice",
    "AFN",
    "onlineShop",
    "sipay",
    "RUB"
  ]
}

ساعات و دسترسی

API نرخ‌ها در روزهای کاری بازار از ساعت ۱۱:۰۰ تا ۲۰:۰۰ به وقت تهران پاسخ می‌دهد (آخرین درخواست پذیرفته‌شده ساعت ۱۹:۵۹). جمعه‌ها و روزهای تعطیل رسمی بازار بسته است. خارج از این ساعات پاسخ 503 با کد OUTSIDE_MARKET_HOURS برمی‌گردد؛ سرآیند Retry-After تعداد ثانیه تا بازگشایی بعدی و فیلد next_open زمان آن را (ISO 8601، UTC) نشان می‌دهد.

503
{
  "ok": false,
  "success": false,
  "error": "OUTSIDE_MARKET_HOURS",
  "message": "<string>",
  "market_hours": "11:00 - 20:00 Asia/Tehran",
  "next_open": "<ISO 8601 string>"
}

فهرست IP مجاز اختیاری است و به درخواست شما توسط پشتیبانی همتا گیفت ثبت می‌شود. تا وقتی آدرسی ثبت نشده باشد، کلیدهای شما از هر IP پذیرفته می‌شوند. اگر یک یا چند آدرس ثبت شود، هر درخواست از آدرس دیگر با 403 و کد IP_NOT_ALLOWED رد می‌شود. فقط آدرس‌های دقیق و عمومی IPv4 یا IPv6 پذیرفته می‌شوند (بدون بازه)، حداکثر ۱۰ آدرس؛ این فهرست برای همه کلیدهای حساب شما اعمال می‌شود و در پنل همکاران (بخش API و تلگرام) قابل مشاهده است.

403
{
  "ok": false,
  "success": false,
  "error": "IP_NOT_ALLOWED",
  "message": "<string>"
}

ساختار پاسخ

پاسخ موفق با کد وضعیت 200 برمی‌گردد. ساختار زیر دقیقاً همان کلیدهایی است که API برمی‌گرداند؛ به جای مقادیر عددی، نوع داده نوشته شده است. برای دیدن پاسخ واقعی حساب خودتان، صفحه «API و تلگرام» در پنل همکاران را ببینید.

ساختار پاسخ موفق
{
  "ok": true,
  "partner": "<string>",
  "updatedAt": "<ISO 8601 string | null>",
  "note": "buy = customer buys (خرید از ما), sell = customer sells (فروش به ما). null = not configured.",
  "rates": [
    {
      "code": "havaleLir",
      "label": "لیر حواله ترکیه",
      "unit": "TOMAN",
      "unitBasis": 1,
      "partnerCost": {
        "retail": {
          "buy": "<decimal string | null>",
          "sell": "<decimal string | null>"
        },
        "wholesale": {
          "buy": "<decimal string | null>",
          "sell": "<decimal string | null>"
        }
      },
      "customerPrice": {
        "retail": {
          "buy": "<decimal string | null>",
          "sell": "<decimal string | null>"
        },
        "wholesale": {
          "buy": "<decimal string | null>",
          "sell": "<decimal string | null>"
        }
      }
    },
    …
  ]
}

شرح فیلدها

فیلدنوعتوضیح
okbooleanدر پاسخ موفق همیشه true و در پاسخ خطا false است.
partnerstringنام شرکت شما، همان‌طور که در حساب همکاری ثبت شده است.
updatedAtstring | nullزمان آخرین به‌روزرسانی نرخ‌های مرجع همتا گیفت به قالب ISO 8601 (UTC)؛ اگر مشخص نباشد null است.
notestringیادداشت ثابت درباره معنای buy، sell و null.
ratesarrayفهرست ابزارها (همه، یا آن‌هایی که در instruments نام برده‌اید)، همیشه به ترتیب جدول «ابزارها».
rates[].codestringشناسه ثابت ابزار؛ در کد خود به این فیلد تکیه کنید، نه به label.
rates[].labelstringنام فارسی ابزار برای نمایش؛ ممکن است تغییر کند.
rates[].unit"TOMAN" | "TRY"واحد قیمت: TOMAN یعنی تومان، TRY یعنی لیر ترکیه.
rates[].unitBasisintegerقیمت برای این تعداد واحد است؛ مثلاً 1000 یعنی قیمت هر ۱۰۰۰ واحد.
rates[].partnerCost{ retail, wholesale }بهای تمام‌شده شما از همتا گیفت، به تفکیک سطح خرده (retail) و عمده (wholesale).
rates[].customerPrice{ retail, wholesale }قیمت مشتری شما: بهای تمام‌شده به‌علاوه حاشیه سودی که خودتان در پنل همکاران تعیین کرده‌اید (پیش‌فرض ۱٪). در کمپین تخفیف این حاشیه می‌تواند تا ۲٪- باشد؛ آن‌وقت قیمت مشتری از بهای تمام‌شده شما بهتر است. اگر برای آن جهت حاشیه‌ای تعیین نشده باشد null است.
….buystring | nullقیمتی که مشتری از شما می‌خرد (خرید از ما).
….sellstring | nullقیمتی که مشتری به شما می‌فروشد (فروش به ما).

همه قیمت‌ها رشته عددی اعشاری (تا ۶ رقم اعشار) یا null هستند. null یعنی «تنظیم نشده»؛ هرگز آن را صفر در نظر نگیرید.

ابزارها

بدون پارامتر instruments، فهرست rates شامل همه این ابزارها با همین ترتیب است:

codeابزارunitunitBasis
havaleLirلیر حواله ترکیه (تومان برای هر لیر)TOMAN1
dollarدلار آمریکا (تومان برای هر دلار)TOMAN1
euroیورو (تومان برای هر یورو)TOMAN1
usdtToLirلیر ترکیه برای هر USDTTRY1
AMD_1000درام ارمنستان (تومان برای هر ۱۰۰۰ درام)TOMAN1000
usdtPriceتومان برای هر USDTTOMAN1
AFNافغانی افغانستان (تومان برای هر افغانی)TOMAN1
onlineShopلیر آنلاین شاپ (تومان برای هر لیر)TOMAN1
sipayلیر همتاکارت (تومان برای هر لیر)TOMAN1
RUBروبل روسیه (تومان برای هر روبل)TOMAN1

خطاها

خطاهای API به‌صورت JSON با "ok": false و یک کد در "error" برمی‌گردند. خطاهای IP_NOT_ALLOWED و OUTSIDE_MARKET_HOURS علاوه بر آن "success": false و یک "message" به زبان سرآیند Accept-Language شما دارند (fa، en، tr، hy؛ در غیر این صورت انگلیسی). دو پاسخ آخر جدول از لایه امنیتی سایت می‌آیند و متن ساده هستند، نه JSON.

وضعیتerrorمعنااقدام پیشنهادی
401missing_or_malformed_tokenسرآیند Authorization ارسال نشده یا کلید با قالب hamta_live_ نیست.سرآیند را به شکل Bearer و با کلید کامل ارسال کنید.
401invalid_tokenکلید شناخته‌شده نیست، باطل شده یا حساب همکاری فعال نیست.در پنل همکاران کلید جدید بسازید یا با همتا گیفت تماس بگیرید.
403IP_NOT_ALLOWEDکلید معتبر است، اما درخواست از آدرسی خارج از فهرست IP مجاز حساب شما آمده است.از یک آدرس ثبت‌شده درخواست بفرستید یا برای تغییر فهرست با پشتیبانی همتا گیفت هماهنگ کنید.
429rate_limitedبیش از ۶۰ درخواست در یک دقیقه با این کلید.به اندازه سرآیند Retry-After (ثانیه) صبر کنید و نتیجه را کش کنید.
503OUTSIDE_MARKET_HOURSخارج از ساعات بازار (۱۱:۰۰ تا ۲۰:۰۰ به وقت تهران) یا روز تعطیل بازار.تا زمان Retry-After یا next_open صبر کنید و آخرین نرخ‌های معتبر خود را نمایش دهید.
400unknown_instrumentsپارامتر instruments کدی دارد که وجود ندارد.فقط کدهای فهرست allowed یا جدول «ابزارها» را بفرستید.
503rates_unavailableنرخ‌ها موقتاً در دسترس نیستند.آخرین نرخ‌های معتبر خود را نگه دارید و بعداً دوباره تلاش کنید.
403—درخواست توسط قواعد امنیتی سایت رد شد (متن ساده Forbidden).اگر درخواست شما عادی است، با پشتیبانی همتا گیفت تماس بگیرید.
429—تعداد درخواست‌ها از یک IP بیش از حد مجاز است (متن ساده).به اندازه Retry-After صبر کنید و فاصله درخواست‌ها را بیشتر کنید.

محدودیت‌ها

  • حداکثر ۶۰ درخواست در دقیقه برای هر کلید API.
  • درخواست‌ها فقط در روزهای کاری بازار، از ۱۱:۰۰ تا ۲۰:۰۰ به وقت تهران پاسخ داده می‌شوند (بخش «ساعات و دسترسی»).
  • درخواست‌هایی که به‌دلیل فهرست IP مجاز رد می‌شوند از سهمیه دقیقه‌ای کلید شما کم نمی‌کنند.
  • علاوه بر آن، هر آدرس IP برای کل سایت محدودیت درخواست جداگانه‌ای دارد (حداکثر حدود ۲ درخواست در ثانیه به‌طور پیوسته).
  • فقط روش GET پشتیبانی می‌شود.

نمونه کد آماده

نمونه‌های زیر کلید را از متغیر محیطی HAMTA_API_KEY می‌خوانند، خطاها را بررسی می‌کنند و قیمت خرده‌فروشی مشتری را برای هر ابزار چاپ می‌کنند. نمونه PHP برای فروشگاه‌های اینترنتی مانند ووکامرس یا لاراول مناسب است.

<?php
// Server side only: never send the API key to the browser.
$apiKey = getenv('HAMTA_API_KEY'); // hamta_live_...

$ch = curl_init('https://hamtagift.com/api/partner/v1/rates');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey, 'Accept: application/json'],
    CURLOPT_TIMEOUT        => 10,
]);
$body   = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$error  = curl_error($ch);
curl_close($ch);

if ($body === false) {
    throw new RuntimeException('Hamta API unreachable: ' . $error);
}
$data = json_decode($body, true); // null for the plain-text 403/429 of the security layer
if ($status !== 200 || !is_array($data) || empty($data['ok'])) {
    // 401: check the key. 429: wait for Retry-After. 503: keep your last good prices.
    throw new RuntimeException('Hamta API error: ' . ($data['error'] ?? ('HTTP ' . $status)));
}

foreach ($data['rates'] as $rate) {
    // Prices are decimal strings or null (= not configured). Keep them as strings
    // (e.g. bcmath) rather than float for money.
    $sellToCustomer = $rate['customerPrice']['retail']['buy'];
    echo $rate['code'], ': ', $sellToCustomer ?? 'not configured', PHP_EOL;
}

توصیه‌ها

  • نتیجه را روی سرور خود دست‌کم یک دقیقه کش کنید و برای هر بازدید صفحه درخواست جدید نفرستید.
  • قیمت‌ها را به صورت رشته یا نوع اعشاری دقیق (Decimal، bcmath) پردازش کنید، نه عدد اعشاری شناور (float).
  • برای یافتن ابزار از فیلد code استفاده کنید؛ label فقط برای نمایش است.
  • مقدار null را «تنظیم نشده» نمایش دهید و هرگز به جای آن عدد دیگری قرار ندهید.
  • اگر درخواست ناموفق بود، آخرین نرخ‌های معتبر را همراه با زمان updatedAt آن‌ها نگه دارید.
  • برای هر سرویس یا محیط یک کلید جداگانه بسازید تا در صورت نیاز فقط همان را باطل کنید.

آماده اتصال هستید؟

کلید API را در پنل همکاران می‌سازید. اگر هنوز همکار همتا گیفت نیستید، برای ایجاد حساب همکاری با ما تماس بگیرید.