المنشوراتانشر منشورًا

المنشورات

انشر منشورًا

تنشر التطبيقات الفعلية فورًا أو تجدول بموعد أو تحفظ مسودة، أما الاختبارية فتحاكي فقط. مع ?dry_run=true يفحص كل شيء ولا يكتب شيئًا.

POSThttps://api.sofia-post.com/api/v1/posts
POSThttps://api.sofia-post.com/api/v1/posts

انشر منشورًا

تنشر التطبيقات الفعلية فورًا أو تجدول بموعد أو تحفظ مسودة، أما الاختبارية فتحاكي فقط. مع ?dry_run=true يفحص كل شيء ولا يكتب شيئًا.

التفويضات

Authorizationstringمطلوب

مفتاحك الشخصي أو رمز وصول OAuth، يُرسل كـ Bearer <token>.

يبقى في هذا التبويب فقط، ويُرسل إلى api.sofia-post.com فقط. احصل على مفتاح API

معاملات الاستعلام

dry_runstring

true: ينفّذ كل فحص كان الإرسال سينفذه (قواعد الشبكات والحسابات والوسائط والإنشاء والاشتراك الفعلي) ولا يكتب شيئًا. يعيد 200 ready أو 422 post_refused.

الترويسات

Idempotency-Keystring

عند إعادة الطلب بالجسم نفسه يعيد الاستجابة نفسها دون إنشاء منشور ثانٍ. التجربة الجافة لا تستهلك المفتاح.

الجسم

يؤثر هذا الطلب على حسابك الحقيقي.

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

نوع المنشور: الآن أو مجدول أو مسودة

حقلان في الجسم يحددان متى يُنشر المنشور، وهل يُنشر:

الحالةالجسمالسلوك
الآندون scheduledAtيُنشر المنشور فورًا.
مجدولscheduledAt: تاريخ وساعة مستقبليان بصيغة ISO 8601سيُنشر في scheduledAt.
مسودة"status": "draft"، دون scheduledAtيُحفظ ولا يُنشر.

جسم المنشور

الحقلالمعنى
establishmentIdالمنشأة التي تنشر (GET /v1/establishments)
targets[]مدخل لكل شبكة: platform وtext، واختياريًا media وformat وaccountId
targets[].media[]وسيط من مكتبة الوسائط بـ id الخاص به، أو url عام بـ https مع type (image أو video)
targets[].accountIdالحساب المراد استخدامه حين يكون للمنشأة عدة حسابات على هذه الشبكة
scheduledAtتاريخ وساعة مستقبليان بصيغة ISO 8601؛ وإن غاب، يُنشر المنشور فورًا
statusdraft لحفظ مسودة لا تُنشر (دون scheduledAt حينئذٍ)

وسائط هدف

يحدد كل مدخل في targets[].media وسيطًا من مكتبة الوسائط بـ id الخاص به، أو url عامًا بـ https مع type (image أو video). يتطلب Instagram وTikTok صورة أو فيديو. ولإضافة وسيط إلى مكتبة الوسائط، انظر استيراد وسيط.

تكرار منشور

لا يوجد endpoint مخصص لتكرار منشور: اقرأه بـ `GET /v1/posts/{id}`، ثم أعد إرسال محتواه في طلب POST /v1/posts جديد.

قبل إعادة إرساله، أزل الحقول التي تملؤها Sofia بنفسها. على الأقل:

  • id وcreatedAt الخاصان بالمنشور؛
  • status للمنشور المقروء (يلخّص حالة الإرسال): حدّد الحالة التي تريدها أو احذفه؛
  • في كل هدف: state وpublishedAt وpermalink وerror.

أبقِ establishmentId، ولكل هدف platform وaccountId. لا تعيد القراءة نص الأهداف ولا وسائطها: قدّمها من جديد. وأخيرًا حدّد scheduledAt جديدًا (أو احذفه للنشر فورًا، أو أرسل "status": "draft").

منشورك الأول

1. تحقق من الشبكات المرتبطة

يُنشر المنشور عبر الحسابات المرتبطة بالمنشأة. اسردها؛ وإن نقص أحدها، فأنشئ رابط اتصال. انظر الحسابات المرتبطة.

2. أضف وسيطًا

يتطلب Instagram وTikTok صورة أو فيديو. استورد واحدًا من عنوان URL عام بـ https؛ تنزّله Sofia إلى مكتبة الوسائط وتعيد id الخاص به. انظر استيراد وسيط.

3. تحقق بمحاكاة

أضف ?dry_run=true: تحكم Sofia على كل شبكة بقواعدها الفعلية وبالحساب المرتبط، ولا تكتب شيئًا.

curl -X POST 'https://api.sofia-post.com/api/v1/posts?dry_run=true' \
  -H "Authorization: Bearer $SOFIA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "establishmentId": "'$ESTABLISHMENT_ID'",
    "targets": [
      { "platform": "instagram", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] },
      { "platform": "facebook", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] }
    ]
  }'
{
  "status": "ready",
  "dryRun": true,
  "targets": [
    { "platform": "instagram", "accountId": "fecd0904-…", "handle": "sof_ia_officiel", "state": "ready" },
    { "platform": "facebook", "accountId": "a423b3a4-…", "handle": "Sofia post", "state": "ready" }
  ]
}

4. انشر

أرسل الجسم نفسه دون dry_run، مع Idempotency-Key كي لا تنشر المحاولة الجديدة مرتين أبدًا. دون scheduledAt، يُنشر المنشور فورًا؛ ومع scheduledAt مستقبلي يُجدول.

curl -X POST https://api.sofia-post.com/api/v1/posts \
  -H "Authorization: Bearer $SOFIA_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @post.json

5. تابعه

يرد المنشور publishing، ثم تنتقل كل شبكة إلى published مع رابطها الدائم، أو إلى failed مع سببها. اقرأه بـ `GET /v1/posts/{id}`، أو سجّل webhook لتُنبَّه.

المحاكاة (dry run)

POST /v1/posts?dry_run=true ينفّذ فحوص منشور حقيقي: قواعد كل شبكة، والحساب المرتبط، والوسائط، والتاريخ، وباقتك. لا يحفظ شيئًا ولا يرسل شيئًا.

جاهز

حين تقبل كل شبكة المنشور، يكون الرد 200 مع status: "ready" ولكل هدف الحساب الذي سينشر.

مرفوض

وإلا يكون الرد 422 post_refused، مع تفصيل لكل سبب. يسمّي كل تفصيل شبكته وcode الخاص به، ويبيّن ما يجب تصحيحه.

{
  "error": {
    "code": "post_refused",
    "message": "The post would not be published: x: the text is too long (300 characters, at most 280)",
    "details": [
      {
        "platform": "x",
        "code": "caption_too_long",
        "max": 280,
        "actual": 300,
        "message": "x: the text is too long (300 characters, at most 280)"
      }
    ],
    "docUrl": "https://www.sofia-post.com/developers/errors#post_refused"
  }
}

كل سبب مدرج في الأخطاء.

لوضع الاختبار للتطبيقات، انظر وضع الاختبار والمحاكاة. ويحمي Idempotency-Key أيضًا POST /v1/posts: انظر قابلية التكرار الآمن.

التفويضات

  • Authorizationstringheaderمطلوب

    مفتاحك الشخصي أو رمز وصول OAuth، يُرسل كـ Bearer <token>.

معاملات الاستعلام

  • dry_runstring

    true: ينفّذ كل فحص كان الإرسال سينفذه (قواعد الشبكات والحسابات والوسائط والإنشاء والاشتراك الفعلي) ولا يكتب شيئًا. يعيد 200 ready أو 422 post_refused.

    القيم المسموحة: truefalse

الترويسات

  • Idempotency-Keystring

    عند إعادة الطلب بالجسم نفسه يعيد الاستجابة نفسها دون إنشاء منشور ثانٍ. التجربة الجافة لا تستهلك المفتاح.

الجسم

application/json
  • establishmentIdstringمطلوب

    المنشأة، في مساحة عمل منحة الرمز (GET /v1/establishments)

  • targetsobject[]مطلوب

    شبكة واحدة لكل هدف

    عرض الخصائص الفرعية
    • platformstringمطلوب

      الشبكة المستهدفة

      القيم المسموحة: instagramfacebookxlinkedintiktok

    • textstringمطلوب

      النص المصاحب المنشور على هذه الشبكة

    • mediaobject[]

      الوسائط المرفقة

      عرض الخصائص الفرعية
      • idstring

        معرّف وسائط من مكتبة المنشأة (وإلا url وtype)

      • urlstring

        العنوان العام للوسائط (https في الوضع الفعلي)؛ دون معرّف

      • typestring

        نوع الوسائط المعطاة بعنوان

        القيم المسموحة: imagevideo

    • formatstring

      الصيغة (post وreel وstory وcarousel...)؛ افتراضيًا الصيغة التي تقدمها الشبكة

    • accountIdstring

      في الوضع الفعلي: الحساب المتصل الذي ينشر، عندما تملك المنشأة عدة حسابات على هذه الشبكة (GET /v1/establishments/:id/accounts)

  • scheduledAtstring<date-time>

    موعد الجدولة (ISO 8601)، في المستقبل؛ عند الغياب: النشر فورًا. غير مسموح مع status draft

  • statusstring

    draft: مسودة (في الوضع الفعلي فقط)، تُنشأ بلا موعد ولا يُرسل شيء؛ يجدولها PATCH /v1/posts/:id

    القيم المسموحة: draft

الاستجابة

تجربة جافة: اجتازت كل الفحوص.

  • statusstringمطلوب

    دائمًا ready

    القيم المسموحة: ready

  • dryRunbooleanمطلوب

    دائمًا true

    القيم المسموحة: true

  • targetsobject[]مطلوب

    الأهداف المفحوصة

    عرض الخصائص الفرعية
    • platformstringمطلوب

      شبكة الهدف

    • statestringمطلوب

      دائمًا ready

      القيم المسموحة: ready

    • accountIdstring

      في الوضع الفعلي: الحساب الذي سينشر

    • handlestring

      في الوضع الفعلي: معرّفه المعروض (handle)

هل كانت هذه الصفحة مفيدة؟