# Membuat dan menjadwalkan post

Sebuah post punya satu caption, media-nya, dan satu **target** untuk setiap akun tujuan. Tiap target memilih
[content type](/id/platforms/) yang didukung akunnya, dan bisa mengganti caption, media dan opsi untuk akun itu.

```json
{
  "caption": "Grand opening Sabtu ini! 🎉",
  "mediaIds": ["m_1", "m_2"],
  "targets": [
    { "socialAccountId": "acc_ig", "contentType": "ig_carousel", "options": { "firstComment": "#bali #grandopening" } },
    { "socialAccountId": "acc_th", "contentType": "th_carousel", "captionOverride": "Grand opening Sabtu ini, mampir ya!" },
    { "socialAccountId": "acc_tt", "contentType": "tt_photo", "options": { "tiktok": { "privacyLevel": "PUBLIC_TO_EVERYONE" } } }
  ],
  "tagIds": ["tag_promo"],
  "action": "schedule",
  "scheduledAt": "2026-11-07T10:00:00+08:00"
}
```

## Action

| `action` | Yang terjadi |
|---|---|
| `draft` | Disimpan, tidak ada yang terbit. Pre-flight tidak berjalan, jadi draft boleh belum lengkap. Tambahkan `scheduledAt` agar tampil di kalender. |
| `schedule` | Diperiksa, lalu terbit pada `scheduledAt`. |
| `now` | Diperiksa, lalu langsung terbit. |
| `submit` | Disimpan sebagai draft yang menunggu persetujuan pemilik. Lihat [Persetujuan](/id/guides/approvals/). |

Periksa post tanpa menyimpannya dengan [`POST /posts/validate`](/api/operations/validatepost/): body sama, `action` opsional.
Hasilnya berisi error dan warning setiap akun.

## Waktu

Kirim ISO 8601 dengan offset atau `Z`, misalnya `2026-11-07T10:00:00+08:00`. Waktu tanpa offset ditolak, jadi tidak ada tebak-tebakan
zona waktu. `GET /me` mengembalikan zona waktu workspace, yang dipakai kalender dan antrean.

## Slot antrean

Atur jam posting mingguan di menu kalender pada **Queue slots**, atau dengan [`PUT /queue`](/api/operations/setqueue/). Kirim
`"useNextSlot": true` sebagai ganti `scheduledAt` dan PostFlow memilih slot kosong berikutnya (minimal 10 menit dari sekarang, dan
tidak dalam 30 menit dari post lain). `GET /queue/next` menunjukkan slot itu lebih dulu.

## Opsi per akun

| Opsi | Untuk |
|---|---|
| `firstComment` | Komentar yang diposting tepat setelah post (hashtag, link). Instagram, Facebook, Threads. |
| `followUps` | Sampai 5 komentar, atau thread Threads, masing-masing `delayMinutes` setelah yang sebelumnya. |
| `link` | Post link di Facebook. |
| `shareToFeed` | Reels Instagram: tampil juga di feed. |
| `instagram.collaborators` | Sampai 3 username yang diundang sebagai kolaborator. |
| `tiktok.privacyLevel` | Siapa yang bisa melihat, mis. `PUBLIC_TO_EVERYONE`, `SELF_ONLY`. Plus `disableComment`, `disableDuet`, `disableStitch`, `brandContent`, `brandOrganic`. |
| `youtube.title`, `privacy`, `madeForKids`, `tags`, `categoryId`, `thumbnailMediaId` | Upload YouTube. |
| `cover.offsetMs` / `cover.mediaId` | Cover video dari satu momen di video atau dari gambar, kalau platformnya mengizinkan. |

## Post berulang

`repeatDays` menerbitkan post lagi setiap 1, 2, 3, 7, 14 atau 30 hari. `null` menghentikannya.

## Mengedit

`PUT /posts/{id}` mengganti isi post: kirim semua field, seperti saat membuat. Akun yang sudah menerbitkannya tetap seperti adanya.
Kirim `version` yang Anda baca sebagai `expectedVersion` agar mendapat `409 CONFLICT` alih-alih menimpa perubahan seseorang di aplikasi.

Untuk mengganti waktunya saja, pakai [`POST /posts/{id}/reschedule`](/api/operations/reschedulepost/) dengan `{ "scheduledAt": "…" }`.
Untuk langsung menerbitkan draft atau post terjadwal, pakai [`POST /posts/{id}/publish`](/api/operations/publishpost/).

## Menghapus

`DELETE /posts/{id}` menghapus post dari PostFlow. Yang sudah tayang di platform tetap ada di sana. Post yang sedang diterbitkan
saat itu mengembalikan `409`; coba lagi semenit kemudian. [`POST /posts/delete`](/api/operations/deleteposts/) menghapus sampai 50
sekaligus dan melaporkan yang dilewati.

## Melihat yang direncanakan

- [`GET /calendar?from=…&to=…`](/api/operations/getcalendar/): semua post dalam rentang sampai 92 hari, plus slot antrean yang masih kosong.
- [`GET /posts?status=…`](/api/operations/listposts/): `scheduled`, `published`, `failed`, `attention` atau `drafts`, difilter
  `accountId` atau `tagId`. Lihat [Status post](/id/platforms/statuses/).

## TikTok

Sebelum posting ke akun TikTok pribadi, baca pengaturannya dengan
[`GET /accounts/{id}/tiktok-creator-info`](/api/operations/gettiktokcreatorinfo/) lalu pilih `options.tiktok.privacyLevel`
dari `privacyLevelOptions`. TikTok mewajibkan creator memilihnya; tidak ada nilai default. Lihat [TikTok](/id/platforms/tiktok/).