Social

أدر العلامات التجارية، واربط حسابات التواصل الاجتماعي، وانشر منشورات أو جدولها على Facebook وInstagram وX وLinkedIn وPinterest عبر client.social.

تندرج جميع دوال Social ضمن client.social، موزعة على أربعة نطاقات أسماء، بالإضافة إلى استدعاء واحد في المستوى الأعلى:

نطاق الأسماءما يديره
client.social.brandsالعلامات التجارية: الحاوية التي تتبع لها الحسابات المتصلة والمنشورات
client.social.connectionsحسابات Social المرتبطة بعلامة تجارية
client.social.postsالمنشورات الفردية: المسودات والجدولة والنشر والإلغاء والإحصاءات
client.social.bulkمنشورات متعددة في طلب واحد، على هيئة مهمة غير متزامنة
client.social.limits()الحد الأقصى للاتصالات والاستخدام الحالي

المعرّفات والمنصات والحالات

معرّفات العلامات التجارية والمنشورات والاتصالات هي سلاسل UUID نصية عادية. وعلى خلاف معرّفات المواقع، لا تُرمَّز مطلقًا باستخدام Base64، ولا تحوّلها SDK.

تُحدَّد المنصات بقيم التعداد المكتوبة بأحرف كبيرة FACEBOOK وINSTAGRAM وTWITTER (وهي X) وLINKEDIN وPINTEREST. حالات المنشورات هي DRAFT وPENDING وSCHEDULED وPUBLISHED وFAILED وARCHIVED وREJECTED؛ والحالات لكل قناة هي SCHEDULED وSUCCESS وERROR وARCHIVED.

تُرجع كل عملية كتابة علامة success

تُبلغ عمليات الكتابة في Social عن حالات فشل التحقق ضمن استجابة 200، على هيئة success: false مع ذكر السبب في error. تثير SDK استثناءات عند حدوث أخطاء في النقل وعند تلقي حمولات أخطاء تتعرف عليها، لكن يُنصح بالتحقق من success بنفسك دائمًا:

Python
result = client.social.brands.create(profile_name="Jenny Home", timezone=tz)if not result.success:  raise RuntimeError(result.error.message)

النشر غير متزامن

يقبل action="PUBLISH" المنشور ويُرجع id الخاص به. استعلم دوريًا باستخدام social.posts.retrieve() واقرأ connectedChannels[] للحصول على status وliveLink وerror لكل قناة؛ فقد ينجح نشر منشور على منصة ويفشل على أخرى في الاستدعاء نفسه.


social.brands.create

أنشئ علامة تجارية. لا يُطلب سوى profile_name وtimezone.

Python
client.social.brands.create(    *,    profile_name: str,    timezone: dict,    business_intent: str | None = None,    categories: list[str] | None = None,    site_url: str | None = None,    logo: str | None = None,    country_iso: str | None = None,    bio: str | None = None,    brand_hashtags: list[str] | None = None,    competitor_hashtags: list[str] | None = None,    content_preferred_language: str | None = None,) -> APIObject
الوسيطةالنوعالوصف
profile_namestrاسم العرض للعلامة التجارية. مطلوب.
timezonedict{"label", "tzCode", "name", "utc"}. يحدد tzCode المنطقة الزمنية وفق IANA التي تُفسَّر وفقها كل قيمة schedule_date / schedule_time لهذه العلامة التجارية. مطلوب.
business_intentstrما يقدمه النشاط التجاري، ويُستخدم لاقتراح المحتوى. القيمة الافتراضية هي general.
categorieslist[str]فئات النشاط التجاري. القيمة الافتراضية هي قائمة فارغة.
site_urlstrالموقع الإلكتروني للعلامة التجارية. يؤدي تعيينه إلى إضافة مهمة قراءة الموقع إلى قائمة الانتظار.
logostrعنوان URL عام عبر https لشعار العلامة التجارية.
country_isostrرمز البلد وفق ISO المكوّن من حرفين.
biostrنبذة قصيرة عن العلامة التجارية.
brand_hashtagslist[str]الوسوم المعروضة كاقتراحات في محرر المنشورات.
competitor_hashtagslist[str]وسوم المنافسين المراد تتبعها.
content_preferred_languagestrلغة المحتوى المُنشأ، e.g. en.
Python
result = client.social.brands.create(  profile_name="Jenny Home",  timezone={      "label": "(GMT-05:00) Eastern Time",      "tzCode": "America/New_York",      "name": "Eastern Standard Time",      "utc": "-05:00",  },  business_intent="A family-run home furnishings store selling handmade furniture.",  categories=["Furniture Store"],  site_url="https://jennyhome.example",)brand_id = result.socialProfile.id  # a plain UUID string

عدد العلامات التجارية غير محدود في خطط API، لذا لا تفشل هذه العملية أبدًا بسبب بلوغ حد أقصى. ما يُحتسب هو الاتصالات — تحقّق من social.limits() قبل إنشاء رابط اتصال، وليس قبل إنشاء علامة تجارية.


social.brands.list

اعرض قائمة العلامات التجارية، مقسّمة إلى صفحات باستخدام الإزاحة. يُطلب statuses داخل عامل التصفية عند إرساله.

Python
client.social.brands.list(    *,    statuses: list[str] | None = None,    profile_name: str | None = None,    page: int | None = None,    size: int | None = None,) -> APIObject
Python
result = client.social.brands.list(page=1, size=25)for brand in result.profiles:  print(brand.id, brand.profileName, brand.connectedChannelCount)print(result.pageInfo.total, result.pageInfo.hasNextPage)

social.brands.retrieve

اجلب علامة تجارية واحدة باستخدام UUID الخاص بها.

Python
client.social.brands.retrieve(brand_id: str) -> APIObject
Python
brand = client.social.brands.retrieve("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(brand.profileName, brand.timezone.tzCode)

social.brands.update

حدّث علامة تجارية. لا يُطلب سوى profile_id؛ أرسل فقط الحقول التي تغيّرها.

Python
client.social.brands.update(    profile_id: str,    *,    profile_name: str | None = None,    timezone: dict | None = None,    business_intent: str | None = None,    categories: list[str] | None = None,    site_url: str | None = None,    logo: str | None = None,    country_iso: str | None = None,    bio: str | None = None,    brand_hashtags: list[str] | None = None,    competitor_hashtags: list[str] | None = None,    content_preferred_language: str | None = None,) -> APIObject

تؤدي categories وbrand_hashtags وcompetitor_hashtags عند إرسالها إلى استبدال القائمة المخزّنة؛ ويؤدي تمرير [] إلى إفراغها.

Python
client.social.brands.update(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  profile_name="Jenny Home & Co.",)

social.brands.archive

أرشف علامة تجارية واتصالاتها. يجب أن يكون قد مضى على إنشاء العلامة التجارية 90 يومًا على الأقل.

Python
client.social.brands.archive(social_profile_id: str) -> APIObject
Python
result = client.social.brands.archive("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(result.status)  # ARCHIVED or TENURE_NOT_MET

إذا لم يمضِ على إنشاء العلامة التجارية 90 يومًا، تُرجع العملية success: False وstatus: "TENURE_NOT_MET" ولا يتغير شيء. عند استيفاء هذه المدة، تتم الأرشفة فورًا: تُؤرشف العلامة التجارية وكل اتصال مرتبط بها في الاستدعاء نفسه وتتوقف عن النشر فورًا، لكن تظل حصص اتصالاتها محجوزة حتى نهاية دورة الفوترة، تمامًا كما يحدث عند قطع الاتصال يدويًا.


أنشئ عنوان URL مستضافًا قصير الصلاحية يرشد المستخدم النهائي خلال خطوات ربط منصة واحدة بعلامة تجارية. أعد توجيهه إلى url.

Python
client.social.connections.link(    brand_id: str,    *,    channel: str,    redirect_url: str,    error_url: str | None = None,    state: str | None = None,) -> APIObject
Python
link = client.social.connections.link(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  channel="INSTAGRAM",  redirect_url="https://app.example.com/social/connected",  error_url="https://app.example.com/social/connect-failed",  state="sess_9f2c1e64",)print(link.url, link.expiresIn)

يعود المستخدم إلى redirect_url مع إلحاق status وbrandId وplatform وقيمة state التي قدمتها، وكذلك connectedAccountId عند النجاح. يُنشأ الاتصال بعد لحظات، لذا استعلم دوريًا باستخدام social.connections.list() لبضع ثوانٍ بدلًا من اعتبار أول نتيجة قراءة فارغة فشلًا. يتطلب Instagram حسابًا من نوع Business أو Creator مرتبطًا بصفحة Facebook.


social.connections.list

اعرض قائمة حسابات التواصل الاجتماعي المرتبطة بعلامة تجارية.

Python
client.social.connections.list(brand_id: str) -> APIObject
Python
result = client.social.connections.list("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")for channel in result.socialConnected:  print(channel.id, channel.platform, channel.displayName)print(result.channelCount)

channel.id هو UUID الخاص بالاتصال الذي تتطلبه جميع الاستدعاءات الأخرى؛ أما referenceId فهو معرّف الحساب لدى المنصة نفسها ولا يُقبل مطلقًا كمدخل.


social.connections.disconnect

أزل اتصالًا. لا يمكن التراجع عن هذه العملية: تتطلب استعادته social.connections.link() جديدًا.

Python
client.social.connections.disconnect(social_profile_connected_channel_id: str) -> APIObject
Python
client.social.connections.disconnect("b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7")

لا تُلغى المنشورات المجدولة التي تستهدف القناة؛ بل تفشل عند وقت النشر مع SY95045. ألغها أولًا باستخدام social.posts.cancel().


social.posts.create

أنشئ منشورًا واحدًا لعلامة تجارية واحدة عبر قنواتها المتصلة.

Python
client.social.posts.create(    *,    social_profile_id: str,    name: str,    platforms: list[str],    content: str,    action: str,    media_urls: list[str] | None = None,    video_urls: list[str] | None = None,    link: str | None = None,    scheduled_at: str | None = None,    schedule_date: str | None = None,    schedule_time: str | None = None,    connected_channel_ids: list[str] | None = None,    client_reference: str | None = None,) -> APIObject
الوسيطةالنوعالوصف
social_profile_idstrUUID الخاص بالعلامة التجارية. مطلوب.
namestrاسم داخلي لا يظهر للجمهور. مطلوب.
platformslist[str]FACEBOOK، INSTAGRAM، TWITTER، LINKEDIN، PINTEREST. يجب أن يكون لكل منها اتصال موجود بالفعل لدى العلامة التجارية. مطلوب.
contentstrنص المنشور. مطلوب.
actionstrDRAFT أو SCHEDULE أو PUBLISH. مطلوب.
media_urlslist[str]عناوين URL عامة للصور عبر https. مطلوبة لـ Instagram وPinterest.
video_urlslist[str]عناوين URL عامة لمقاطع الفيديو عبر https.
linkstrرابط لإرفاقه عندما تدعم المنصة ذلك.
scheduled_atstrISO-8601 مع إزاحة زمنية. بديل عن زوج التاريخ والوقت.
schedule_datestrYYYY-MM-DD، ويُفسَّر وفق المنطقة الزمنية للعلامة التجارية. أرسله مع schedule_time.
schedule_timestrHH:MM، ويُفسَّر وفق المنطقة الزمنية للعلامة التجارية. أرسله مع schedule_date.
connected_channel_idslist[str]اقتصر على اتصالات محددة.
client_referencestrمعرّف خاص بك، يُعاد كما هو ضمن نتائج المهمة الجماعية.

يتطلب action="SCHEDULE" صيغة جدولة واحدة فقط: scheduled_at، أو schedule_date + schedule_time. يُرفض إرسال الصيغتين معًا مع إرجاع SY95046.

Python
result = client.social.posts.create(  social_profile_id="6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  name="Autumn collection launch",  platforms=["INSTAGRAM", "FACEBOOK"],  content="Our autumn collection lands today. Solid oak, hand-finished.",  media_urls=["https://cdn.example.com/social/autumn.jpg"],  action="SCHEDULE",  schedule_date="2026-10-02",  schedule_time="09:30",)print(result.success, result.socialPostId)

social.posts.retrieve

اجلب منشورًا واحدًا مع حالة النشر لكل قناة. استعلم دوريًا باستخدام هذا الاستدعاء بعد الإنشاء.

Python
client.social.posts.retrieve(post_id: str) -> APIObject
Python
post = client.social.posts.retrieve("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")print(post.status)for channel in post.connectedChannels:  print(channel.platform, channel.status, channel.liveLink, channel.error)

social.posts.list

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

Python
client.social.posts.list(    brand_id: str,    *,    filters: dict | None = None,    page: int | None = None,    size: int | None = None,    fetch_post_content: bool | None = None,) -> APIObject

يقبل filters كلًا من name وplatforms وstatus وstart_date وend_date وsocial_connected_channel_id وapproval_state وview_mode وfilter_by_user.

Python
result = client.social.posts.list(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  filters={"status": ["SCHEDULED"], "startDate": "2026-10-01", "endDate": "2026-10-31"},  page=1,  size=50,)for post in result.socialPosts:  print(post.socialPostId, post.name, post.status)print(result.pageInfo.total)

social.posts.cancel

ألغِ منشورًا مجدولًا أو مسودة لمنع نشره مطلقًا.

Python
client.social.posts.cancel(social_post_id: str) -> APIObject
Python
client.social.posts.cancel("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")

لا يمكن إلغاء المنشورات التي نُشرت بالفعل، ولا تُزال من أي منصة؛ ويُرجع الاستدعاء success: False لهذه المنشورات.


social.posts.insights

التفاعل والتعليقات لمنشور واحد منشور على قناة واحدة. يُرجع الحقلان على هيئة سلاسل JSON نصية تحتوي على حمولة المنصة نفسها.

Python
client.social.posts.insights(    post_id: str,    *,    social_connected_channel_id: str,) -> APIObject
Python
import json result = client.social.posts.insights(  "c47a1e58-2b93-4f10-a6d7-58e0c9b12345",  social_connected_channel_id="b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7",)insights = json.loads(result.insights)comments = json.loads(result.comments)print(insights.get("impressions"), len(comments))

المفاتيح داخلها خاصة بالمنصة وتختلف من منصة إلى أخرى؛ تعامل عند قراءتها مع احتمال غياب المفاتيح أو اختلاف بنيتها.


social.bulk.create

تحقّق من صلاحية ما يصل إلى 500 منشور وأضفها إلى قائمة الانتظار في طلب واحد. يمكن أن تستهدف الصفوف علامات تجارية مختلفة.

Python
client.social.bulk.create(    posts: list[dict],    *,    name: str | None = None,) -> APIObject

يقبل كل صف الحقول نفسها التي يقبلها social.posts.create، ضمن camelCase. إذا كان أي صف غير صالح، فلن يُنشأ شيء: تكون قيمة success هي False، ويُرجع SY95050 ضمن error، ويحدد job.results[] كل صف غير صالح بواسطة index الخاص به الذي يبدأ ترقيمه من 0، وclientReference الخاص به.

Python
result = client.social.bulk.create([  {      "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",      "name": "Autumn week 1",      "platforms": ["INSTAGRAM", "FACEBOOK"],      "content": "Week one of the autumn collection.",      "mediaUrls": ["https://cdn.example.com/social/autumn-w1.jpg"],      "action": "SCHEDULE",      "scheduleDate": "2026-10-02",      "scheduleTime": "09:30",      "clientReference": "campaign-4471-slot-01",  },])if not result.success:  for row in result.job.results:      print(row.index, row.clientReference, row.errors)else:  job_id = result.job.id

social.bulk.retrieve

استعلم دوريًا عن مهمة جماعية حتى تصل إلى حالة نهائية.

Python
client.social.bulk.retrieve(bulk_job_id: str) -> APIObject
Python
job = client.social.bulk.retrieve("9b3f18d0-7a26-4c51-8e94-1f0d5c6b7a82")print(job.status, job.processedCount, "/", job.totalCount)for row in job.results:  print(row.clientReference, row.status, row.socialPostId)

تكون قيمة status هي QUEUED أو PROCESSING أو COMPLETED أو COMPLETED_WITH_ERRORS أو FAILED. وصول صف إلى CREATED يعني أن المنشور موجود، وليس أنه نُشر: مرّر socialPostId إلى social.posts.retrieve() للحصول على النتيجة لكل قناة.


social.limits

الحد الأقصى للاتصالات والاستخدام الحالي، في استدعاء واحد.

Python
client.social.limits() -> APIObject
Python
limits = client.social.limits()print(limits.maxConnections, limits.usage.connections)     # pool vs usedprint(limits.brands)                                       # None — brands are unlimitedprint(limits.usage.brands)                                 # brands that exist, uncapped

الاتصالات حصة مشتركة على مستوى الحساب بأكمله — 20 في Social Launch، و125 في Social Growth، بالإضافة إلى 5 لكل حزمة اتصالات بتكلفة $25 شهريًا — وليست حصة لكل علامة تجارية. تحقّق منها قبل إنشاء رابط اتصال لتتمكن من عرض خيار ترقية بدلًا من SY95042. تكون قيمة limits.brands هي None في جميع خطط API.


انظر أيضًا

  • الخطط والإضافات: المستويات، وأسعار الإضافات، ومجموعة الاتصالات، وقاعدة مدة الارتباط البالغة 90 يومًا
  • مرجع Social REST: نقاط النهاية الأساسية التي تغلّفها هذه الدوال
  • المنشورات: المنتج على مستوى الموقع، وله اشتراك مختلف
  • معالجة الأخطاء: الاستثناءات ذات الأنواع المحددة والعَلَم success