> ## Documentation Index
> Fetch the complete documentation index at: https://docs.so-me.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK ওয়েবহুক

> এমবেডেড ওয়েবহুক সাবস্ক্রিপশন তৈরি করুন এবং স্বাক্ষরিত ইভেন্ট পেলোড যাচাই করুন

আপনার পার্টনার প্রজেক্টের যেকোনো এন্ড ইউজারের কার্যকলাপ ঘটলে এমবেডেড ওয়েবহুক আপনার সার্ভারকে জানায়। প্রতিটি
পেলোডে প্রভাবিত এন্ড ইউজারকে শনাক্ত করা থাকে, যাতে আপনি সেটি সঠিক গ্রাহকের কাছে পৌঁছে দিতে পারেন।

## সাবস্ক্রিপশন তৈরি করুন

ওয়েবহুক এন্ডপয়েন্ট অবশ্যই HTTPS ব্যবহার করবে এবং সবার জন্য প্রবেশযোগ্য হতে হবে।

```ts theme={null}
const webhook = await soMe.webhooks.create({
  url: "https://app.example.com/webhooks/so-me",
  events: ["post.published", "post.failed"],
});

// Save this value immediately; it is returned only on creation.
await secrets.store("some-webhook-secret", webhook.secret!);
```

আপনার এমবেডেড এন্ড ইউজারদের ক্ষেত্রে ঘটা সব স্বীকৃত ইভেন্ট পেতে `events` বাদ দিন, অথবা খালি অ্যারে দিন।

```ts theme={null}
const subscriptions = await soMe.webhooks.list();
await soMe.webhooks.remove(webhook.id);
```

এমবেডেড পাবলিশিং ইন্টিগ্রেশনের জন্য কাজে লাগে এমন ইভেন্টগুলো:

| ইভেন্ট | অর্থ |
| - | - |
| `social.account_connected` | একটি সোশ্যাল অ্যাকাউন্ট সংযুক্ত হয়েছে |
| `social.account_disconnected` | একটি সোশ্যাল অ্যাকাউন্ট বিচ্ছিন্ন হয়েছে |
| `post.scheduled` | একটি পোস্ট পাবলিশিং কিউতে ঢুকেছে |
| `post.published` | সোশ্যাল প্ল্যাটফর্ম পোস্টটি গ্রহণ করেছে |
| `post.failed` | পাবলিশিং ব্যর্থ হয়েছে |

## সিগনেচার যাচাই করুন

Social media studio HTTP রিকোয়েস্টের হুবহু কাঁচা বডিকে HMAC-SHA256 দিয়ে স্বাক্ষর করে। বডি টেক্সট বা বাইট হিসেবে পড়ুন এবং
JSON পার্স করার আগে যাচাই করুন।

```ts theme={null}
import {
  verifyWebhookSignature,
  type EmbeddedWebhookEvent,
} from "@social-media-scheduler/sdk";

export async function POST(request: Request) {
  const rawBody = await request.text();
  const signature = request.headers.get("x-webhook-signature") ?? "";

  if (
    !verifyWebhookSignature(
      rawBody,
      signature,
      process.env.SOME_WEBHOOK_SECRET!,
    )
  ) {
    return new Response("Invalid signature", { status: 401 });
  }

  const event = JSON.parse(rawBody) as EmbeddedWebhookEvent;
  await handleEvent(event);
  return new Response(null, { status: 204 });
}
```

সিগনেচার হেক্সাডেসিমাল ডাইজেস্ট হিসেবে বা `v1=` প্রিফিক্সসহ আসতে পারে; SDK দুটোই গ্রহণ করে।

## পেলোডের গঠন

```json theme={null}
{
  "id": "delivery_uuid",
  "event": "post.published",
  "createdAt": "2026-08-20T10:00:04.000Z",
  "endUser": {
    "id": "end_user_uuid",
    "externalId": "customer_123"
  },
  "data": {
    "postId": "post_uuid",
    "platform": "THREADS"
  }
}
```

ডেলিভারি রিকোয়েস্টে এই হেডারগুলোও থাকে:

| হেডার | বিবরণ |
| - | - |
| `X-Webhook-Signature` | কাঁচা বডির HMAC-SHA256 সিগনেচার |
| `X-Webhook-Event` | ইভেন্টের নাম |
| `X-Webhook-Delivery-Id` | স্থিতিশীল ডেলিভারি শনাক্তকারী |

## ডেলিভারির আচরণ

* ইভেন্ট নিরাপদে গৃহীত হওয়া মাত্র `2xx` রেসপন্স ফেরত দিন।
* কাজ কয়েক সেকেন্ডের বেশি লাগতে পারলে ইভেন্ট অ্যাসিঙ্ক্রোনাসভাবে প্রসেস করুন।
* পেলোডের `id` বা `X-Webhook-Delivery-Id` দিয়ে ডেলিভারি ডিডুপ্লিকেট করুন।
* `2xx`-ভিন্ন রেসপন্স, নেটওয়ার্ক ব্যর্থতা ও টাইমআউট এক্সপোনেনশিয়াল ব্যাকঅফসহ রিট্রাই করা হয়।
* বারবার ব্যর্থ হওয়া সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় করা হয়।

ওয়েবহুক ডেলিভারি কমপক্ষে একবার ঘটে, তাই আপনার হ্যান্ডলার অবশ্যই idempotent হতে হবে।


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.