Social

جميع نقاط نهاية Social: العلامات التجارية، وروابط الاتصال المستضافة، والنشر الفردي والجماعي، والجدولة، والإحصاءات، والحد الأقصى للاتصالات الذي يحكم كل ذلك.

تنشر Social API على Facebook وInstagram وX وLinkedIn وPinterest. يقوم النموذج بأكمله على كائنين. العلامة التجارية هي الهوية التي تنشر باسمها: اسم، ومنطقة زمنية، وحسابات تواصل اجتماعي مرتبطة بها. الاتصال هو حساب تواصل اجتماعي واحد مُصرَّح بالوصول إليه، مرتبط بعلامة تجارية واحدة على منصة واحدة. تتيح خطة API عددًا غير محدود من العلامات التجارية دون أي تكلفة. الاتصالات هي ما تقيس الخطة استخدامه، لذا فإن الحد الأقصى للاتصالات هو القيد الذي ينبغي مراعاته في التصميم.

لا يمكن ربط حساب من خادمك. يجب أن يمنح المستخدم النهائي التصريح على المنصة، لذا تطلب رابطًا مستضافًا وتعيد توجيهه إليه. النشر غير متزامن: تُرجع كل استدعاءات الإنشاء استجابتها بمجرد قبول المنشور، وتستعلم دوريًا عن النتيجة لكل قناة.

نظرة سريعة على نقاط النهاية

الطريقةالمسارالوظيفةالمرجع
POST/social/brandsإنشاء علامة تجارية.إنشاء علامة تجارية
GET/social/brandsصفحة من العلامات التجارية التابعة للحساب.سرد العلامات التجارية
GET/social/brands/{brandId}علامة تجارية واحدة بتفاصيلها الكاملة.جلب علامة تجارية
POST/social/brands/updateتغيير حقول علامة تجارية موجودة.تحديث علامة تجارية
POST/social/brands/archiveأرشفة علامة تجارية واتصالاتها.أرشفة علامة تجارية
POST/social/brands/{brandId}/connections/linkعنوان URL مستضاف لربط منصة واحدة.جلب رابط اتصال
GET/social/brands/{brandId}/connectionsالحسابات المرتبطة بعلامة تجارية.سرد اتصالات علامة تجارية
POST/social/connections/disconnectإزالة اتصال واحد.فصل اتصال
POST/social/postsإنشاء مسودة منشور واحد أو جدولته أو نشره.إنشاء منشور على وسائل التواصل الاجتماعي
GET/social/posts/{postId}منشور واحد مع حالة النشر لكل قناة.جلب منشور على وسائل التواصل الاجتماعي
GET/social/brands/{brandId}/postsصفحة من منشورات علامة تجارية.سرد منشورات علامة تجارية
POST/social/posts/cancelإلغاء منشور لم يُنشر بعد.إلغاء منشور مجدول
GET/social/posts/{postId}/insightsأعداد التفاعلات والتعليقات لقناة واحدة.جلب إحصاءات المنشور وتعليقاته
POST/social/bulk-postsما يصل إلى 500 منشور في طلب واحد.إنشاء منشورات بشكل جماعي
GET/social/bulk-posts/{bulkJobId}حالة مهمة نشر جماعي ونتائج كل صف.جلب مهمة نشر جماعي
GET/social/limitsالحد الأقصى للاتصالات والمقدار المستهلك منه.جلب حدود خطة Social واستخدامها

قيم ستستخدمها في كل موضع

الحقلالقيم المقبولة
platforms[] وchannelFACEBOOK, INSTAGRAM, TWITTER (X), LINKEDIN, PINTEREST
actionDRAFT, SCHEDULE, PUBLISH

قيم المنصات هي أسماء enum مكتوبة بأحرف كبيرة. يُرفض إرسال "instagram". تشير TWITTER إلى X؛ لم يتغير اسم enum عندما تغير اسم المنتج.

إنشاء علامة تجارية

POST /social/brands

الحقلان profileName وtimezone مطلوبان. المنطقة الزمنية كائن، وtzCode هو الحقل المهم: فهو معرّف IANA المستخدم لتفسير كل قيمة من قيم scheduleDate وscheduleTime في منشورات هذه العلامة التجارية. المفاتيح الثلاثة الأخرى هي تسميات للعرض.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "profileName": "Jenny Home",      "timezone": {        "label": "(GMT-05:00) Eastern Time",        "tzCode": "America/New_York",        "name": "Eastern Standard Time",        "utc": "-05:00"      },      "categories": ["Furniture Store"],      "siteUrl": "https://jennyhome.example"    }  }'

احتفظ بمعرّف العلامة التجارية المُعاد. فهو رمز المسار brandId في كل نقطة نهاية أخرى للعلامات التجارية، وحقل جسم الطلب socialProfileId عند النشر.

سرد العلامات التجارية وقراءتها

تُرجع GET /social/brands صفحة من العلامات التجارية. تُرجع GET /social/brands/{brandId} علامة تجارية واحدة بتفاصيلها الكاملة.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/brands?page=1&size=25"

إذا أُعيدت SY95043 عند استخدام معرّف، فإن العلامة التجارية التي يشير إليها إما غير تابعة لهذا الحساب أو مؤرشفة بالفعل.

تحديث علامة تجارية

POST /social/brands/update

يُوضَع معرّف العلامة التجارية في جسم الطلب ضمن input.profileId، وليس في المسار. أرسل فقط الحقول التي تغيّرها؛ فأي حقل تحذفه من الطلب يحتفظ بقيمته الحالية.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/update \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"profileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "bio": "Handmade furniture for real homes."}}'

أرشفة علامة تجارية

POST /social/brands/archive

يجب أن يكون قد مضى 90 يومًا على إنشاء العلامة التجارية قبل أن يمكن أرشفتها. قبل انقضاء هذه المدة، يُرفض الاستدعاء مع SY95051 ولا يتغير شيء. بمجرد انقضاء المدة المطلوبة، تسري الأرشفة فورًا وتؤرشف جميع الاتصالات التابعة للعلامة التجارية في الوقت نفسه.

تتوقف هذه الاتصالات عن النشر فورًا، لكن خاناتها تظل محتسبة حتى نهاية فترة الفوترة، تمامًا كما يحدث عند قطع الاتصال يدويًا. الأرشفة ليست وسيلة لإتاحة سعة اليوم.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/archive \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902"}}'

POST /social/brands/{brandId}/connections/link

هذه هي الطريقة الوحيدة لإضافة اتصال. تتضمن الاستجابة url مستضافًا وصالحًا لمدة expiresIn ثانية. أعد توجيه المستخدم النهائي إليه، ليمنح التفويض على المنصة، ثم يُعاد إلى redirectUrl لديك مع النتيجة في سلسلة الاستعلام. مرّر errorUrl لتمييز حالات الإلغاء عن حالات النجاح، وstate لتمرير قيمة الربط الخاصة بك خلال إعادة التوجيه ذهابًا وإيابًا.

تذكّر أن جسم هذا الطلب مسطّح، دون غلاف input.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/connections/link \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "channel": "INSTAGRAM",    "redirectUrl": "https://app.example.com/social/connected",    "errorUrl": "https://app.example.com/social/failed"  }'
JSON
{  "data": {    "connectSocialAccount": {      "status": "success",      "url": "https://social.listingsapi.com/connect/start?token=bfac8e06-8d72-4810-9c50-ae7ee12a7b52",      "expiresIn": 900    }  }}

تحقّق من status قبل إعادة التوجيه. لا تُرجع استجابة failed أي url، وتضع السبب في title، وغالبًا ما يكون بلوغ الحد الأقصى للاتصالات (SY95042) أو منصة غير متاحة للحساب (SY95044).

عرض قائمة اتصالات علامة تجارية

GET /social/brands/{brandId}/connections

يُرجع الحسابات المرتبطة بالعلامة التجارية، مع id لكل حساب، وهو ما تحتاج إليه للنشر عبر اتصال محدد أو لقطعه.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/connections

قطع اتصال

POST /social/connections/disconnect

يأخذ id الخاص بالاتصال من القائمة أعلاه. يتوقف الحساب عن النشر فورًا، لكن الخانة التي كان يشغلها لا تُعاد إلى السعة المتاحة حتى تنتهي فترة الفوترة. إعادة توصيل الحساب نفسه بالعلامة التجارية نفسها خلال هذه الفترة تعيد استخدام تلك الخانة دون أي تكلفة؛ أما ربطه بعلامة تجارية مختلفة فيشغل خانة ثانية.

Shell
curl -X POST https://listingsapi.com/api/v4/social/connections/disconnect \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialProfileConnectedChannelId": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7"}}'

نشر منشور

POST /social/posts

ينشر استدعاء واحد المحتوى نفسه على كل منصة في platforms. يجب أن يكون لكل منصة من هذه المنصات اتصال قائم بالفعل بالعلامة التجارية، وإلا فسيُرجع الاستدعاء SY95045. يتطلب Instagram وPinterest عنصرًا واحدًا على الأقل في mediaUrls.

جدوِل المنشور بإحدى طريقتين، ولا تستخدمهما معًا أبدًا. scheduledAt هو طابع زمني بتنسيق ISO-8601 يتضمن إزاحة زمنية. يُرسَل scheduleDate وscheduleTime معًا، ويُفسَّران وفق المنطقة الزمنية للعلامة التجارية. يؤدي إرسال الطريقتين معًا، أو تحديد موعد جدولة في الماضي، إلى إرجاع SY95046.

Shell
curl -X POST https://listingsapi.com/api/v4/social/posts \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",      "name": "Autumn collection launch",      "platforms": ["INSTAGRAM", "FACEBOOK"],      "content": "Our autumn collection lands today.",      "mediaUrls": ["https://cdn.example.com/social/autumn-collection.jpg"],      "action": "SCHEDULE",      "scheduleDate": "2026-10-02",      "scheduleTime": "09:30",      "clientReference": "campaign-4471-slot-01"    }  }'

اضبط clientReference على المعرّف الخاص بك. يُخزَّن هذا المعرّف ويُرجَع، مما يتيح لك مطابقة المنشور مع سجلاتك دون الاحتفاظ بـ UUID.

قراءة منشور واحد

GET /social/posts/{postId}

بهذه الطريقة تعرف ما إذا كان النشر قد نجح. يمثّل status الخاص بالمنشور ملخصًا؛ أما النتيجة الفعلية فتظهر لكل قناة في connectedChannels، حيث يتضمن كل عنصر status الخاص به، وliveLink بمجرد أن تقبل المنصة المنشور، وreason أو error عندما لا تقبله.

JSON
{  "connectedChannels": [    {      "platform": "INSTAGRAM",      "status": "SUCCESS",      "liveLink": "https://www.instagram.com/p/CxYz1234abc/",      "error": null    }  ]}

كرّر الاستعلام عن هذا المورد بعد إرسال PUBLISH. قد تفشل قناة واحدة بينما تنجح القنوات الأخرى، لذا تحقّق من كل عنصر بدلًا من الاكتفاء بـ status في المستوى الأعلى.

عرض قائمة منشورات علامة تجارية

GET /social/brands/{brandId}/posts

صفحة من منشورات العلامة التجارية، مع عوامل تصفية لتضييق النتائج بحسب الحالة. استخدمها لمطابقة السجلات على دفعات بدلًا من الاستعلام الدوري عن المعرّفات واحدًا تلو الآخر.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/posts?page=1&size=25"

إلغاء منشور مجدول

POST /social/posts/cancel

يلغي منشورًا لم يُنشر بعد. لا يمكن سحب منشور منشور بالفعل على منصة من خلال نقطة النهاية هذه.

Shell
curl -X POST https://listingsapi.com/api/v4/social/posts/cancel \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialPostId": "a3f81c62-9d4e-4a17-b5c0-2e7f6d8a9b10"}}'

قراءة الإحصاءات والتعليقات

GET /social/posts/{postId}/insights

أعداد التفاعلات والتعليقات لمنشور واحد على قناة واحدة. يجب تحديد القناة، لأن المنشور الذي يُنشر على ثلاث منصات تكون له ثلاث مجموعات منفصلة من الأرقام.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/posts/a3f81c62-9d4e-4a17-b5c0-2e7f6d8a9b10/insights?socialConnectedChannelId=b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7"

إنشاء منشورات على دفعات

POST /social/bulk-posts

يقبل من 1 إلى 500 صف في input.posts. كل صف هو الكائن نفسه الذي يقبله POST /social/posts بوصفه input، ويمكن أن تستهدف الصفوف علامات تجارية مختلفة في الطلب نفسه.

يُتحقق من صحة الدفعة بأكملها قبل إنشاء أي شيء. إذا فشل أي صف، فستتلقى SY95050 مع أخطاء لكل صف، ولن يُدرج أي شيء في قائمة الانتظار، لذا صحّح الأخطاء وأعد الإرسال. يؤدي إرسال أكثر من 500 صف إلى إرجاع SY95048، دون إنشاء أي شيء أيضًا. تُرجع الدفعة الصالحة مهمة للاستعلام الدوري عن حالتها.

Shell
curl -X POST https://listingsapi.com/api/v4/social/bulk-posts \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "name": "October launch batch",      "posts": [        {          "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",          "name": "Launch day",          "platforms": ["FACEBOOK"],          "content": "Doors open at nine.",          "action": "SCHEDULE",          "scheduleDate": "2026-10-02",          "scheduleTime": "09:00"        }      ]    }  }'

تُحتسب العملية الجماعية طلبًا واحدًا ضمن حد معدل الطلبات، مما يجعلها الطريقة الفعالة للدفعات الكبيرة.

الاستعلام الدوري عن مهمة جماعية

GET /social/bulk-posts/{bulkJobId}

يُرجع حالة المهمة مع نتائج لكل صف، بما في ذلك معرّف المنشور الذي أُنشئ لكل صف وأي صف فشل بعد إدراجه في قائمة الانتظار. لا يُحتفظ بالمهام إلى الأبد؛ فالاستعلام عن معرّف انتهت مدة الاحتفاظ به يُرجع SY95047.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/bulk-posts/f47ac10b-58cc-4372-a567-0e02b2c3d479

التحقق من الحدود والاستخدام

GET /social/limits

اقرأ هذا قبل إنشاء الاتصالات، بدلًا من قراءته بعد تلقي SY95042. قارن usage.connections بـ maxConnections: فهذا هو العدد الخاضع للفوترة، أي الاتصالات القائمة حاليًا مضافًا إليها الاتصالات التي أُزيلت سابقًا خلال هذه الفترة. يمثّل usage.connectionsActive الاتصالات النشطة في هذه اللحظة، ويمثّل usage.connectionsReleased مقدار السعة التي تُستعاد عند التجديد.

يُرجع brands القيمة null، مما يعني أنه غير محدود. لا يخضع عدد العلامات التجارية لقياس الاستخدام ضمن خطة API.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/limits

الأخطاء التي ستواجهها

الرمزالمعنىالإجراء المطلوب
SY90001لا يوجد اشتراك Social في الحساب.أضف منتج Social قبل استدعاء نقاط النهاية هذه.
SY95042تم بلوغ الحد الأقصى للاتصالات خلال فترة الفوترة هذه.قارن usage.connections بـ maxConnections. لا يزيل قطع اتصال مؤخرًا هذا الخطأ، لأن خانة الاتصال تظل محجوزة حتى نهاية الفترة.
SY95043لا توجد هذه العلامة التجارية في هذا الحساب، أو أنها مؤرشفة.أعد قراءة المعرّف من عرض قائمة العلامات التجارية.
SY95044المنصة غير مفعّلة للحساب.اختر منصة متاحة للحساب، أو تواصل مع الدعم.
SY95045ليس للعلامة التجارية اتصال بتلك المنصة.وجّه المستخدم عبر رابط اتصال، أو أزل المنصة من platforms.
SY95046الجدولة أو المنطقة الزمنية غير صالحة.أرسل scheduledAt أو أرسل scheduleDate مع scheduleTime، ولا ترسل الخيارين معًا مطلقًا.
SY95047لا توجد هذه المهمة الجماعية.أعد قراءة job.id من استجابة الإنشاء الجماعي.
SY95048أكثر من 500 صف.قسّم الدفعة. لم يُنشأ أي شيء.
SY95049عنوان URL لإعادة التوجيه غير صالح.يجب أن يكون كل من redirectUrl وerrorUrl عنوان URL مطلقًا يستخدم https.
SY95050فشل التحقق من صحة الدفعة.اقرأ الأخطاء الخاصة بكل صف، وصحّح تلك الصفوف، ثم أعد إرسال الدفعة.
SY95051لم يمضِ على إنشاء العلامة التجارية 90 يومًا.انتظر حتى يمضي على إنشائها 90 يومًا، ثم أرشفها.

تتوفر القائمة الكاملة في مرجع رموز الأخطاء.

الخطوات التالية

اقرأ الخطط والإضافات لمعرفة كيفية تفاعل الحد الأقصى للاتصالات وحزم الاتصالات التي تضم 5 اتصالات وقاعدة الأرشفة بعد 90 يومًا، واقرأ الاستجابة للأحداث باستخدام webhooks لتلقي أحداث social_post.* وsocial_connection.* بدلًا من الاستعلام الدوري.

تغطي حزمة Python SDK نقاط النهاية هذه عبر client.social.brands وclient.social.connections وclient.social.posts وclient.social.bulk؛ راجع مورد Social. لا تغطي حزمة Node SDK منتج Social بعد، لذا استدعِ نقاط نهاية REST مباشرةً من Node.