واجهة ONPChat البرمجية
انشر في قنواتك ومجموعاتك وصفوفك وسنترالاتك — من أي تطبيق أو خادم.
ملف OpenAPI 3.1: استورده مباشرة في Postman أو Insomnia، أو ولّد منه حزمة SDK للغتك.
curl https://api.onpchat.ir/v1/me \ -H "Authorization: Bearer $ONP_TOKEN"
const r = await fetch("https://api.onpchat.ir/v1/me", { headers: { "Authorization": `Bearer ${process.env.ONP_TOKEN}` }, }); const { ok, result } = await r.json();
import os, requests r = requests.get( "https://api.onpchat.ir/v1/me", headers={"Authorization": f"Bearer {os.environ['ONP_TOKEN']}"}, ) print(r.json())
$ch = curl_init("https://api.onpchat.ir/v1/me"); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("ONP_TOKEN")], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
بداية سريعة
- احصل على رمز. سجّل الدخول بحساب يدير ذلك الفضاء، ثم افتح:
المعرّف يتضمن بادئته ويجب ترميزه في الرابط — القناة
#1786551855736تصبح%231786551855736. إن لم يكن هناك رمز، يُنشأ في الحال. - جرّب الرمز.
- أرسل رسالة.
https://onpchat.ir/api/space/api-token?entity_id=<id>
curl -X POST https://api.onpchat.ir/v1/channels/%231786551855736/messages \ -H "Authorization: Bearer $ONP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"text":"Hello from the API"}'
await fetch( "https://api.onpchat.ir/v1/channels/%231786551855736/messages", { method: "POST", headers: { "Authorization": `Bearer ${process.env.ONP_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ text: "Hello from the API" }), }, );
import os, requests requests.post( "https://api.onpchat.ir/v1/channels/%231786551855736/messages", headers={"Authorization": f"Bearer {os.environ['ONP_TOKEN']}"}, json={"text": "Hello from the API"}, )
$url = "https://api.onpchat.ir/v1/channels/%231786551855736/messages"; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer " . getenv("ONP_TOKEN"), "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode(["text" => "Hello from the API"]), CURLOPT_RETURNTRANSFER => true, ]); curl_exec($ch);
المصادقة
لكل فضاء رمز مستقل يعمل على ذلك الفضاء فقط. أرسله في الترويسة:
?token=. هذه الواجهة للخوادم لا للمتصفحات، ولا ترسل ترويسات CORS. لا تضع الرمز في جافاسكربت جهة العميل — أي زائر يستطيع أخذه والنشر باسم فضائك. إذا تسرّب رمز فألغِه من اللوحة نفسها؛ يحلّ محلّه رمز جديد فوراً.Authorization: Bearer onp_2e09e8f0bb35088c795e5f75dc...
شكل الاستجابة
اعتمد شروطك على error.code لا على message. النص موجّه للبشر وقد يتغيّر، أما الرمز فلا.
{ "ok": true, "result": { ... } }
{ "ok": false, "error": {
"code": "invalid_token",
"message": "..."
} }
الفضاءات
هناك أربعة أنواع، ولكلٍّ بادئته. البادئة جزء من المعرّف ويجب ترميزها في الرابط.
| النوع | في المسار | البادئة | هل يظهر المُرسِل؟ |
|---|---|---|---|
| قناة | channels | # → %23 | لا — تُنشر باسم القناة |
| مجموعة | groups | @ → %40 | نعم |
| صف | classes | % → %25 | نعم |
| سنترال | santrals | & → %26 | نعم |
نقاط النهاية
| الطريقة | المسار | الوظيفة |
|---|---|---|
| GET | /v1/me | لأي فضاء يعود هذا الرمز |
| GET | /v1/{type}/{id} | تفاصيل الفضاء |
| GET | /v1/{type}/{id}/messages | سجل الرسائل |
| POST | /v1/{type}/{id}/messages | نشر رسالة |
السجل
الأحدث أولاً. الترقيم يعتمد seq لا الوقت — عدّاد تصاعدي يعطي ترتيباً قاطعاً حتى لرسالتين في اللحظة نفسها. مرّر next_cursor في before_seq للصفحة التالية؛ null يعني بلغتَ النهاية.
GET /v1/channels/%231786551855736/messages ?limit=30&before_seq=42
{
"ok": true,
"result": {
"messages": [
{
"id": "a1b2c3",
"text": "...",
"seq": 42,
"timestamp": 1788301362311
}
],
"next_cursor": 41
}
}
البطاقات (منشور أنيق)
بدل النص الخام يمكنك إرسال «بطاقة» — نفس ما يبنيه التطبيق عبر «إنشاء بطاقة»: غلاف وعنوان ونص ورابط في إطار واحد أنيق.
أرسل card بدل text. لا يجتمعان؛ والنص المرافق للبطاقة يوضع في caption.
| الحقل | إلزامي؟ | الوصف |
|---|---|---|
url | نعم | الرابط الذي تفتحه البطاقة |
title | لا | عنوان البطاقة |
description | لا | النص داخل البطاقة |
image | لا | الغلاف — يجب أن يكون رابط http/https كاملاً |
caption | لا | نص خارج البطاقة، بصوتك أنت |
يجب أن تكون الصورة مستضافة في مكان يمكن الوصول إليه من الإنترنت؛ الرفع غير متوفر في هذه النسخة. الروابط النسبية مرفوضة لأن البطاقة تُعرض على هاتف القارئ حيث لا يؤدي ذلك المسار إلى شيء.
curl -X POST https://api.onpchat.ir/v1/groups/%401786579451315/messages \ -H "Authorization: Bearer $ONP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "card": { "url": "https://example.com/post", "title": "...", "description": "...", "image": "https://example.com/cover.jpg", "caption": "..." } }'
await fetch(url, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ card: { url: "https://example.com/post", title: "...", description: "...", image: "https://example.com/cover.jpg", caption: "...", }, }), });
requests.post(
url,
headers={"Authorization": f"Bearer {token}"},
json={
"card": {
"url": "https://example.com/post",
"title": "...",
"description": "...",
"image": "https://example.com/cover.jpg",
"caption": "...",
}
},
)
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ "card" => [ "url" => "https://example.com/post", "title" => "...", "description" => "...", "image" => "https://example.com/cover.jpg", "caption" => "...", ], ]));
لا ترسل نسخاً مكرّرة
إذا انتهت مهلة الطلب فلن تعرف هل وصلت الرسالة. أرسل ترويسة Idempotency-Key حتى لا تُنشئ المحاولة الثانية رسالة مكرّرة:
المفتاح نفسه، الرسالة نفسها. ويصبح هذا المفتاح id الرسالة أيضاً.
Idempotency-Key: order-2026-09-02-001
حدود الاستخدام
لكل رمز، في كل دقيقة:
| العملية | الحد |
|---|---|
| نشر | 20 |
| قراءة | 120 |
كل استجابة تحمل X-RateLimit-Limit وX-RateLimit-Remaining وX-RateLimit-Reset. وعند 429 تصلك Retry-After — انتظر تلك المدة، لا أقل.
HTTP/2 429 X-RateLimit-Limit: 20 X-RateLimit-Remaining: 0 Retry-After: 37
الأخطاء
| HTTP | error.code | المعنى |
|---|---|---|
| 400 | empty_message | text فارغ |
| 400 | bad_request | جسم أو معامل غير صالح |
| 401 | missing_token | لا توجد ترويسة Authorization |
| 401 | invalid_token | الرمز غير معروف |
| 401 | revoked_token | الرمز مُلغى |
| 403 | entity_mismatch | هذا الرمز يعود لفضاء آخر |
| 403 | wrong_entity_kind | نوع الفضاء في المسار لا يطابق الرمز |
| 403 | missing_scope | الرمز لا يملك هذه الصلاحية |
| 403 | sender_not_member | مُنشئ الرمز لم يعد عضواً في الفضاء |
| 403 | read_only | القناة للقراءة فقط |
| 404 | entity_not_found | الفضاء غير موجود |
| 413 | message_too_long | النص أطول من ٨٠٠٠ حرف |
| 429 | rate_limited | بلغتَ حد الاستخدام |
sender_not_member؟ الرمز مرتبط بالمدير الذي أنشأه. إن غادر ذلك الشخص الفضاء توقّف النشر. الحل: يعيد أحد المديرين الحاليين توليد الرمز من اللوحة.غير متوفر في هذه النسخة
إرسال الصور والملفات، وحذف الرسائل عبر الواجهة، و webhooks (إشعارك بأحداث الفضاء) لم تصل بعد. الرموز تحمل حقل scopes من الآن، فعند إضافة webhooks لن يُلغى رمزك.