Postingan
Publikasikan postingan
Aplikasi live memublikasikan langsung, menjadwalkan, atau menyimpan draf; aplikasi uji hanya mensimulasikan. Dengan ?dry_run=true semua dicek tanpa menulis.
Postingan milik sebuah usaha dan terbit ke satu atau beberapa jaringan, target-nya. Setiap target punya teks, media, format, dan statusnya sendiri.
Jenis postingan: sekarang, terjadwal, atau draf
Dua kolom pada isi permintaan menentukan kapan, dan apakah, postingan terbit:
| Kasus | Isi | Perilaku |
|---|---|---|
| Sekarang | tanpa scheduledAt | Postingan langsung terbit. |
| Terjadwal | scheduledAt: tanggal-jam ISO 8601 di masa depan | Akan terbit pada scheduledAt. |
| Draf | "status": "draft", tanpa scheduledAt | Disimpan dan tidak terbit. |
Isi sebuah postingan
| Kolom | Arti |
|---|---|
establishmentId | Usaha yang menerbitkan (GET /v1/establishments) |
targets[] | Satu entri per jaringan: platform, text, dan opsional media, format, dan accountId |
targets[].media[] | Media dari pustaka lewat id-nya, atau url https publik dengan type-nya (image atau video) |
targets[].accountId | Akun yang dipakai saat usaha punya beberapa di jaringan itu |
scheduledAt | Tanggal-jam ISO 8601 di masa depan; jika tidak ada, postingan langsung terbit |
status | draft untuk menyimpan draf yang tidak terbit (maka tanpa scheduledAt) |
Media sebuah target
Setiap entri targets[].media menunjuk media dari pustaka lewat id-nya, atau url https publik dengan type-nya (image atau video). Instagram dan TikTok mewajibkan foto atau video. Untuk menambahkan media ke pustaka media, lihat Mengimpor media.
Menduplikasi postingan
Tidak ada endpoint khusus untuk menduplikasi postingan: bacalah dengan `GET /v1/posts/{id}`, lalu kirim ulang isinya dalam permintaan POST /v1/posts yang baru.
Sebelum mengirim ulang, hapus kolom yang diisi Sofia sendiri. Setidaknya:
iddancreatedAtpostingan;statuspostingan yang dibaca (merangkum status pengiriman): tentukan yang Anda mau, atau hilangkan;- di setiap target:
state,publishedAt,permalink, danerror.
Pertahankan establishmentId, dan untuk setiap target platform dan accountId. Pembacaan tidak mengembalikan teks target maupun medianya: sediakan lagi. Terakhir, tentukan scheduledAt baru (atau hilangkan untuk menerbitkan langsung, atau kirim "status": "draft").
Postingan pertama Anda
1. Memeriksa jaringan terhubung
Sebuah postingan terbit lewat akun yang terhubung ke usaha. Daftarkan akun itu; jika ada yang kurang, buat tautan koneksi. Lihat Akun terhubung.
2. Menambahkan media
Instagram dan TikTok mewajibkan foto atau video. Impor satu dari URL https publik; Sofia mengunduhnya ke pustaka media dan mengembalikan id-nya. Lihat Mengimpor media.
3. Memeriksa dengan simulasi
Tambahkan ?dry_run=true: Sofia menilai setiap jaringan menurut aturan aslinya dan akun terhubung, dan tidak menulis apa pun.
curl -X POST 'https://api.sofia-post.com/api/v1/posts?dry_run=true' \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"establishmentId": "'$ESTABLISHMENT_ID'",
"targets": [
{ "platform": "instagram", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] },
{ "platform": "facebook", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] }
]
}'{
"status": "ready",
"dryRun": true,
"targets": [
{ "platform": "instagram", "accountId": "fecd0904-…", "handle": "sof_ia_officiel", "state": "ready" },
{ "platform": "facebook", "accountId": "a423b3a4-…", "handle": "Sofia post", "state": "ready" }
]
}4. Menerbitkan
Kirim isi yang sama tanpa dry_run, dengan Idempotency-Key agar percobaan ulang tidak pernah menerbitkan dua kali. Tanpa scheduledAt, postingan langsung terbit; dengan scheduledAt di masa depan, postingan dijadwalkan.
curl -X POST https://api.sofia-post.com/api/v1/posts \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d @post.json5. Memantaunya
Postingan menjawab publishing, lalu setiap jaringan berubah menjadi published dengan tautan permanennya, atau failed dengan alasannya. Baca dengan `GET /v1/posts/{id}`, atau daftarkan webhook agar diberi tahu.
Simulasi (dry run)
POST /v1/posts?dry_run=true menjalankan pemeriksaan postingan sungguhan: aturan setiap jaringan, akun terhubung, media, tanggal, dan paket Anda. Tidak menyimpan dan tidak mengirim apa pun.
Siap
Jika setiap jaringan akan menerima postingan, responsnya 200 dengan status: "ready" dan, untuk setiap target, akun yang akan menerbitkan.
Ditolak
Jika tidak, responsnya 422 post_refused, dengan satu rincian per alasan. Setiap rincian menyebutkan jaringannya, code-nya, dan apa yang harus diperbaiki.
{
"error": {
"code": "post_refused",
"message": "The post would not be published: x: the text is too long (300 characters, at most 280)",
"details": [
{
"platform": "x",
"code": "caption_too_long",
"max": 280,
"actual": 300,
"message": "x: the text is too long (300 characters, at most 280)"
}
],
"docUrl": "https://www.sofia-post.com/developers/errors#post_refused"
}
}Setiap alasan terdaftar di kesalahan.
Untuk mode uji aplikasi, lihat Mode uji dan simulasi. Idempotency-Key juga melindungi POST /v1/posts: lihat Idempotensi.
Otorisasi
AuthorizationstringheaderwajibKunci pribadi atau access token OAuth Anda, dikirim sebagai
Bearer <token>.
Parameter query
dry_runstringtrue: menjalankan setiap pemeriksaan yang dilakukan pengiriman (aturan jaringan, akun, media, pembuatan, langganan live) tanpa menulis apa pun. Mengembalikan 200readyatau 422post_refused.Nilai yang diizinkan:
truefalse
Header
Idempotency-KeystringBila diulang dengan body yang sama, permintaan mengembalikan respons yang sama tanpa membuat postingan kedua. Dry run tidak memakai kunci ini.
Body
establishmentIdstringwajibUsaha, di Workspace grant token (
GET /v1/establishments)targetsobject[]wajibSatu jaringan per target
Tampilkan atribut turunan
platformstringwajibJaringan yang dituju
Nilai yang diizinkan:
instagramfacebookxlinkedintiktoktextstringwajibCaption yang dipublikasikan di jaringan ini
mediaobject[]Media terlampir
Tampilkan atribut turunan
idstringPengenal media di pustaka usaha (jika tidak,
urldantype)urlstringAlamat publik media (https di live); tanpa pengenal
typestringJenis media yang diberikan lewat alamat
Nilai yang diizinkan:
imagevideo
formatstringFormat (
post,reel,story,carousel...); default-nya yang akan disajikan jaringanaccountIdstringLive: akun terhubung yang memublikasikan, bila usaha memiliki beberapa di jaringan ini (
GET /v1/establishments/:id/accounts)
scheduledAtstring<date-time>Tanggal penjadwalan (ISO 8601), di masa depan; tidak diisi: publikasikan segera. Tidak boleh bersama
statusdraftstatusstringdraft: sebuah draf (hanya live), dibuat tanpa tanggal, tidak ada yang dikirim;PATCH /v1/posts/:idmenjadwalkannyaNilai yang diizinkan:
draft
Respons
Dry run: semua pemeriksaan lolos.
statusstringwajibSelalu
readyNilai yang diizinkan:
readydryRunbooleanwajibSelalu
trueNilai yang diizinkan:
truetargetsobject[]wajibTarget yang diperiksa
Tampilkan atribut turunan
platformstringwajibJaringan target
statestringwajibSelalu
readyNilai yang diizinkan:
readyaccountIdstringLive: akun yang akan memublikasikan
handlestringLive: handle yang ditampilkan