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

# Tổng quan Post API

> Lên lịch bài đăng, auto hashtag, lịch đăng tự động, và nhiều hơn nữa

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["premium"]} maxPackRequired={false} />

Endpoint post cho phép bạn xuất bản bài đăng đến các mạng xã hội: Bluesky, Facebook, Google Business Profile, Instagram, LinkedIn, Pinterest, Reddit, Snapchat, Telegram, TikTok, X/Twitter, và YouTube.
Có nhiều tùy chọn để tùy chỉnh bài đăng của bạn, chẳng hạn như lên lịch bài đăng, thêm auto hashtag, lịch đăng tự động, và nhiều hơn nữa.
Thường được các agency sử dụng khi nhiều bên liên quan cần phê duyệt bài đăng trước khi nó được xuất bản.

Bắt đầu xuất bản bài đăng với [endpoint POST /post](/apis/post/post).

## Quy trình phê duyệt

Nếu quy trình xuất bản của bạn yêu cầu phê duyệt trước khi gửi bài đăng, hãy đặt trường `requiresApproval` thành `true`.
Điều này tương đương với việc tạm dừng bài đăng cho đến khi tham số `approved` được đặt thành `true`.

### Ví dụ quy trình phê duyệt

Bài đăng sẽ có trạng thái "awaiting approval" cho đến khi tham số `approved` được đặt thành `true` qua [endpoint PATCH /post](/apis/post/update-post).

<Steps>
  <Step title="Xuất bản với các tham số">
    Xuất bản bài đăng của bạn bằng [endpoint /post](/apis/post/post) với trường `requiresApproval`
    là `true`. Bạn cũng có thể bao gồm các tham số tiêu chuẩn như `scheduleDate`.
  </Step>

  <Step title="Trạng thái là awaiting approval">
    Bài đăng sẽ ở trạng thái "awaiting approval" và sẽ được giữ lại cho đến khi được phê duyệt.
  </Step>

  <Step title="Phê duyệt bài đăng">
    Cập nhật bài đăng bằng [thao tác PATCH /post](/apis/post/update-post) đặt trường `approved`
    thành `true`. Bài đăng bây giờ sẽ được gửi vào thời điểm đã lên lịch.
  </Step>

  <Step title="Sử dụng ghi chú">
    Tùy chọn: Đặt `notes` trên bài đăng để tham khảo, chẳng hạn như ai cần phê duyệt bài đăng.
  </Step>
</Steps>

```json Publish the Post with Approval theme={"system"}
{
  "requiresApproval": true,
  "notes": "need approval by John Smith" // optional
}
```

<Warning>
  Nếu `scheduleDate` được bao gồm và ngày ở trong quá khứ, bài đăng sẽ được xuất bản
  ngay lập tức khi được phê duyệt.
</Warning>

### Video quy trình phê duyệt

Vui lòng xem video bên dưới để có ví dụ về quy trình phê duyệt.

<div class="video-container">
  <iframe width="380" height="200" src="https://www.youtube.com/embed/DtmTGgqQ-Mo" title="Social Approval Workflow API" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" />
</div>

## Auto Hashtag

Thêm các hashtag phù hợp nhất vào bài đăng của bạn.

`autoHashtag` là một đối tượng, hoặc Boolean - xem bên dưới, với các tham số sau:

<ul class="custom-bullets">
  <li>`max`: (tùy chọn) Integer số hashtag để thêm, phạm vi 1-10. Mặc định 2.</li>

  <li>
    `position`: (tùy chọn) String "auto" hoặc "end". Auto thêm hashtag trong bài đăng hoặc ở
    cuối. "end" thêm hashtag chỉ ở cuối.
  </li>
</ul>

*Yêu cầu gói trả phí.*

```json theme={"system"}
{
  "hashtags": {
    "max": 3, // optional: Integer range 1-10
    "position": "auto" // optional: String "auto" or "end"
  }
}
```

Nếu bạn không muốn gửi bất kỳ tùy chọn nào ở trên, hãy truyền giá trị Boolean `true` thay vì một đối tượng.

```json theme={"system"}
{
  "autoHashtag": true
}
```

## Auto Repost

Tự động đăng lại nội dung của bạn nhiều lần vào các khoảng thời gian đều đặn, tạo ra nội dung evergreen luôn tươi mới và hiển thị với đối tượng của bạn.
Yêu cầu gói trả phí.

Tham số:

* `repeat`: (bắt buộc) Số lần đăng lại nội dung. Phải nằm trong khoảng từ 1 đến 10.
* `days`: (bắt buộc) Số ngày giữa mỗi lần đăng lại. Phải ít nhất 2 ngày.
* `startDate`: (tùy chọn) Khi nào bắt đầu lịch đăng lại, ở định dạng ISO-8601 UTC. Nếu không được chỉ định, bài đăng đầu tiên sẽ được xuất bản ngay lập tức. Bạn nên sử dụng tham số `startDate` thay cho tham số `scheduleDate` cấp cao nhất.

```json Auto Repost theme={"system"}
{
  "repeat": 2, // min 2, max 10
  "days": 5, // min 2
  "startDate": "2021-07-08T12:30:00Z"
}
```

Phản hồi sẽ bao gồm tất cả các lần đăng lại đã lên lịch trong tương lai và một `autoRepostId` cho mỗi lần đăng lại.

```json Auto Repost Response theme={"system"}
{
  "status": "scheduled",
  "scheduleDate": "2025-06-13T12:30:00.000Z",
  "id": "eIT96IYEodNuzU4oMmwG",
  "refId": "9abf1426d6ce9122ef11c72bd",
  "autoRepostId": "F5wdoaOAAGtDQVciExSxL",
  "post": "The most important things are the hardest to say - Stephen King"
}
```

Khi tạo auto repost, một ID `autoRepostId` được gán để theo dõi chuỗi bài đăng đó.

Bạn có thể lấy tất cả các auto reposts cho một bài đăng với [lệnh gọi History](/apis/history/get-history) với `autoRepostId`.

Nếu bạn cần xóa một repost, bạn có thể sử dụng [lệnh gọi DELETE](/apis/post/delete-post) với post ID.

<Tip>
  Quan trọng: Khi sử dụng auto-repost, hãy đảm bảo bạn tuân theo hướng dẫn tần suất đăng bài của mỗi mạng xã hội để tránh các hạn chế tài khoản.

  Lưu ý: Tính năng `autoRepost` không thể được sử dụng cùng với `scheduleDate`. Nếu bạn bao gồm cả hai tham số, `scheduleDate` sẽ được ưu tiên và `autoRepost` sẽ bị bỏ qua. Vui lòng sử dụng tham số `startDate` thay thế.
</Tip>

## Bình luận đầu tiên (First Comment)

Tự động thêm bình luận đầu tiên, kèm phương tiện, sau khi bài đăng được xuất bản. Đối với TikTok, bình luận bị hoãn cho đến khi video hoàn tất xử lý (xem [Thời gian xử lý bình luận đầu tiên](#first-comment-processing-time)).
Đăng bình luận đầu tiên trên bài đăng mạng xã hội của riêng bạn có thể giúp khởi động sự tương tác và tạo âm hưởng cho cuộc thảo luận tiếp theo.

```json theme={"system"}
{
  "firstComment": {
    "comment": "My first comment", // required
    "mediaUrls": ["https://..."] // Facebook, LinkedIn, and X/Twitter only
  }
}
```

## Thời gian xử lý bình luận đầu tiên

Đối với hầu hết các mạng xã hội, phản hồi API bị trì hoãn vì hệ thống của chúng tôi phải (1) đợi bài đăng gốc được xuất bản hoàn toàn, sau đó (2) thêm bình luận vào bài đăng đã xuất bản đó. Quá trình tuần tự này thêm một độ trễ khoảng 20 giây.

**TikTok được xử lý khác.** TikTok xử lý video không đồng bộ, vì vậy `id` bài đăng là `"pending"` cho đến khi webhook `post.publish.publicly_available` của TikTok giải quyết id video thực (xem [Xử lý TikTok](/apis/post/social-networks/tiktok#tiktok-processing)). Do đó, phản hồi `/post` trả về bình luận đầu tiên TikTok với `status: "pending"` ngay lập tức, và bình luận được đăng tự động khi TikTok hoàn tất xử lý và [webhook Scheduled Action `tikTokPublished`](/apis/webhooks/actions#scheduled-action) kích hoạt. TikTok không đảm bảo thời gian xử lý, vì vậy không có độ trễ cố định.

**Lưu ý quan trọng về TikTok**: Để bình luận đầu tiên hoạt động đúng cách trên TikTok, tham số `visibility` của bài đăng phải được đặt thành `public`. Một video không công khai không bao giờ nhận được webhook `publicly_available`, vì vậy bình luận đầu tiên của nó không thể được đăng; trong trường hợp đó Ayrshare trả về lỗi bình luận thay vì để nó ở trạng thái pending.

## Bài đăng Idempotent

[Idempotency](https://en.wikipedia.org/wiki/Idempotence) là một tính năng tùy chọn đảm bảo một yêu cầu chỉ được thực thi một lần, ngay cả khi nó vô tình được gửi nhiều lần.
Khi đăng nội dung bằng API, bạn có thể bao gồm một tham số `idempotencyKey` tùy chọn trong body yêu cầu để nhận dạng thao tác một cách duy nhất. Điều này cho phép bạn thử lại yêu cầu đăng bài an toàn mà không có rủi ro tạo ra các bài đăng trùng lặp.

Để sử dụng idempotency, hãy thêm tham số `idempotencyKey` vào body JSON của yêu cầu POST `/post`:

```json Idempotency Key theme={"system"}
{
  "idempotencyKey": "Unique Key"
}
```

Giá trị của `idempotencyKey` phải là một chuỗi duy nhất cho mỗi User Profile. Nếu một yêu cầu được thực hiện với cùng một `idempotencyKey` cho một User Profile nhất định, bất kể trạng thái của bài đăng (success, error, pending, hoặc deleted), một lỗi sẽ được trả về, cho biết đã tìm thấy khóa trùng lặp.

<Warning>
  API trước tiên phải chấp nhận và xử lý yêu cầu POST để lưu trữ idempotency key và kiểm tra
  trùng lặp. Tuy nhiên, nếu nhiều yêu cầu POST với cùng `idempotencyKey` được gửi
  đồng thời hoặc được lên lịch cùng một thời gian đăng bài, API có thể không phát hiện được các khóa trùng lặp.
  Điều này là do API xử lý các yêu cầu đồng thời hoặc được lên lịch đồng thời này
  song song, trước khi nó có cơ hội đăng ký idempotency key từ bất kỳ yêu cầu nào. Kết
  quả là, không có gì đảm bảo rằng các khóa idempotent trùng lặp sẽ bị bắt trong các trường hợp
  gửi hoặc thực thi đồng thời các bài đăng đã lên lịch.
</Warning>

Sử dụng idempotency giúp ngăn chặn việc tạo ra các bài đăng trùng lặp vô ý khi thử lại các yêu cầu thất bại hoặc xử lý các vấn đề về mạng. Tuy nhiên, vẫn nên triển khai xử lý lỗi phù hợp và các cơ chế thử lại trong ứng dụng của bạn để xử lý các thất bại tiềm ẩn một cách nhẹ nhàng.

## Yêu cầu hình ảnh & video

Đăng hình ảnh và video có các yêu cầu khác nhau cho mỗi mạng, nhưng đừng lo. Hệ thống của chúng tôi xác minh bài đăng của bạn trước khi gửi, vì vậy bạn sẽ nhận được phản hồi lỗi nếu có gì đó không ổn. Xem liên kết bên dưới để biết chi tiết về hướng dẫn hình ảnh và video.

<Card title="Image & Video Guidelines" icon="link" href="/media-guidelines" horizontal />

### URL hợp lệ

Hãy đảm bảo (các) URL phương tiện của bạn hợp lệ và truy cập trực tiếp phương tiện.
Kiểm tra đầu tiên là thử URL trong trình duyệt.
Nếu hình ảnh không tải được hoặc không thể tải xuống trong trình duyệt, nó có thể sẽ thất bại.
Ví dụ, một URL DropBox mở ứng dụng web DropBox sẽ không hoạt động.

<Tip>
  Nếu bạn có [URL chia sẻ Google
  Drive](https://www.ayrshare.com/how-to-get-direct-download-urls-from-google-drive/) hoặc [URL chia sẻ
  Dropbox](https://www.ayrshare.com/blog/how-to-get-direct-download-urls-from-dropbox/), bạn có thể chỉ cần
  sử dụng URL trong tham số `mediaUrls` khi xuất bản bài đăng hoặc bình luận. Ayrshare sẽ
  tự động chuyển đổi URL chia sẻ thành liên kết tải xuống.
</Tip>

Chúng tôi xác minh URL phương tiện bằng cách thực hiện yêu cầu `HEAD`.
Vui lòng đảm bảo nhà cung cấp lưu trữ không chặn yêu cầu `HEAD` hoặc bài đăng sẽ thất bại với lỗi 403.

Ví dụ, đây là yêu cầu `HEAD` đến URL phương tiện:

```javascript Fetch HEAD Request theme={"system"}
const run = async () => {
  const url = "https://img.ayrshare.com/012/gb.jpg";
  return await fetch(url, {
    method: "HEAD"
  })
    .then((res) => {
      if (res.ok) {
        return console.log("Success:", res.status, res.statusText);
      } else {
        return console.error("Error:", res.status, res.statusText, res);
      }
    })
    .catch((error) => {
      return console.error("Error Catch:", error);
    });
};

run();
```

#### Bảo vệ phương tiện tự động

Ayrshare bao gồm tính năng bảo vệ phương tiện tích hợp có thể phát hiện và giải quyết một số vấn đề giao nhận phương tiện trong quá trình đăng bài. Khi một bài đăng thành công nhưng đã phát hiện và giải quyết được một vấn đề nội dung, mỗi mục nhập bị ảnh hưởng trong `postIds[]` bao gồm một đối tượng `contentIssues` tùy chọn để bạn có thể xác định và khắc phục vấn đề cơ bản:

```json theme={"system"}
{
    "postIds": [
        {
            "status": "success",
            "platform": "instagram",
            "id": "17878176260289172",
            "postUrl": "https://www.instagram.com/p/CP1dI9Hp_WO/",
            "contentIssues": {
                "originMediaHostFailed": true,
                "details": ["Media URL could not be retrieved by the social network. Successfully posted using Ayrshare automated media protection."]
            }
        }
    ]
}
```

Nếu bạn thấy `originMediaHostFailed` trong phản hồi của mình, hãy xem lại cấu hình lưu trữ phương tiện của bạn. Xem [Meta Media Crawler Blocked](/help-center/technical-support/meta_media_crawler_blocked) để biết các nguyên nhân và giải pháp phổ biến.

#### Khoảng trắng & ký tự đặc biệt

Chúng tôi khuyến nghị tránh những điều sau trong URL phương tiện của bạn:

<ul class="custom-bullets">
  <li>Khoảng trắng trong URL.</li>
  <li>Khoảng trắng được mã hóa URL trong URL.</li>
  <li>Ký tự đặc biệt trong URL ngay cả khi chúng được mã hóa url, chẳng hạn như dấu trọng âm é.</li>
</ul>

Ví dụ:

```bash theme={"system"}
https://img.ayrshare.com/012/test .webp
```

URL này thất bại vì khoảng trắng `test .webp`. Chúng tôi cũng không khuyến nghị sử dụng khoảng trắng được mã hóa URL, chẳng hạn như `%20` trong URL - điều này cũng có thể gây ra vấn đề với một số mạng xã hội.

Và hình ảnh Unsplash này:

```bash theme={"system"}
https://unsplash.com/photos/a-house-in-the-middle-of-a-field-with-trees-in-the-background-znbmh2-cIj0
```

Hình ảnh Unsplash này thất bại vì nó không truy cập trực tiếp hình ảnh, mà đang hiển thị một ứng dụng web.

#### Làm sạch tên file & URL

Bạn có thể làm sạch tên file của mình bằng biểu thức chính quy như `/[^a-z0-9\/\.]/gi`.

```javascript theme={"system"}
const sanitizeFileName = (url) => url.replace(/[^a-z0-9\/\.]/gi, "_");
sanitizeFileName("tést .webp"); // t_st_.webp
```

hoặc làm sạch một URL

```javascript theme={"system"}
const sanitizeUrl = (url) => {
  const [protocol, rest] = url.split("://");
  const [domain, ...path] = rest.split("/");
  const sanitizedPath = path.join("/").replace(/[^a-z0-9\/\.]/gi, "_");
  return `${protocol}://${domain}/${sanitizedPath}`;
};

// Output: https://img.ayrshare.com/012/t_st_.webp
sanitizeUrl("https://img.ayrshare.com/012/tést .webp");
```

### Thông tin bổ sung

<Info>
  <ul class="custom-bullets">
    <li>
      Nếu bạn đang tự lưu trữ, hãy đảm bảo URL có thể được truy cập bên ngoài và không yêu cầu
      quyền đặc biệt.
    </li>

    <li>
      Xem bên dưới về cách xử lý video có phần mở rộng không rõ, thường là URL đã ký như AWS S3.
    </li>

    <li>
      Nếu bạn đang sử dụng URL đã ký, chẳng hạn như S3, chúng tôi khuyến nghị đặt thời hạn URL ít nhất
      7 ngày. Điều này cho phép nhóm của chúng tôi hỗ trợ với bất kỳ câu hỏi nào bạn có về việc xuất bản bài đăng.
    </li>

    <li>
      Kiểm tra xem URL phương tiện có tồn tại hay không với [công cụ xác minh phương tiện](/apis/media/verify-media-url) của chúng tôi.
    </li>
  </ul>
</Info>

### Tốc độ tải xuống

Hãy đảm bảo lưu trữ phương tiện của bạn có kết nối nhanh, đặc biệt là tốc độ tải xuống. Bạn có thể kiểm tra hiệu suất lưu trữ phương tiện của mình tại [pingdom](https://tools.pingdom.com/). Chúng tôi khuyến nghị ít nhất *xếp hạng B*.

### Phần mở rộng video

Nếu URL của bạn không kết thúc bằng phần mở rộng video đã biết như `mp4`, bạn có thể sử dụng trường `isVideo: true` trong bài đăng để chỉ định `mediaUrl` là video. Ayrshare sẽ cố gắng xác định loại file, chẳng hạn như `MOV`. Tuy nhiên, chúng tôi khuyến nghị kết thúc file video một cách rõ ràng với phần mở rộng đã biết, chẳng hạn như `mp4`, vì điều này có tỷ lệ thành công cao hơn với các mạng xã hội.

### Chỉ hình ảnh hoặc video

Một số mạng xã hội hỗ trợ gửi phương tiện mà không có nội dung bài đăng. Nếu bạn không muốn bao gồm nội dung bài đăng, hãy gửi một chuỗi rỗng: `post: ""`

Các mạng xã hội sau hỗ trợ không có nội dung/văn bản trống: Facebook, Instagram, LinkedIn, Threads, TikTok, và X/Twitter.

### Kiểm thử hình ảnh và video

Hãy cân nhắc sử dụng [tạo văn bản ngẫu nhiên và hình ảnh hoặc video ngẫu nhiên](/quickstart#sending-test-posts-with-a-random-quote-image-or-video) để tăng tốc quá trình kiểm thử của bạn. Đừng cố nghĩ ra điều gì đó khác biệt cho mỗi bài đăng kiểm thử!

## Ngắt dòng

<Info>
  Nếu bạn muốn có ngắt dòng (dòng mới) trong bài đăng, hãy sử dụng ngắt dòng vô hình `\u2063\n.` Ví dụ, `This is a new\u2063\nline.`

  Chúng tôi cũng khuyến nghị thử trong Postman để xem cách ngắt dòng mới được dịch trong ngôn ngữ bạn chọn. Ví dụ, PHP thường chỉ sử dụng `\n`

  Một số mạng xã hội hiện không hỗ trợ ngắt dòng trong nội dung bài đăng.
</Info>

## Bài đăng đa nền tảng và phương tiện

Tính năng này cho phép bạn tùy chỉnh nội dung bài đăng và phương tiện cho các mạng xã hội khác nhau trong một lệnh gọi API duy nhất. Bạn có thể chỉ định văn bản và/hoặc hình ảnh duy nhất cho mỗi nền tảng bằng cách sử dụng các đối tượng cho trường `post` và `mediaUrls`.

1. Sử dụng cấu trúc đối tượng cho các trường `post` và/hoặc `mediaUrls`.
2. Chỉ định nội dung cho từng nền tảng bằng tên nền tảng làm khóa.
3. Bao gồm khóa `default` cho nội dung được sử dụng trên các nền tảng không được chỉ định rõ ràng.

```json theme={"system"}
{
  "post": {
    "instagram": "Great IG pic!",
    "facebook": "Great FB pic!",
    "default": "Great default pic!"
  },
  "platforms": ["instagram", "facebook", "linkedin"],
  "mediaUrls": {
    "instagram": "https://img.ayrshare.com/012/gb.jpg",
    "linkedin": "https://img.ayrshare.com/012/gb.jpg",
    "default": "https://img.ayrshare.com/012/gb.jpg"
  }
}
```

Trong ví dụ trên:

<ul class="custom-bullets">
  <li>Instagram sẽ sử dụng văn bản cụ thể và URL hình ảnh của nó.</li>
  <li>Facebook sẽ sử dụng văn bản cụ thể và URL hình ảnh mặc định.</li>
  <li>LinkedIn sẽ sử dụng văn bản mặc định và URL hình ảnh cụ thể của nó.</li>
</ul>

<Info>
  Nếu bạn cần đăng nhiều hình ảnh đến các nền tảng khác nhau, hãy tạo các bài đăng riêng biệt cho mỗi
  nền tảng thay vì sử dụng cấu trúc đa nền tảng này.
</Info>

## Profile Keys

Đăng bài thay mặt người dùng bằng cách cung cấp Profile Keys của người dùng như một tham số body và dữ liệu bổ sung trong phản hồi. *Yêu cầu Business hoặc Enterprise Plan.*

<Card title="Profiles" icon="link" href="/apis/profiles/overview" horizontal />

## Bài đăng văn bản phong phú

Bạn có thể thêm văn bản phong phú như "𝓗𝓮𝓵𝓵𝓸, how about a little 𝗯𝗼𝗹𝗱 𝘁𝗲𝘅𝘁 and 𝘪𝘵𝘢𝘭𝘪𝘤𝘴 𝘵𝘦𝘹𝘵 and an x₂?". Bạn có thể sử dụng văn bản phong phú trên các mạng như Twitter, Facebook, LinkedIn, Telegram, và Instagram.
Nếu đăng lên Reddit, vui lòng sử dụng [định dạng Reddit-flavored Markdown](https://www.reddit.com/wiki/markdown#wiki_new_reddit-flavored_markdown).

Các phần tử HTML được sử dụng để chỉ định loại văn bản phong phú, được chuyển thành unicode. Ví dụ:

```json theme={"system"}
{
    "post": "<var>Hello</var>, how about a little <b>bold text</b> and <i>italics text</i> and an x<sub>2</sub>?"
    "platforms": ["twitter"]
}
```

### Các phần tử HTML

| HTML                                          | Ví dụ                             |
| --------------------------------------------- | --------------------------------- |
| \<b>Nice One!\</b>                            | **Nice One!**                     |
| \<strong>Hello, world!\</strong>              | **Hello, world!**                 |
| \<em>World\</em>                              | *World*                           |
| normal \<i>italics \<b>bold italics\</b>\</i> | normal *italics **bold italics*** |
| \`\<b>Hello\</b>, world!\`                    | `Hello, world!`                   |
| \`\<b>Hello\</b>, world!\`                    | **`Hello`**`, world!`             |
| \<samp>123\</samp>                            | 𝟷𝟸𝟹                            |
| \<var>Hello\</var>                            | 𝓗𝓮𝓵𝓵𝓸                        |
| x\<sub>2\</sub>                               | x₂                                |
| x\<sup>2\</sup>                               | x²                                |

### Mã CSS

| Mã       | Ví dụ                      | Kết quả                  |
| -------- | -------------------------- | ------------------------ |
| \u00B0   | It's 25\u00B0C today!      | It's 25°C today!         |
| \u2063\n | This is a new\u2063\nline. | This is a new<br />line. |

## Lên lịch bài đăng

### Tạo bài đăng đã lên lịch

Bạn có thể lên lịch bài đăng trong tương lai bằng cách chỉ định tham số `scheduleDate` với datetime ở Zulu/UTC. Thời gian Zulu, còn được gọi là Coordinated Universal Time (UTC), là tiêu chuẩn thời gian thế giới.

Ví dụ, sử dụng định dạng `YYYY-MM-DDThh:mm:ssZ` và gửi dưới dạng `2026-07-08T12:30:00Z`.
Vui lòng xem [utctime](https://www.utctime.net/) để biết thêm ví dụ.

```json {5} theme={"system"}
{
  "post": "Hello, world!",
  "mediaUrls": ["https://img.ayrshare.com/012/gb.jpg"],
  "platforms": ["facebook", "instagram"],
  "scheduleDate": "2023-07-08T12:30:00Z"
}
```

Vui lòng xem [https://www.utctime.net/](https://www.utctime.net/) để biết cách chuyển đổi thời gian địa phương của bạn sang thời gian Zulu/UTC.

Nếu datetime đã lên lịch ở trong quá khứ, bài đăng sẽ được gửi ngay lập tức.

<Info>
  Nếu một `mediaUrl` được bao gồm trong một bài đăng đã lên lịch, phương tiện phải có sẵn tại thời điểm
  xuất bản đã lên lịch. Ví dụ, nếu bài đăng được lên lịch xuất bản vào ngày 5 tháng 3 năm 2026,
  phương tiện phải có sẵn vào ngày 5 tháng 3 năm 2026.
</Info>

<Tip>
  Xử lý lỗi cho bài đăng đã lên lịch so với bài đăng ngay lập tức

  Có một sự khác biệt quan trọng trong cách xử lý lỗi xác thực giữa bài đăng ngay lập tức và bài đăng đã lên lịch:

  * Bài đăng ngay lập tức
    * Khi xuất bản ngay lập tức (không có scheduleDate), nếu một nền tảng không vượt qua kiểm tra xác thực, các nền tảng khác sẽ tiếp tục được xử lý. Ví dụ, nếu một bài đăng vượt quá giới hạn ký tự của Twitter nhưng hợp lệ đối với Facebook và Instagram, bài đăng sẽ thất bại trên Twitter nhưng vẫn được xuất bản đến Facebook và Instagram.

  * Bài đăng đã lên lịch
    * Khi lên lịch bài đăng để xuất bản trong tương lai (với scheduleDate), tất cả các nền tảng phải vượt qua kiểm tra xác thực ban đầu trước khi bài đăng được lên lịch. Nếu bất kỳ nền tảng nào không vượt qua các kiểm tra xác thực trước này, toàn bộ thao tác lên lịch sẽ bị từ chối và một lỗi sẽ được trả về ngay lập tức.
    * Tuy nhiên, một số lỗi dành riêng cho nền tảng có thể không được phát hiện cho đến thời điểm đăng thực tế. Trong những trường hợp này, bài đăng đã lên lịch sẽ cố gắng xuất bản đến tất cả các nền tảng, và các lỗi nền tảng riêng lẻ sẽ được báo cáo trong kết quả cuối cùng mà không ảnh hưởng đến các nền tảng khác.
</Tip>

### Kiểm tra trạng thái bài đăng đã lên lịch

Bạn có thể kiểm tra trạng thái của bài đăng đã lên lịch theo nhiều cách:

<ul class="custom-bullets">
  <li>
    Thiết lập [Webhook Scheduled Action](/apis/webhooks/actions#scheduled-action) để tự động
    nhận trạng thái của bài đăng đã lên lịch. Điều này có sẵn cho Business plan và là
    phương pháp được khuyến nghị.
  </li>

  <li>
    Lấy trạng thái của bài đăng đã lên lịch với [lệnh gọi GET](/apis/post/get-post) với post ID.
  </li>

  <li>
    Kiểm tra trạng thái trong Ayrshare Dashboard. Trước tiên chuyển sang User Profile mà bài đăng đã được
    xuất bản, sau đó vào trang "Posts" và tìm kiếm bằng Ayrshare Post ID.
  </li>
</ul>

### Tạm dừng bài đăng đã lên lịch

Bạn có thể tạm dừng bài đăng đã lên lịch chưa được xuất bản.
Tạm dừng bài đăng đã lên lịch sẽ ngăn nó được xuất bản cho đến khi bài đăng được bỏ tạm dừng.

Sử dụng [lệnh gọi PATCH](/apis/post/update-post) để tạm dừng hoặc bỏ tạm dừng bài đăng đã lên lịch.
Xin lưu ý nếu bài đăng được bỏ tạm dừng và `scheduleDate` ở trong quá khứ bài đăng sẽ được xuất bản ngay lập tức. Cân nhắc cập nhật `scheduleDate` trước khi bỏ tạm dừng.

## Rút gọn liên kết

Các liên kết trong bài đăng có thể được rút gọn bằng [link shortner](/apis/links/overview) của Ayrshare. Bạn có thể bật tính năng rút gọn liên kết tự động với tham số `shortenLinks` khi gửi bài đăng. [Yêu cầu Max Pack](/additional/maxpack).

```json {4} theme={"system"}
{
  "post": "Hello, world with a link https://www.ayrshare.com",
  "platforms": ["linkedin"],
  "shortenLinks": true
}
```

## Hình ảnh Unsplash

Các trường sau khả dụng cho tham số body `unsplash`:

<ul class="custom-bullets">
  <li>Hình ảnh ngẫu nhiên: `random` trả về một hình ảnh Unsplash ngẫu nhiên.</li>

  <li>
    Hình ảnh dựa trên tìm kiếm: giá trị String cụm từ tìm kiếm; ví dụ, `money` sẽ chọn một hình ảnh ngẫu nhiên dựa trên
    money.
  </li>

  <li>
    Image IDs: giá trị Array of Ids; ví dụ \["HubtZZb2fCM"] của hình ảnh
    [https://unsplash.com/photos/HubtZZb2fCM](https://unsplash.com/photos/HubtZZb2fCM)
  </li>
</ul>

```json {4,5,6} theme={"system"}
{
  "post": "Hello, world!",
  "platforms": ["instagram"],
  "unsplash": "random",
  "unsplash": "search term", // unsplash: "money"
  "unsplash": ["unsplash image ID"] // unsplash: ["HubtZZb2fCM"]
}
```

<Info>
  Nếu sao chép một URL Unsplash để đăng trong `mediaUrls`, vui lòng chắc chắn sao chép địa chỉ hình ảnh và
  không chỉ là URL. Vui lòng xem
  [ví dụ](/help-center/technical-support/get_an_unsplash_image_url) này để biết thêm thông tin.
</Info>
