API
واجهة TelegramOS HTTP API: المصادقة بمفتاح API وإدارة الحسابات وصندوق الوارد والبوتات والتحليلات وسير العمل برمجياً.
كل ما تفعله لوحة التحكم تفعله عبر واجهة HTTP API هذه. كل مسار ونص طلب ورمز حالة أدناه جرى اختباره على مساحة عمل حقيقية قبل نشر هذه الصفحة.
عنوان URL الأساسي
https://telegramos.netالطلبات والاستجابات بصيغة JSON (Content-Type: application/json). تُعيد عمليات التصدير ملفاً (.xlsx / .csv) وتُعيد تنزيلات الوسائط بايتات خام.
المصادقة
أنشئ مفتاحاً من الإعدادات ← مفاتيح API، ثم أرسله في ترويسة X-API-Key:
curl -H "X-API-Key: tgp_your_key_here" \
https://telegramos.net/api/accountsيُعرض المفتاح مرة واحدة فقط عند إنشائه. يُخزَّن على شكل تجزئة SHA-256، لذا لا يستطيع أحد — بمن فيهم نحن — استرجاعه. إن فقدته فأنشئ مفتاحاً جديداً.
| الخاصية | القيمة |
|---|---|
| الترويسة | X-API-Key |
| الصيغة | tgp_ متبوعة بـ 54 حرفاً آمناً في عناوين URL |
| مدة الصلاحية الافتراضية | 90 يوماً (expires_days، من 1 إلى 365) |
| عدد المفاتيح لكل مساحة عمل | 20 |
| الإلغاء | فوري، من الإعدادات ← مفاتيح API |
تغيير كلمة المرور أو إعادة تعيينها أو تعطيل المصادقة الثنائية أو تسجيل الخروج من كل الأجهزة يُلغي كل مفتاح صدر قبل تلك اللحظة، بشكل دائم.
أما جلسة المتصفح فتستخدم ملف تعريف ارتباط بدلاً من ذلك. المساران لا يختلطان أبداً: الطلب الذي يحمل X-API-Key يُصادَق عليه بذلك المفتاح وحده، وإدارة المفاتيح (/api-keys) ترفض المفاتيح عمداً — فلا يمكن لمفتاح أن يُنشئ مفتاحاً آخر أو يُلغيه (403).
الصلاحيات
الصلاحيات التي تحددها عند الإنشاء تُطبَّق على كل طلب.
الأفعال — واحد منها مطلوب دائماً:
| الصلاحية | تمنح |
|---|---|
read | GET، HEAD |
write | POST، PUT، PATCH، DELETE |
المجالات — اختيارية. المفتاح الذي لا يحدد أي مجال يصل إلى كل المجالات؛ والمفتاح الذي يحدد مجالاً أو أكثر يبقى محصوراً فيها:
| الصلاحية | تغطي |
|---|---|
accounts | الحسابات، البروكسيات، الإحماء، الاستخراج، مكتشف المجالات المتخصصة، الرسائل الجماعية المباشرة، حزم العملاء المحتملين |
inbox | المحادثات، الرسائل، المجموعات، الردود المحفوظة، قواعد الرد التلقائي، الإشعارات |
bots | البوتات، التدفقات، الحملات، مزامنات القنوات، قاعدة بيانات البوت |
analytics | نقاط نهاية التحليلات والذكاء الاصطناعي |
tasks | سير العمل وعمليات التنفيذ |
read وحدها تعني مفتاحاً للقراءة فقط على المنصة كلها. read + write + inbox تستطيع فعل أي شيء داخل صندوق الوارد فقط — وتحصل على 403 عند /api/accounts.
معرّفات الطلبات
كل استجابة تحمل ترويسة X-Request-ID. أرسل معرّفك الخاص ونحن نستخدمه؛ ولا ترسل شيئاً فنولّد واحداً:
curl -i -H "X-API-Key: $KEY" -H "X-Request-ID: my-job-42" \
https://telegramos.net/api/accounts
...
x-request-id: my-job-42يُسجَّل كل طلب من جهتنا بذلك المعرّف والمسار والحالة والمدة وبادئة المفتاح (وليس المفتاح نفسه أبداً) ومساحة العمل:
api.request service=account-service request_id=my-job-42 method=GET
path=/api/accounts status=200 duration_ms=144 auth=key:tgp_t24zIO user=<workspace>سجّل المعرّف من جهتك. ما دامت المنصة في مرحلة البيتا فهذه أسرع طريقة لنا للعثور على استدعائك بالضبط — اذكره في تذكرة دعم ونستطيع سحب مسار الطلب كاملاً دون تخمين.
الأخطاء
| الحالة | المعنى |
|---|---|
400 | طلب مشوَّه، أو معرّف في المسار ليس UUID |
401 | مفتاح مفقود أو غير معروف أو منتهي الصلاحية أو مُلغى |
402 | خطتك لا تتضمن هذه الميزة، أو المحفظة لا تغطي تكلفة التشغيل |
403 | مفتاح صالح، لكن صلاحياته لا تغطي هذا الاستدعاء |
404 | لا يوجد مورد بهذا المعرّف، أو أنه يخص مساحة عمل أخرى |
409 | الحساب لا يستطيع فعل ذلك الآن (مقيَّد بسبب السبام، أو ما زال في الإحماء) |
422 | نص الطلب لم يجتز التحقق — الاستجابة تسمّي الحقل |
429 | طلبات كثيرة جداً، أو الحساب بلغ ميزانية الإرسال الساعية/اليومية |
503 | إحدى التبعيات متوقفة؛ أعد المحاولة |
الأخطاء تحمل حقل detail:
{"detail": "This API key is scoped to inbox — not 'accounts'."}كائن مساحة عمل أخرى يُعيد 404 وليس 403 أبداً — فواجهة API لا تؤكد أبداً وجود معرّف ما.
الاصطلاحات
- المعرّفات هي UUID. أي مقطع مسار ليس UUID يُعيد
400أو404، وليس 500 أبداً. - الإرسال يوضع في طابور، وليس متزامناً. نقاط النهاية التي تجعل الحساب يقوم بفعل تُعيد
202معtask_id. ثم يُرسل الحساب وفق قواعد الإيقاع المضادة للحظر (انظر الحدود والحصص). استعلم عن المورد لرؤية النتيجة. - كل شيء محصور بمساحة العمل. لا تمرّر معرّف مساحة عمل أبداً؛ فالمفتاح يحمله.
- نقاط نهاية القوائم تقبل
limit/offsetأوpage/page_sizeبحسب المورد؛ وكلاهما اختياري.
الحسابات
المجال: accounts.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/accounts | عرض قائمة الحسابات |
POST | /api/accounts | إضافة حساب |
GET | /api/accounts/{id} | حساب واحد |
PATCH | /api/accounts/{id} | إعادة التسمية، إعادة الوسم، تغيير الإعدادات |
DELETE | /api/accounts/{id} | إزالة حساب |
POST | /api/accounts/import | استيراد ملف جلسة |
POST | /api/accounts/batch-import | استيراد عدة حسابات دفعة واحدة |
POST | /api/accounts/login/phone/send-code | بدء تسجيل دخول بالهاتف |
POST | /api/accounts/login/phone/verify-code | إرسال الرمز |
POST | /api/accounts/login/phone/verify-2fa | إرسال كلمة مرور المصادقة الثنائية |
POST | /api/accounts/login/qr/start | بدء تسجيل دخول بواسطة QR |
POST | /api/accounts/login/qr/poll | الاستعلام عنه (استعلام طويل، نحو 20 ثانية) |
POST | /api/accounts/login/cancel | التخلي عن تسجيل دخول |
POST | /api/accounts/{id}/power | إنامة الحساب أو إيقاظه |
POST | /api/accounts/{id}/safety | تخفيف حدود مكافحة الحظر أو إيقافها (الخطط المدفوعة) |
POST | /api/accounts/bulk/safety | الأمر نفسه، لكل الحسابات دفعة واحدة |
POST | /api/accounts/{id}/profile | تعيين الاسم والنبذة والصورة |
POST | /api/accounts/{id}/clone-profile | نسخ الملف الشخصي لحساب آخر |
GET | /api/accounts/{id}/privacy | إعدادات الخصوصية |
GET | /api/accounts/{id}/photos | صور الملف الشخصي |
GET | /api/accounts/{id}/stats | الرسائل المُرسلة/المُستلمة اليوم |
GET | /api/accounts/{id}/health-log | سجل درجة الصحة |
GET | /api/accounts/{id}/risk | قراءة مخاطر الحظر الحالية |
GET | /api/accounts/{id}/connections | سجل تدقيق الاتصالات |
GET | /api/accounts/{id}/sessions | طلبات تسجيل الدخول — للحسابات المستأجرة فقط |
GET | /api/accounts/{id}/vault | حالة خزنة الجلسة |
GET POST | /api/accounts/{id}/backfill-history | قراءة / بدء سحب المحادثات القديمة (?discover_only=true = قائمة المحادثات فقط) |
POST | /api/accounts/{id}/backfill-history/cancel | إيقاف سحب جارٍ |
POST | /api/accounts/{id}/reset-status | إعادة حساب في حالة error أو paused إلى active |
GET | /api/accounts/{id}/avatar | صورة الملف الشخصي، كبايتات |
DELETE | /api/accounts/{id}/photos/{photoId} | حذف صورة ملف شخصي واحدة |
POST | /api/accounts/{id}/username-check | هل اسم المستخدم متاح، قبل أن تحجزه |
POST | /api/accounts/{id}/contact-policy | قاعدة «شخص واحد، حساب واحد» — {"single_contact": false} تسمح لهذا الحساب بمراسلة شخص يتحدث معه حساب آخر من حساباتك بالفعل |
POST | /api/accounts/{id}/group-invites | إضافة أشخاص إلى مجموعة — انظر الملاحظة أدناه |
POST | /api/accounts/{id}/skip-warmup | إرجاع ساعة الإحماء إلى الوراء — الحسابات المملوكة في أي وقت، والحسابات المستأجرة بعد 3 أيام |
GET | /api/accounts/{id}/session/export | تنزيل الجلسة — للحسابات المملوكة فقط |
POST | /api/accounts/{id}/sessions/{hash}/decision | الموافقة على طلب تسجيل دخول أو رفضه |
POST | /api/accounts/bulk | تفعيل / تعطيل / حذف عدة حسابات دفعة واحدة |
POST | /api/accounts/bulk/listener | تشغيل مستمع الوارد أو إيقافه على مستوى الأسطول كله |
POST | /api/accounts/bulk/contact-policy | القاعدة نفسها عبر كل الحسابات |
يحمل كل صف حساب هوية الحساب نفسه على Telegram بمجرد اتصال العامل: tg_user_id (معرّف Telegram الرقمي)، وtg_username، وtg_first_name، وtg_last_name. وtg_user_id هو القيمة التي تظهر في peer_id عندما تشير محادثة شخص آخر إلى هذا الحساب.
تقع خزنة الجلسة تحت الحساب نفسه: POST /api/accounts/{id}/vault/enable، و/disable، و/lock، و/unlock، و/rotate، مع GET /api/accounts/{id}/vault للحالة الحالية.
ملاحظة/group-invitesهي أكثر نقاط النهاية صرامة في المنتج، لأن إضافة الأشخاص هي أسرع طريقة لخسارة حساب. ترفض بـ409ما لم يكن الحساب قد أنهى الإحماء، ويحمل حكماً نظيفاً من @SpamBot عمره أقل من 36 ساعة، وليس في وضع الرد فقط.
ملاحظة/sessionsمخصصة للحسابات المستأجرة. على حساب تملكه تُجيب بـ404 no live allocation for this account on your workspace— وهذه هي الإجابة الصحيحة، وليست عطلاً.
البروكسيات
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/proxies | عرض قائمة البروكسيات |
POST | /api/proxies | إضافة بروكسي |
POST | /api/proxies/bulk | إضافة عدة بروكسيات |
PATCH | /api/proxies/{id} | تعديل |
POST | /api/proxies/{id}/rotate | تدوير عنوان IP الخارج |
DELETE | /api/proxies/{id} | حذف |
PATCH DELETE | /api/proxies/{id}/assign | ربط حساب / فصله |
GET | /api/proxies/{id}/usage | حجم البيانات المستهلك |
POST | /api/proxies/{id}/check | اختبار الاتصال |
الإحماء
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET PUT | /api/warmup/settings | قراءة / استبدال إعدادات الإحماء |
GET | /api/warmup/overview | حالة إحماء الأسطول |
GET | /api/warmup/plan | الخطة المولَّدة |
POST | /api/warmup/plan/apply | تطبيقها |
DELETE | /api/warmup/plan | إسقاطها |
POST | /api/warmup/dry-run | معاينة دون تطبيق |
GET | /api/warmup/pairs | أي الحسابات تتحدث مع أيها |
GET | /api/warmup/groups | المجموعات في الخطة |
GET | /api/warmup/events | ما فعله الإحماء فعلياً |
GET POST | /api/warmup/channels | القنوات التي ينضم إليها الأسطول |
DELETE | /api/warmup/channels/{id} | إزالة قناة |
GET | /api/warmup/accounts | حالة الإحماء لكل حساب |
POST | /api/warmup/accounts/{id}/social | تبديل الإحماء الاجتماعي |
حدود مكافحة الحظر
كل آلية تقييد في واجهة API هذه — ميزانيات التواصل البارد والردود، ومنحنى تصاعد الإحماء، وإبطاء PeerFlood، والسقف اليومي للحملات، والتباعد داخل المجموعة الواحدة، والتأخيرات الشبيهة بالبشر — هي حماية المنصة نفسها، وليست من Telegram. على خطة مدفوعة يمكنك تغييرها أو إيقافها لكل حساب عبر POST /api/accounts/{id}/safety، أو لكل الحسابات دفعة واحدة عبر POST /api/accounts/bulk/safety:
{
"mode": "custom",
"cold_hourly": 30, "cold_daily": 200,
"reply_hourly": 120, "reply_daily": 600,
"per_minute": 6, "min_gap_seconds": 3,
"campaign_daily": 200, "group_spacing_minutes": 30,
"content_filter": true, "spam_circuit": true,
"warmup_ramp": false, "human_delay": true,
"trial_cap": true, "spambot_throttle": true,
"join_hourly": 40, "join_daily": 60,
"forward_hourly": 20, "forward_daily": 200,
"invite_hourly": 4, "invite_daily": 20,
"report_hourly": 5, "report_daily": 20,
"massdm_daily": 30, "massdm_delay_min": 45, "massdm_delay_max": 120,
"massdm_warmup_ramp": true, "massdm_flood_hold": true, "massdm_circuit": true
}mode تكون default (قواعد المنصة)، أو custom (الأرقام التي ترسلها؛ وكل ما تتركه يحتفظ بقيمة المنصة؛ و0 في per_minute أو min_gap_seconds أو campaign_daily أو group_spacing_minutes تعني بلا حد)، أو off (لا تقييد من جهة المنصة إطلاقاً). الأزواج join_* وforward_* وinvite_* وreport_* هي الميزانيات لكل إجراء؛ وحقول massdm_* تحكم موزّع الرسائل الجماعية المباشرة (massdm_daily ترفع السقف لكل حساب الذي يمكن لمهمة أن تطلبه، وmassdm_circuit تقرر ما إذا كانت المهمة تتوقف عندما تعود حساباتها مغمورة بالفيضان أو محظورة؛ وتبقى المهمة محمية ما دام أي من حساباتها يُبقي ذلك مفعّلاً). يعود الملف الحالي في حقل safety على كائن الحساب، ويسري مفعوله عند الإرسال التالي — دون إعادة اتصال. وتبقى قيود FloodWait والسبام الخاصة بـ Telegram نفسها سارية مهما ضبطت، ومخاطر حظر الحساب الذي خُففت حدوده تقع على عاتقك. الخطة المجانية تُجيب بـ 402. قاعدة «شخص واحد، حساب واحد» منفصلة عن هذا الملف وتبقى مفعّلة حتى في وضع off؛ بدّلها لكل حساب عبر /api/accounts/{id}/contact-policy.
الاستخراج
| الطريقة | المسار | الوظيفة |
|---|---|---|
POST GET | /api/scraping/jobs | بدء / عرض قائمة المهام |
GET | /api/scraping/jobs/{id} | الحالة |
POST | /api/scraping/jobs/{id}/cancel | إلغاء |
GET | /api/scraping/jobs/{id}/results | النتائج بصيغة JSON |
GET | /api/scraping/jobs/{id}/export | النتائج بصيغة .xlsx |
GET | /api/scraping/jobs/{id}/export.csv | النتائج بصيغة CSV |
POST | /api/scraping/jobs/{id}/webhook | دفع النتائج إلى عنوان URL الخاص بك |
GET | /api/scraping/usage | الحصة المستهلكة في هذه الفترة |
الاستخراج عملية سحب لمرة واحدة، وليس مراقبة: يمرّ حساب على سجل رسائل الهدف مرة واحدة ويستخرج أرقام الهواتف (أو الأنماط التي تعطيه إياها). قنوات البث تعمل كأهداف، لكن منشوراتها تأتي من القناة نفسها، لذا نادراً ما تُنتج عملية على قناة أي أرقام. لمتابعة ما تنشره قناة، استخدم مراقبة قناة بدلاً من ذلك. التجربة المجانية تحسب النتائج، وليس الرسائل المفحوصة، لذا فالعملية التي لا تجد شيئاً لا تكلّف شيئاً.
POST /api/scraping/jobs
{
"name": "leads",
"group_links": ["https://t.me/somepublicgroup"],
"limit_per_group": 300,
"max_accounts": 5,
"patterns": [],
"keyword_filter": []
}patterns الفارغة تعني أرقام الهواتف؛ والأنواع المسبقة الأخرى هي email وusername وurl وprice، والنمط custom يقبل تعبيرك النمطي الخاص. group_links تقبل المجموعات العامة والقنوات العامة على حد سواء.
العملية العميقة المدفوعة تُحاسب لكل رسالة مفحوصة وتُعيد 402 إذا كانت المحفظة لا تغطي أسوأ الحالات. أما التجربة المجانية فتُحسب بطريقة مختلفة: هي 50 نتيجة، لذا فالعملية التي لا تجد شيئاً لا تكلّفك شيئاً. وهي محدودة من الجهة الأخرى أيضاً — تتوقف العمليات المجانية بعد قراءة 2,000 رسالة إجمالاً، مهما أعادت. GET /api/scraping/usage يُبلغ عن العدّادين كليهما (used / limit و scanned / scan_limit).
مكتشف المجالات المتخصصة
| الطريقة | المسار | الوظيفة |
|---|---|---|
POST | /api/niche/suggest | اقتراحات كلمات مفتاحية |
POST GET | /api/niche/jobs | بدء / عرض قائمة المهام |
GET | /api/niche/jobs/{id} | الحالة |
GET | /api/niche/jobs/{id}/sources | أي المجموعات قرأها |
POST | /api/niche/jobs/{id}/cancel | إلغاء |
GET | /api/niche/jobs/{id}/results | الجمهور المكتشَف |
GET | /api/niche/jobs/{id}/export | الشيء نفسه، بصيغة .xlsx |
POST /api/niche/jobs
{
"name": "crypto traders",
"keywords": ["trading", "signals"],
"active_within_days": 30,
"msg_scan_limit": 3000,
"max_accounts": 5,
"extract_members": false
}extract_members يُفرغ قوائم الأعضاء الخام؛ وهو معطّل افتراضياً لأنه القراءة الأكثر خطورة من حيث الحظر.
حزم العملاء المحتملين والمراقبات الدورية
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/packages | الحزم المعروضة للبيع |
GET | /api/packages/{id} | حزمة واحدة |
POST | /api/packages/{id}/buy | شراؤها (يُخصم من المحفظة) |
GET | /api/packages/{id}/download | تنزيل حزمة مشتراة |
POST | /api/packages/{id}/publish | عرض إحدى حزمك للبيع |
DELETE | /api/packages/{id} | إزالتها من العرض |
GET | /api/watches/plans | خطط الاستخراج الدوري |
GET POST | /api/watches | عرض / إنشاء مراقبة دورية |
GET | /api/watches/{id} | مراقبة واحدة |
POST | /api/watches/{id}/pause | إيقاف مؤقت |
POST | /api/watches/{id}/resume | استئناف |
DELETE | /api/watches/{id} | حذف |
الرسائل الجماعية المباشرة
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/mass-dm/accounts | الحسابات المؤهلة للإرسال |
POST GET | /api/mass-dm/jobs | إنشاء / عرض قائمة الحملات |
GET | /api/mass-dm/jobs/{id} | التقدم |
GET | /api/mass-dm/jobs/{id}/recipients | الحالة لكل مستلم |
GET | /api/mass-dm/jobs/{id}/replies | من أجاب |
GET | /api/mass-dm/jobs/{id}/export | كل شيء، بصيغة .xlsx |
GET POST | /api/mass-dm/suppression | قائمة عدم التواصل |
DELETE | /api/mass-dm/suppression/{tgUserId} | إزالة مدخل واحد |
POST | /api/mass-dm/jobs/{id}/pause | إيقاف حملة جارية مؤقتاً |
POST | /api/mass-dm/jobs/{id}/resume | استئناف حملة متوقفة مؤقتاً |
POST | /api/mass-dm/jobs/{id}/cancel | إيقافها نهائياً |
GET | /api/mass-dm/contacts/{tgUserId} | ما نعرفه عن جهة اتصال |
POST /api/mass-dm/jobs
{
"recipients": [{"tg_user_id": 123456789, "username": "someone"}],
"message_text": "hi {first_name}",
"account_ids": ["<account-uuid>"],
"per_account_daily_cap": 20,
"followups": []
}قدّم إما recipients أو niche_job_id، وليس كليهما. قائمة الحجب تقبل قائمة:
POST /api/mass-dm/suppression
{"tg_user_ids": [777000777], "reason": "opted out"}صندوق الوارد
المجال: inbox.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/conversations | عرض قائمة المحادثات |
POST | /api/conversations | بدء محادثة جديدة (202) |
GET | /api/conversations/search | بحث نصي كامل (?q=) |
GET | /api/conversations/{id}/messages | الرسائل في محادثة |
POST | /api/conversations/{id}/messages | إرسال رد (202) |
PATCH | /api/conversations/{id} | إسناد، وسم، حل، كتم |
POST | /api/conversations/{id}/mark-read | تعليم كمقروء |
DELETE | /api/conversations/{id} | إزالة المحادثة |
POST | /api/conversations/media | رفع مرفق والحصول على media_key |
GET | /api/conversations/{id}/messages/{msgId}/media | تنزيل مرفق |
POST | /api/conversations/{id}/messages/{msgId}/fetch-media | سحب وسائط عنصر نائب |
GET POST | /api/conversations/{id}/notes | ملاحظات داخلية |
DELETE | /api/conversations/{id}/notes/{noteId} | حذف ملاحظة |
POST | /api/conversations/{id}/block | حظر الطرف الآخر |
POST | /api/conversations/{id}/leave | مغادرة المجموعة |
GET | /api/conversations/sla-stats | إحصاءات زمن الاستجابة |
GET | /api/conversations/account-stats | الأحجام لكل حساب |
GET | /api/conversations/activity-series | حجم الرسائل عبر الزمن |
GET | /api/conversations/reply-stats | معدل الرد — يحتاج ?source= |
مرشحات القائمة: account_id، وpeer_type (user / bot / group / channel)، وstatus، وtags، وunread_only، وsource (campaign / mass_dm)، وcampaign_id، وjob_id، وpage، وpage_size.
reply-stats تتطلب source=campaign&campaign_id=... أو source=mass_dm&job_id=...؛ ومن دونها تُجيب بـ 422/400 مع تسمية ما هو مفقود.
مراقبة قناة
قناة البث محادثة كأي محادثة أخرى — peer_type فيها هو channel — لكن منشوراتها تحتاج إلى اشتراك صريح. القناة المزدحمة قد تدفع مئات الميغابايتات يومياً عبر بروكسي الحساب، لذا يُسقط المستمع منشورات أي قناة لم تطلبها. ولهذا لا تُظهر القناة التي انضممت إليها شيئاً حتى تضيفها: ليس الأمر نقصاً في الدعم، بل هو معطّل عن قصد.
لتشغيل واحدة:
- انضم إلى القناة بأحد حساباتك (من داخل تيليجرام نفسه).
- أضفها إلى قائمة المراقبة:
POST /api/groupsمع الجسم{"identifier": "@thechannel", "type": "channel", "via_account_id": "<uuid>"}. - اقرأ المنشورات:
GET /api/conversations?peer_type=channelثمGET /api/conversations/{id}/messages?after_msg_id=<last seen>.
identifier يقبل @username عاماً، أو رابط t.me/name، أو معرّف طرف رقمياً. type قد يكون group أو supergroup أو channel؛ وأي قيمة تمرّرها تُصحَّح من Telegram عند المزامنة الأولى، مع members_count وposts_per_day ومعرّف الطرف المعلَّم.
القنوات الخاصة ليس لها @username، ورابط الدعوة (t.me/+…) لا يحمل معرّف طرف، لذا لا يمكن لأي منهما تحديدها. زامن قائمة محادثات الحساب مرة واحدة فتظهر القناة بمعرّفها الرقمي، ثم تضيفها بالطريقة المعتادة:
POST /api/accounts/{account_id}/backfill-history?discover_only=true
→ registers the account's chats, pulls no messages, costs almost no proxy data
GET /api/conversations?peer_type=channel
→ the private channel is now listed, with its peer_id
POST /api/groups
{"identifier": "-1001234567890", "type": "channel", "via_account_id": "<uuid>"}في لوحة التحكم، التدفق نفسه هو منتقي القنوات في المجموعات ← تتبّع مجموعة.
بمجرد التتبّع، تصل المنشورات الجديدة كأي رسالة واردة أخرى: عبر حدث websocket inbox.new_message وعبر webhook مشترك فيه. القناة التي كتمتها في Telegram تظل توصّل كليهما، مع conversation.muted: true، فلا يفوّت التكامل منشوراً أبداً؛ ولوحة التحكم وحدها تبقى صامتة.
peer_type له أربع قيم: user وbot وgroup وchannel. المجموعات الفائقة تكون group — الفرق لا يهم إلا في /api/groups، التي تُبلغ عن supergroup بعد مزامنتها الأولى.
بمجرد مراقبة قناة، تصل منشوراتها كأي رسالة أخرى: في GET /api/conversations/{id}/messages، وعبر حدث websocket inbox.new_message، ومن خلال webhook مشترك في inbox.new_message.
أمران *ليسا* هذه الميزة: /api/channel-syncs تعكس المنشورات من قناة إلى قناة أخرى تتحكم فيها (هي أداة إعادة توجيه، وليست قارئاً)، و /api/warmup/channels هي قائمة القنوات التي ينضم إليها حساب جديد أثناء الإحماء. لا يُعيد أي منهما محتوى القنوات. POST /api/groups/{id}/sync تحدّث أعداد الأعضاء والمنشورات فقط — ولا تجلب المنشورات.
متابعة محادثة
تُسجَّل الرسائل الواردة فقط للحسابات التي يكون مستمع الرسائل فيها مفعّلاً. الحساب الذي يحمل power_sender_only: true في GET /api/accounts يُرسل ولا يستلم أبداً، لذا تبقى محادثاته فارغة مهما استعلمت — فعّل المستمع له أولاً.
GET /api/conversations/{id}/messages تُصفّح إلى الخلف افتراضياً (before، وbefore_msg_id، وlimit حتى 200) — وهذا ما تريده واجهة المستخدم عندما تمرّر لأعلى.
أما المراقب فيريد العكس. مرّر after_msg_id مع telegram_msg_id لأحدث رسالة تحتفظ بها بالفعل فتحصل على ما وصل منذ ذلك الحين فقط، الأقدم أولاً:
GET /api/conversations/{id}/messages?after_msg_id=19626585&limit=200telegram_msg_id يتزايد بشكل رتيب داخل المحادثة، لذا لا يكرّر المؤشر رسالة أبداً ولا يتخطى واحدة. احتفظ بأعلى معرّف رأيته، واستعلم به، فلا يبقى ما تحتاج إلى إزالة تكراره. after_msg_id يتجاوز before/before_msg_id إذا أرسلت كليهما.
كل رسالة تحمل direction: in للرسائل التي استلمها الحساب، وout للرسائل المُرسلة عبر هذه المنصة. الرسائل المكتوبة يدوياً في عميل Telegram على الحساب نفسه لا تُسجَّل — إذ يوصّلها Telegram كتحديثات صادرة خاصة بك ويتجاهلها المستمع.
للدفع بدلاً من الاستعلام الدوري، انظر Webhooks والأحداث الفورية أدناه.
الإرسال
الرد داخل محادثة قائمة:
POST /api/conversations/{id}/messages
{"content": "Thanks — one moment.", "media_key": null}بدء محادثة مع شخص ليس في صندوق الوارد بعد:
POST /api/conversations
{
"account_id": "<account-uuid>",
"recipient_type": "username",
"recipient": "someone",
"content": "hello"
}recipient_type يكون username أو phone أو user_id. كلتا نقطتي النهاية تُجيبان بـ 202:
{"task_id": "...", "conversation_id": null, "queued": true,
"note": "Message queued. It will appear in the inbox once Telegram acknowledges the send."}تظهر الرسالة في GET /api/conversations/{id}/messages بمجرد أن يؤكدها Telegram — عادةً خلال ثوانٍ، وأطول إذا كان الحساب عند سقف إيقاعه الساعي.
تُجيب حمايات مكافحة الحظر قبل وضع أي شيء في الطابور، فتعامل معها:
- حساب مقيَّد بسبب السبام يبدأ محادثة باردة:
Telegram has limited this account, so it can't start new conversations right now — it can still reply to people who messaged it. - الحساب في مرحلة الإحماء لا يستطيع البدء، بل الرد فقط.
- مرشح المحتوى يرفض النص بـ
422ورمز بين قوسين مربعين —[REPEATED_CHARS]،[EXCESSIVE_CAPS]،[TOO_MANY_LINKS]،[BLOCKED_LINK]،[SPAM_PATTERN]. صحّح النص وأعد الإرسال؛ فإعادة إرسال النص نفسه تفشل دائماً. - ميزانية الإرسال المتحركة تُجيب بـ
429مع[HOURLY_MESSAGE_LIMIT]أو[DAILY_MESSAGE_LIMIT]. التواصل البارد محدود بـ 10 رسائل في الساعة و40 في اليوم لكل حساب. وبمجرد أن يردّ الطرف الآخر، تُحسب كل رسالة لاحقة في تلك المحادثة رداً وتحصل على 60 في الساعة و300 في اليوم بدلاً من ذلك — سواء أرسلتها عبرPOST /api/conversations/{id}/messagesأو واصلت استدعاءPOST /api/conversationsبالمستلم نفسه. النافذة الساعية تتحرك باستمرار، لذا تراجع بدلاً من إعادة كتابة الرسالة. الحساب الذي انخفضت درجة صحته يحصل على ميزانية أصغر بشكل متناسب. الخطط المدفوعة تستطيع تغيير هذه الميزانيات أو إزالتها لكل حساب — انظر حدود مكافحة الحظر؛ والملف المخصص يضيف[MINUTE_MESSAGE_LIMIT]و[MESSAGE_GAP_LIMIT]إلى رموز429المحتملة.
فقط 202 تعني أن الإرسال في طريقه. وإذا فشل لاحقاً رغم ذلك — حظر المستلم الحساب، أو انقطع الحساب عن الاتصال — يصل السبب في webhook من نوع inbox.message_failed يحمل task_id نفسه.
المجموعات والردود والقواعد والإشعارات
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/groups | المجموعات والقنوات المتتبَّعة |
PATCH DELETE | /api/groups/{id} | تعديل / إلغاء التتبّع |
POST | /api/groups/{id}/sync | تحديث أعداد الأعضاء والمنشورات |
GET | /api/groups/{id}/stats | النشاط |
GET POST | /api/saved-replies | الردود الجاهزة |
PUT DELETE | /api/saved-replies/{id} | تعديل / حذف |
GET POST | /api/auto-reply-rules | قواعد الرد التلقائي |
POST | /api/auto-reply-rules/bulk | إنشاء عدة قواعد |
PATCH DELETE | /api/auto-reply-rules/{id} | تعديل / حذف |
GET | /api/notifications | تدفق الإشعارات |
GET | /api/notifications/unread-count | عدد الشارة |
PATCH | /api/notifications/read-all | تعليم الكل كمقروء |
GET PUT | /api/notifications/preferences | التفضيلات لكل فئة |
PATCH | /api/notifications/{id}/read | تعليم إشعار واحد كمقروء |
DELETE | /api/notifications/{id} | تجاهل إشعار واحد |
GET POST | /api/api-connectors | موصّلات الرد الخارجية |
GET | /api/api-connectors/kinds | أنواع الموصّلات التي يمكنك إنشاؤها |
PATCH DELETE | /api/api-connectors/{id} | تعديل / إزالة |
POST | /api/api-connectors/{id}/test | اختبار موصّل |
GET | /api/conversations/{id}/avatar | صورة المحادثة، كبايتات |
GET | /api/conversations/{id}/peer-avatar | صورة الطرف الآخر |
POST /api/groups
{"identifier": "https://t.me/somepublicgroup", "type": "group", "via_account_id": "<uuid>"}
POST /api/saved-replies
{"title": "greeting", "content": "Hi {first_name}", "variables": ["first_name"]}
POST /api/auto-reply-rules
{
"account_id": "<account-uuid>",
"match_type": "contains",
"match_value": "price",
"reply_text": "Our pricing is on the site.",
"is_active": true,
"delay_min": 2,
"delay_max": 8
}match_type يكون واحداً من any أو exact أو contains أو regex.
البوتات
المجال: bots.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/bots | عرض / تسجيل البوتات |
DELETE | /api/bots/{id} | إزالة |
POST | /api/bots/{id}/active | تفعيل / تعطيل |
POST | /api/bots/{id}/delivery-mode | استعلام دوري أو webhook |
POST | /api/bots/{id}/broadcast | بث إلى محادثاته |
GET | /api/bots/{id}/chats | المحادثات التي يمكنه الوصول إليها |
GET POST | /api/bots/{id}/flows | التدفقات المرئية |
GET | /api/bots/flows/templates | قوالب البداية |
POST | /api/bots/{id}/flows/templates/{templateId}/instantiate | إنشاء تدفق من قالب |
GET PUT DELETE | /api/bots/{id}/flows/{flowId} | تدفق واحد |
POST | /api/bots/{id}/flows/{flowId}/test | تشغيله تجريبياً |
GET | /api/bots/{id}/runs | سجل تشغيلات التدفق |
GET | /api/bots/{id}/runs/{runId}/steps | التفاصيل لكل خطوة |
الحملات
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/campaigns | عرض / إنشاء (تُنشأ في حالة مسودة) |
GET | /api/campaigns/{id} | حملة واحدة |
POST | /api/campaigns/{id}/start | بدء |
POST | /api/campaigns/{id}/pause | إيقاف مؤقت |
POST | /api/campaigns/{id}/stop | إيقاف |
PATCH | /api/campaigns/{id}/assignments | إعادة إسناد الحسابات والمجموعات |
POST | /api/campaigns/{id}/import-chatlist | إضافة مجموعات مستهدفة بالجملة |
GET | /api/campaigns/{id}/metrics | الإرسالات والإخفاقات والوصول |
DELETE | /api/campaigns/{id} | حذف |
POST /api/campaigns
{
"name": "launch",
"message_a": {"text": "..."},
"message_b": {"link": "https://t.me/channel/123"},
"interval_minutes": 30,
"delay_min_seconds": 15,
"delay_max_seconds": 90,
"assignments": [{"account_id": "<uuid>", "group_chat_ids": [-1001234567890]}]
}الإنشاء لا يبدأها — استدعِ /start.
مزامنات القنوات وقاعدة بيانات البوت
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/channel-syncs | مرايا من قناة إلى قناة — تعيد توجيه المنشورات، ولا تقرأها لك |
GET PATCH DELETE | /api/channel-syncs/{id} | مرآة واحدة |
POST | /api/channel-syncs/{id}/arm | تسليح |
POST | /api/channel-syncs/{id}/disarm | نزع التسليح |
POST | /api/channel-syncs/{id}/run | تشغيل مرة واحدة الآن |
GET POST | /api/botdb/collections | المجموعات |
GET PUT DELETE | /api/botdb/collections/{id} | مجموعة واحدة |
GET POST | /api/botdb/collections/{id}/records | السجلات |
POST | /api/botdb/collections/{id}/query | ترشيح / ترتيب / تقسيم إلى صفحات |
PUT DELETE | /api/botdb/collections/{id}/records/{recordId} | سجل واحد |
GET POST | /api/botdb/collections/{id}/views | العروض المحفوظة |
POST /api/botdb/collections
{"name": "leads", "schema": {"fields": [{"key": "email", "type": "text"}]}}
POST /api/botdb/collections/{id}/records
{"data": {"email": "a@b.com"}}تعريفات الحقول تستخدم key (وليس name)، والسجل الذي يحتوي data فيه على مفتاح غير مُعلَن يُرفض مع unknown field(s): ....
التحليلات
المجال: analytics.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/analytics/summary | المجاميع للفترة |
GET | /api/analytics/daily | سلسلة يوماً بيوم |
GET | /api/analytics/timeline | الخط الزمني للأحداث |
GET | /api/analytics/accounts/{id}/timeline | الخط الزمني لحساب واحد |
GET | /api/analytics/velocity | سرعة الإرسال |
GET | /api/analytics/anomalies | الحالات الشاذة المكتشَفة |
GET | /api/analytics/anomalies/{accountId} | الحالات الشاذة لحساب واحد |
POST | /api/analytics/ai/anomalies/detect | تشغيل الاكتشاف الآن |
GET | /api/analytics/ai-insights | رؤى سردية عن الأسطول |
GET | /api/analytics/report | حِمل التقرير الكامل |
GET | /api/analytics/ai/summary | ملخص سردي بالذكاء الاصطناعي |
GET | /api/analytics/ai/daily-digest | الموجز اليومي (بالثواني، وليس بالميلي ثانية) |
POST | /api/analytics/ai/suggest-replies | اقتراحات ردود |
POST | /api/analytics/ai/summarize-conversation | تلخيص محادثة |
POST | /api/analytics/ai/sentiment | المشاعر في محادثة |
POST | /api/analytics/ai/send-risk | درجة مخاطر الحظر لمسودة |
POST | /api/analytics/ai/compose-message | صياغة رسالة |
POST | /api/analytics/ai/suggest-posts | أفكار محتوى |
POST | /api/analytics/ai/template-variations | توليد تنويعات لقالب |
GET | /api/analytics/ai/quota | رصيد الذكاء الاصطناعي المتبقي |
مع إيقاف مفتاح التحليلات في مساحة العمل، تُعيد هذه سلاسل فارغة بدلاً من خطأ. نقاط نهاية الذكاء الاصطناعي تستهلك من حصة الذكاء الاصطناعي: تحقق من /api/analytics/ai/quota أولاً، وتوقّع 429 بمجرد نفادها.
سير العمل
المجال: tasks.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/workflows | عرض / إنشاء |
GET PUT DELETE | /api/workflows/{id} | سير عمل واحد |
POST | /api/workflows/{id}/run | تشغيله الآن |
GET | /api/workflows/{id}/stats | أعداد التشغيلات ونسبة النجاح |
POST DELETE | /api/workflows/{id}/schedule | ربط / إزالة جدول cron |
GET | /api/executions | سجل التشغيلات |
POST | /api/executions | بدء تشغيل |
GET | /api/executions/{id} | تشغيل واحد |
GET | /api/executions/{id}/steps | الحالة لكل عقدة |
DELETE | /api/executions/{id} | إلغاء تنفيذ جارٍ |
POST /api/workflows
{"name": "nightly", "definition": {"nodes": [], "edges": []}}الدعم
بلا مجال — أي مفتاح يصل إلى هذه.
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET POST | /api/support/tickets | عرض / فتح تذكرة |
GET | /api/support/tickets/{id} | تذكرة واحدة مع محادثتها |
POST | /api/support/tickets/{id}/messages | الرد |
POST | /api/support/tickets/{id}/close | إغلاقها |
POST | /api/support/tickets/{id}/seen | تعليم المحادثة كمقروءة |
GET | /api/support/unread-count | عدد الشارة |
الهوية
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /auth/me | لمن يعود هذا المفتاح، والخطة |
تعديل الملف الشخصي (PATCH /auth/me)، مثل إدارة المفاتيح، يحتاج إلى جلسة متصفح — والمفتاح يُجيب بـ 403.
Webhooks
الـ webhook هو الطريقة المتينة لاستلام الأحداث: نكتب الحدث في قاعدة بياناتنا أولاً، ثم نرسله بطلب POST إلى عنوان URL الخاص بك ونعيد المحاولة عند الفشل. المقبس الذي انقطع أثناء نشرك يفقد الحدث؛ أما الـ webhook فلا.
أدرها من الإعدادات ← مفاتيح API ← Webhooks، أو عبر واجهة API (المجال inbox):
| الطريقة | المسار | الوظيفة |
|---|---|---|
GET | /api/webhooks | عرض نقاط النهاية الخاصة بك |
POST | /api/webhooks | تسجيل واحدة — تحمل الاستجابة سر التوقيع secret |
PATCH | /api/webhooks/{id} | تغيير عنوان URL أو قائمة الأحداث، أو إيقافها |
DELETE | /api/webhooks/{id} | إزالتها |
GET | /api/webhooks/events | فهرس الأحداث |
GET | /api/webhooks/{id}/secret | قراءة سر التوقيع مجدداً |
POST | /api/webhooks/{id}/rotate-secret | إصدار سر جديد |
POST | /api/webhooks/{id}/test | وضع تسليم webhook.test في الطابور (202) |
GET | /api/webhooks/{id}/deliveries | آخر عمليات التسليم، مع الحالة والخطأ |
POST /api/webhooks
{"url": "https://your-server.example/telegramos",
"events": ["inbox.new_message"],
"description": "prod monitor"}قائمة events الفارغة تعني كل الأنواع. حتى عشر نقاط نهاية لكل مستخدم؛ ويجب أن يكون عنوان URL عنوان http(s) عاماً (تُرفض العناوين الخاصة وعناوين الحلقة المحلية).
الأحداث
| النوع | يُطلق عندما |
|---|---|
inbox.new_message | وصلت رسالة إلى محادثة، أو أُرسلت منها |
inbox.message_failed | إرسال في الطابور لم يمرّ — يحمل error_code، وmessage مقروءة للبشر، وtask_id وrecipient |
inbox.read | عُلِّمت محادثة كمقروءة |
account.status_change | تغيّرت حالة حساب (active، paused، error، banned) |
account.health_update | تغيّرت درجة صحة حساب |
account.trust_changed | تغيّر مستوى ثقة حساب |
account.power_changed | أُنيم حساب أو أُوقظ |
account.presence | اتصل عامل حساب بـ Telegram أو انقطع عنه |
notification.new | صدر إشعار من المنصة |
webhook.test | فقط من زر/نقطة نهاية الاختبار |
إغلاق الحلقة على إرسال. الإرسال يُجيب بـ 202 مع task_id ولا شيء غيره — فما زال على الحساب تمريره عبر إيقاع Telegram. اشترك في كلٍّ من inbox.new_message وinbox.message_failed لتعرف أيهما حدث: يصل النجاح كرسالة بـ direction: "out"، والفشل كحدث inbox.message_failed يحمل task_id نفسه، وerror_code (blocked_by_user، privacy_restricted، account_offline، cannot_write، account_banned، …) وجملة يمكنك عرضها للمستخدم.
الطلب الذي نرسله
POST /your-path
Content-Type: application/json
X-TGP-Event: inbox.new_message
X-TGP-Delivery: 82a91c75-7446-4ebe-8f79-3013cceaa1d7
X-TGP-Timestamp: 1787308800
X-TGP-Signature: v1=<hex>
{"id": "<delivery id>", "type": "inbox.new_message",
"created_at": "2026-08-20T10:27:04+00:00",
"data": {"user_id": "...", "account_id": "...", "conversation_id": "...",
"message": {"id": "...", "direction": "in", "sender_id": 123, "sender_username": "...",
"content": "...", "sent_at": "..."},
"conversation": {"id": "...", "title": "...", "peer_id": 123,
"peer_username": "...", "peer_type": "channel", "muted": false}}}conversation.id ثابت لمحادثة حساب واحد مع طرف واحد، أياً كان اتجاه الرسالة: رسالة الحساب الصادرة والرد عليها يحملان conversation.id نفسه، لذا فهذا هو المفتاح الذي تشترك عليه. peer_id هو دائماً معرّف Telegram للطرف الآخر، وليس معرّف الحساب نفسه أبداً، وmessage.direction يقول من كتبها: out هو الحساب، وin هو الطرف الآخر. message.sender_id / message.sender_username يوضحان ذلك صراحةً: معرّف Telegram واسم المستخدم للطرف الآخر في in، ومعرّف الحساب نفسه في out (null لعضو مجموعة أو قناة، الذي لا نحمل هويته). حسابان من حساباتك يتحدثان معاً يُنتجان محادثتين (واحدة لكل حساب)، لكل منهما معرّفها الخاص.
التحقق من التوقيع. HMAC-SHA256 على {timestamp}.{raw body} بسرّك، مقارناً بالقيمة الست عشرية بعد v1=. استخدم البايتات الخام — فإعادة تسلسل JSON تغيّرها.
import hmac, hashlib
def verify(secret: str, headers, raw_body: bytes) -> bool:
ts = headers["X-TGP-Timestamp"]
expected = "v1=" + hmac.new(
secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(headers["X-TGP-Signature"], expected)الطابع الزمني داخل المادة الموقَّعة، لذا ارفض أي شيء أقدم من بضع دقائق فلا يمكن إعادة تشغيل تسليم مُلتقَط ضدك لاحقاً.
قواعد التسليم
- أي
2xxيُحسب قبولاً. أجب بسرعة وقم بالعمل بعد ذلك — فنحن نتخلى عن الطلب بعد 10 ثوانٍ ونعتبره فشلاً. - الإخفاقات تُعاد المحاولة فيها بعد 10 ثوانٍ، ودقيقة، و5 دقائق، و30 دقيقة، وساعتين — ست محاولات إجمالاً — ثم يُعلَّم التسليم بـ
failed. - خمسة أحداث متتالية تستنفد كل المحاولات تُوقف نقطة النهاية؛ وتُظهر لوحة التحكم السبب. إعادة تشغيلها تُصفّر العدّاد.
- لا تُتبَع عمليات إعادة التوجيه. وجّهنا إلى عنوان URL النهائي.
- معرّف التسليم ثابت عبر المحاولات — اعتمد عليه في إزالة التكرار.
- تُحفظ سجلات التسليم الناجحة 7 أيام، والفاشلة 30 يوماً.
الأحداث الفورية
تبثّ لوحة التحكم التحديثات الحية عبر Socket.IO:
wss://telegramos.net/wsصادِق بـ JWT للجلسة (auth.token)، أو ملف تعريف ارتباط الجلسة، أو مفتاح API — مرّره في auth.apiKey أثناء المصافحة أو في ترويسة X-API-Key. يحتاج المفتاح إلى read، وإذا كان محصوراً بمجالات أصلاً فيجب أن يتضمن inbox.
import { io } from 'socket.io-client'
const socket = io('https://telegramos.net', {
path: '/ws',
transports: ['websocket'],
auth: { apiKey: process.env.TGP_API_KEY },
})
socket.on('inbox.new_message', (e) => console.log(e.conversation_id, e.message.content))تصل الأحداث كرسائل Socket.IO مسمّاة: system.connected عند الاتصال، ثم inbox.new_message وnotification.new وaccount.status_change وaccount.power_changed وما شابهها؛ اشترك في حساب واحد عبر subscribe:account.
أمران يجب معرفتهما قبل أن تبني عليه:
- المتصفحات مقيَّدة. تتحقق المصافحة من
Origin، ونطاقاتنا وحدها مسموح بها. العميل من جهة الخادم لا يُرسلOriginويتصل دون مشكلة؛ أما صفحة على نطاقك الخاص فتُرفض. مرّر الاتصال عبر الواجهة الخلفية لديك. - المقبس يوصّل مرة واحدة. كل ما يُنشر أثناء انقطاعك يضيع. استخدم webhooks للتسليم الذي لا يمكنك تحمّل فقدانه، أو صالِح عند إعادة الاتصال بـ
after_msg_id.
ما لا تغطيه واجهة API
- الفرق والفوترة والمحفظة والسوق متاحة للجلسة فقط:
/wallet، و/payments/*، و/subscriptions/*، و/billing/*، و/bundles/purchase، و/account-resale/*، و/referrals/*، و/teams/*تُجيب بـ401لمفتاح API أياً كان نطاقه. لا يوجد مسار عبر مفتاح لإنفاق المال أو استئجار حساب أو تغيير المقاعد — افعل ذلك في لوحة التحكم. الاستثناءان هما قراءتا الفهرس العامGET /listingsوGET /bundles/availability، اللتان لا تحتاجان إلى أي مصادقة إطلاقاً. - لا توجد SDK. HTTP خام؛ استخدم أي عميل لديك.
- لا حد للمعدل لكل مفتاح. الطلبات زهيدة، لكن الإجراءات وراءها تُضبط إيقاعياً لكل حساب بحدود مكافحة الحظر في الحدود والحصص، لذا فدفعة من الإرسالات توضع في الطابور بدلاً من أن تنطلق.
مثال عملي
الرد على أحدث محادثة غير مقروءة والانتظار حتى يصل الإرسال:
KEY="tgp_your_key_here"
BASE="https://telegramos.net"
CONV=$(curl -s -H "X-API-Key: $KEY" \
"$BASE/api/conversations?unread_only=true&page_size=1" \
| python3 -c "import sys,json; print(json.load(sys.stdin)[0]['id'])")
curl -s -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-H "X-Request-ID: reply-$CONV" \
-d '{"content":"Thanks for reaching out — one moment."}' \
"$BASE/api/conversations/$CONV/messages"
# -> 202 {"task_id": "...", "queued": true, ...}
curl -s -H "X-API-Key: $KEY" "$BASE/api/conversations/$CONV/messages" | tail -c 400مراقبة محادثة
ثلاثة أجزاء متحركة، بالترتيب الذي تُعدّها به.
1. أعد التعبئة مرة واحدة، إذا أردت السجل. POST /api/accounts/{id}/backfill-history تضع في الطابور استيراداً لمرة واحدة للمحادثات القائمة (الحسابات المملوكة، بلا وسائط، حتى 1000 رسالة لكل محادثة؛ وقنوات البث تُشمل فقط بعد تتبّعها عبر POST /api/groups). استعلم عن GET /api/accounts/{id}/backfill-history حتى تصير state هي done — الحالات هي queued وrunning وdone وcancelled، وidle تعني أنه لا مهمة مسجَّلة (إما لم تبدأ أبداً أو انتهت صلاحية الحالة بعد 6 ساعات). شغّلها مرة واحدة لكل حساب؛ فهي ثقيلة على بيانات البروكسي وكل ما بعدها يصل من تلقاء نفسه.
2. خذ التدفق الحي. سجّل webhook لحدث inbox.new_message. لا يلزم شيء آخر لتستمر الرسائل في التدفق إلى صندوق الوارد — فعامل الحساب يستمع بالفعل.
3. صالِح. بعد أي انقطاع من جهتك، تقدّم في كل محادثة إلى الأمام بـ after_msg_id من آخر معرّف خزّنته. هذا يُغلق الفجوة دون إعادة قراءة المحادثة.
KEY="tgp_your_key_here"
BASE="https://telegramos.net"
curl -s -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"url":"https://your-server.example/telegramos","events":["inbox.new_message"]}' \
"$BASE/api/webhooks"
# -> 201 {"id": "...", "secret": "whsec_...", ...} <- store the secret
curl -s -H "X-API-Key: $KEY" \
"$BASE/api/conversations/$CONV/messages?after_msg_id=$LAST_SEEN&limit=200"