> ## 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.

# পোস্ট ও মিডিয়া

> এমবেডেড গ্রাহকদের জন্য তাৎক্ষণিক পাবলিশ করুন, পোস্ট শিডিউল করুন এবং মিডিয়া আপলোড করুন

পোস্ট একজন এন্ড ইউজারের অধীনে থাকে এবং সেই এন্ড ইউজারের কোনো একটি সোশ্যাল সংযোগকে লক্ষ্য করতে হয়।
`connectionId`-এর প্ল্যাটফর্ম অবশ্যই `socialMedia`-র সাথে মিলতে হবে।

## টেক্সট পোস্ট তৈরি করুন

পোস্টটি তাৎক্ষণিক কিউতে রাখতে `scheduledAt` বাদ দিন:

```ts theme={null}
const post = await soMe.posts.create(
  endUser.id,
  {
    connectionId: connection.id,
    socialMedia: "THREADS",
    postType: "TEXT",
    text: "Published through our app",
  },
  { idempotencyKey: "customer_123:post_456" },
);
```

শিডিউল করতে ISO 8601 টাইমস্ট্যাম্প দিন:

```ts theme={null}
const post = await soMe.posts.create(
  endUser.id,
  {
    connectionId: connection.id,
    socialMedia: "THREADS",
    postType: "TEXT",
    text: "See you tomorrow",
    scheduledAt: "2026-08-20T10:00:00Z",
  },
  { idempotencyKey: "customer_123:post_457" },
);
```

> [!WARNING]
>
> প্রতিটি আলাদা পোস্টের জন্য স্থিতিশীল ও অনন্য একটি idempotency কী ব্যবহার করুন। রিকোয়েস্ট টাইমআউট হলে একই কী দিয়ে
> আবার চেষ্টা করুন। কী-তে ১–২৫৫টি অক্ষর থাকতে হবে এবং এটি এন্ড ইউজারের ওয়ার্কস্পেসের আওতায় সীমাবদ্ধ।

## পোস্টের তালিকা দেখুন ও একটি পোস্ট আনুন

```ts theme={null}
const page = await soMe.posts.list(endUser.id, {
  page: 1,
  limit: 20,
});

const post = await soMe.posts.get(endUser.id, "post_uuid");
```

`limit` ১–১০০-এর মধ্যে সীমিত। তালিকার রেসপন্সে `data`, `page`, `limit` ও `total` থাকে।

## মিডিয়া আপলোড করুন

মিডিয়া আপলোড তিন ধাপে হয়:

1. Social media studio থেকে একটি presigned আপলোড URL চান।
2. HTTP `PUT` দিয়ে ফাইলের কাঁচা বাইটগুলো সরাসরি ওই URL-এ আপলোড করুন। আপনি যে `mimetype` ঘোষণা করেছেন, সেই
   মানের `Content-Type` হেডার পাঠান: URL-টি এর সাথে স্বাক্ষরিত, তাই এটি ছাড়া বা অন্য মানে `PUT` করলে
   `403 SignatureDoesNotMatch` ত্রুটি আসে।
3. পোস্ট তৈরির সময় ফেরত পাওয়া ফাইলের তথ্য যুক্ত করুন।

```ts theme={null}
import { readFile, stat } from "node:fs/promises";

const filename = "launch.jpg";
const mimetype = "image/jpeg";
const size = (await stat(filename)).size;

const [media] = await soMe.posts.presignMedia(endUser.id, {
  postType: "IMAGE",
  socialMedia: "THREADS",
  files: [{ filename, mimetype, size }],
});

const upload = await fetch(media.uploadUrl, {
  method: "PUT",
  headers: { "Content-Type": mimetype },
  body: await readFile(filename),
});

if (!upload.ok) {
  throw new Error(`Media upload failed: ${upload.status}`);
}

const post = await soMe.posts.create(
  endUser.id,
  {
    connectionId: connection.id,
    socialMedia: "THREADS",
    postType: "IMAGE",
    text: "Our launch is live",
    files: [
      {
        id: media.fileId,
        filename,
        mimetype,
        size,
        s3Prefix: media.s3Prefix,
        fileSrc: media.fileSrc,
      },
    ],
  },
  { idempotencyKey: "customer_123:post_458" },
);
```

ভিডিওর ক্ষেত্রে URL চাওয়ার সময় এবং ফাইল যুক্ত করার সময় সেকেন্ডে `duration` দিন। আপলোড URL সাময়িক; মেয়াদ
শেষ হয়ে গেলে নতুন URL চেয়ে নিন।

## পোস্টের স্ট্যাটাস

create রেসপন্স নিশ্চিত করে যে পোস্টটি গৃহীত হয়ে কিউতে গেছে; এটি নিশ্চয়তা দেয় না যে সোশ্যাল প্ল্যাটফর্ম সেটি পাবলিশ
করেছে। চূড়ান্ত ফলাফলের জন্য `post.status` দেখুন, `posts.get` পোল করুন, অথবা `post.published` ও `post.failed`
ওয়েবহুকে সাবস্ক্রাইব করুন।


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