# Error

Error dikembalikan sebagai JSON dengan `code` yang stabil, kalimat yang bisa ditampilkan ke pengguna, dan kadang `details`:

```json
{
  "error": {
    "code": "VALIDATION",
    "message": "Some posts need changes before they can be scheduled",
    "details": {
      "preflight": [
        {
          "socialAccountId": "acc_th",
          "issues": [{ "severity": "error", "code": "caption_length", "message": "Caption is 612 characters; the limit is 500." }]
        }
      ]
    }
  }
}
```

Pesan error ditulis dalam bahasa Inggris; cocokkan dengan `code`, bukan teks pesannya.

## Kode

| HTTP | `code` | Arti dan tindakan |
|---|---|---|
| 400 | `VALIDATION` | Request perlu diperbaiki. `details` berisi error per field (`{ "scheduledAt": ["Required"] }`) atau `preflight` per akun. |
| 401 | `UNAUTHENTICATED` | Key atau token tidak ada, salah format, kedaluwarsa atau dihapus. Client OAuth memperbarui token. |
| 402 | `SUBSCRIPTION_EXPIRED`, `SUBSCRIPTION_GRACE` | Langganan tidak aktif. Membaca tetap bisa; perpanjang di aplikasi untuk menulis. |
| 402 | `PLAN_LIMIT` | Kuota paket habis: post per bulan, akun atau penyimpanan. Pesannya menyebutkan yang mana. |
| 403 | `FORBIDDEN` | Kredensial hanya-baca, aksi khusus pemilik, atau workspace yang butuh persetujuan pemilik. |
| 404 | `NOT_FOUND` | Tidak ada di workspace ini (atau sudah dihapus). |
| 409 | `CONFLICT` | Post sedang diterbitkan, sudah berubah sejak dibaca (`expectedVersion`), tidak ada yang bisa dicoba ulang, atau platform menolak aksinya (pesannya menjelaskan). |
| 429 | `RATE_LIMITED` | Terlalu banyak request. Tunggu `Retry-After` detik. |
| 500 | `INTERNAL` | Ada yang rusak di sisi kami. Coba lagi nanti; kabari kami kalau terus terjadi. |

Coba ulang `429`, `500` dan error jaringan dengan jeda yang makin panjang. Jangan mengulang `400`, `401`, `402`, `403` atau
`404` tanpa perubahan.

## Masalah pre-flight

Saat post dijadwalkan, diterbitkan atau [divalidasi](/api/operations/validatepost/), tiap target diperiksa terhadap
[aturan content type-nya](/id/platforms/). Error menghalangi penjadwalan; warning tidak. Draft tidak diperiksa.

| Kode | Tingkat | Artinya |
|---|---|---|
| `empty_post` | error | Tidak ada caption maupun media. |
| `caption_length` | error | Caption melebihi batas platform. |
| `caption_hashtags`, `caption_mentions` | error | Terlalu banyak hashtag atau @mention (Instagram: 30 dan 20). |
| `media_count` | error | File terlalu sedikit atau terlalu banyak untuk format itu. |
| `media_kind` | error | Foto padahal butuh video, atau sebaliknya. |
| `media_format` | error | Jenis file tidak diterima (mis. PNG untuk foto Instagram, yang harus JPEG). |
| `media_size` | error | File terlalu besar. |
| `media_aspect` | error | Lebar ÷ tinggi di luar rentang yang diizinkan. |
| `media_duration` | error | Video terlalu pendek atau terlalu panjang. |
| `follow_up_length` | error | Komentar lanjutan terlalu panjang. |
| `youtube_title`, `youtube_tags`, `youtube_thumbnail`, `youtube_angle_brackets` | error | Batas metadata YouTube. |
| `media_aspect_recommended` | warning | Diizinkan, tapi bukan bentuk yang disarankan platform. |
| `media_dimensions_unknown`, `media_duration_unknown` | warning | PostFlow tidak bisa mengukur video; kirim `width`, `height` dan `durationMs` saat impor. |
| `caption_unsupported`, `first_comment_unsupported`, `follow_up_unsupported` | warning | Formatnya mengabaikan isian itu (mis. caption di Story). |
| `youtube_long` | warning | Video panjang butuh channel YouTube yang sudah verifikasi nomor HP. |

## Setelah dijadwalkan

Error dari platform saat penerbitan tidak menggagalkan request Anda; error muncul di target post dengan `status: "failed"`,
`errorCode` dan `errorMessage` yang jelas, serta lewat [webhook `post.failed`](/id/guides/webhooks/). Lihat
[Status post](/id/platforms/statuses/).