Postlar
Sosyal medya gönderilerinizi oluşturun, planlayın, taslak olarak saklayın ve tüm platformlarda yayınlayın. Platform bazlı içerik özelleştirmesi, toplu işlemler ve anlık yayın desteği sunar.
Gönderi Oluştur / Planla
Yeni bir gönderi oluşturur. scheduling.publishAt verilirse belirlenen zamanda yayınlanır. Verilmezse isDraft: true ile taslak, isDraft: false ile anlık yayın başlar.
İstek Gövdesi
| Alan | Tip | Zorunlu | Varsayılan | Açıklama |
|---|---|---|---|---|
platforms | string[] | Evet | — | Platform listesi: instagram facebook linkedin tiktok twitter youtube |
accountIds | string[] | Evet | — | Gönderi yapılacak hesap ID’leri |
content.text | string | Evet | — | Gönderi metni (maks. 63.206 karakter) |
content.media | object[] | Hayır | — | Medya eklentileri |
content.media[].mediaId | string | Evet* | — | /media/upload ile alınan medya ID’si |
content.media[].order | integer | Hayır | 0 | Gösterim sırası |
content.platformOverrides | object | Hayır | — | Platform bazlı içerik özelleştirmeleri (bkz. aşağı) |
scheduling.publishAt | string | Hayır | — | Yayın zamanı — ISO 8601 |
scheduling.timezone | string | Hayır | Europe/Istanbul | Zaman dilimi |
title | string | Hayır | — | İç başlık (maks. 255 karakter, dashboardda görünür) |
tags | string[] | Hayır | [] | İç etiketler (filtreleme için) |
isDraft | boolean | Hayır | false | true ise taslak olarak kaydeder, yayınlamaz |
Platform Özelleştirmeleri (content.platformOverrides)
Her platform için farklı metin veya medya seti belirtebilirsiniz:
"platformOverrides": {
"instagram": {
"text": "Instagram'a özel metin #instagram",
"media": [{ "mediaId": "media_01XYZ", "order": 0 }]
},
"linkedin": {
"text": "LinkedIn için daha profesyonel bir metin."
}
}Kod Örnekleri
Node.js
const response = await fetch('https://api.sosyalkopru.com/v1/posts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platforms: ['instagram', 'linkedin'],
accountIds: ['acc_01HZGK9P3QXYZ'],
title: 'Ürün Lansmanı - Haziran 2025',
tags: ['lansman', 'instagram'],
content: {
text: 'Yeni ürünümüzü tanıtmaktan mutluluk duyuyoruz! 🚀 #sosyalkopru',
platformOverrides: {
linkedin: {
text: 'Yeni ürünümüzü resmi olarak tanıtmaktan büyük memnuniyet duyuyoruz.',
},
},
},
scheduling: {
publishAt: '2025-06-15T10:00:00Z',
timezone: 'Europe/Istanbul',
},
}),
})
const { data } = await response.json()
console.log('Gönderi planlandı:', data.id, '|', data.status)Başarılı Yanıtlar
Planlı gönderi (201 Created):
{
"success": true,
"data": {
"id": "post_01HZGK9P3QABC",
"status": "SCHEDULED",
"title": "Ürün Lansmanı - Haziran 2025",
"tags": ["lansman"],
"scheduledAt": "2025-06-15T07:00:00.000Z",
"createdAt": "2025-06-10T12:00:00.000Z"
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Anlık yayın — publishing durumunda BullMQ kuyruğuna eklenir (201 Created):
{
"success": true,
"data": {
"id": "post_01HZGK9P3QABC",
"status": "publishing",
"message": "Gönderi yayın kuyruğuna eklendi.",
"createdAt": "2025-06-10T12:00:00.000Z"
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Taslak (isDraft: true, 201 Created):
{
"success": true,
"data": {
"id": "post_01HZGK9P3QABC",
"status": "DRAFT",
"createdAt": "2025-06-10T12:00:00.000Z"
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Anlık yayın isteklerinde gönderi hemen PUBLISHED dönmez — yayın işlemi asenkron olarak BullMQ worker tarafından işlenir. Durumu takip etmek için GET /posts/{id}/status endpoint’ini polling ile kullanın.
Gönderileri Listele
Kullanıcının gönderilerini sayfalandırılmış olarak döner.
Query Parametreleri
| Parametre | Tip | Varsayılan | Açıklama |
|---|---|---|---|
page | integer | 1 | Sayfa numarası |
perPage | integer | 20 | Sayfa başına kayıt (maks: 100) |
status | string | — | draft scheduled publishing published failed cancelled |
platform | string | — | Platform filtresi |
workspaceId | string | — | Workspace filtresi |
startDate | string | — | ISO 8601 başlangıç |
endDate | string | — | ISO 8601 bitiş |
tag | string | — | İç etiket filtresi |
Kod Örnekleri
Node.js
const params = new URLSearchParams({
page: '1',
perPage: '20',
status: 'scheduled',
})
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts?${params}`,
{ headers: { 'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}` } }
)
const { data, pagination } = await response.json()
console.log(`${pagination.total} gönderi — ${pagination.totalPages} sayfa`)
data.forEach(p => console.log(p.id, p.status, p.scheduledAt ?? ''))Başarılı Yanıt
{
"success": true,
"data": [
{
"id": "post_01HZGK9P3QABC",
"title": "Ürün Lansmanı",
"tags": ["lansman"],
"content": { "text": "Gönderi metni..." },
"status": "SCHEDULED",
"scheduledAt": "2025-06-15T07:00:00.000Z",
"publishedAt": null,
"platforms": ["instagram", "linkedin"],
"createdAt": "2025-06-10T12:00:00.000Z"
}
],
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" },
"pagination": {
"page": 1,
"perPage": 20,
"total": 47,
"totalPages": 3,
"hasNextPage": true,
"hasPrevPage": false
}
}Gönderi Detayı
Tek bir gönderinin tüm detaylarını, platform bazlı durumları ve metrikleriyle döner.
Path Parametresi
| Parametre | Açıklama |
|---|---|
id | Gönderi ID’si (post_...) |
Kod Örnekleri
Node.js
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}`,
{ headers: { 'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}` } }
)
const { data } = await response.json()
console.log('Durum:', data.status)
data.platforms.forEach(p => {
console.log(` [${p.platform}] ${p.status}`)
if (p.metrics) {
console.log(` Beğeni: ${p.metrics.likes} | Yorum: ${p.metrics.comments}`)
}
})Başarılı Yanıt
{
"success": true,
"data": {
"id": "post_01HZGK9P3QABC",
"title": "Ürün Lansmanı",
"tags": ["lansman"],
"content": {
"text": "Gönderi metni...",
"media": []
},
"status": "PUBLISHED",
"scheduledAt": null,
"publishedAt": "2025-06-10T12:00:00.000Z",
"platforms": [
{
"platform": "instagram",
"username": "@sosyalkopru",
"status": "PUBLISHED",
"platformPostId": "17862...",
"platformPostUrl": "https://instagram.com/p/ABC123",
"errorMessage": null,
"metrics": {
"likes": 142,
"comments": 18,
"shares": 5,
"reach": 2300,
"impressions": 3100
}
}
],
"createdAt": "2025-06-10T11:55:00.000Z",
"updatedAt": "2025-06-10T12:00:05.000Z"
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Gönderi Güncelle
Yalnızca SCHEDULED veya DRAFT statüsündeki gönderileri güncelleyebilirsiniz.
İstek Gövdesi
| Alan | Tip | Açıklama |
|---|---|---|
content.text | string | Yeni gönderi metni |
content.platformOverrides | object | Platform bazlı özelleştirmeler |
scheduling.publishAt | string | Yeni yayın zamanı (ISO 8601) |
title | string | Yeni iç başlık |
tags | string[] | Yeni etiket listesi |
isDraft | boolean | false ile taslağı yayına alabilirsiniz |
Kod Örnekleri
Node.js
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}`,
{
method: 'PATCH',
headers: {
'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: { text: 'Güncellenmiş gönderi metni #sosyalkopru' },
scheduling: { publishAt: '2025-06-16T10:00:00Z' },
tags: ['lansman', 'guncellendi'],
}),
}
)
const { data } = await response.json()
console.log('Güncellendi:', data.scheduledAt)PUBLISHED, PUBLISHING veya FAILED durumundaki gönderiler güncellenemez — 422 Unprocessable Entity hatası döner.
Gönderi İptal Et / Sil
Planlanmış veya taslak bir gönderiyi iptal eder. PUBLISHED veya PUBLISHING durumundaki gönderiler silinemez.
Kod Örnekleri
Node.js
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}`,
{
method: 'DELETE',
headers: { 'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}` },
}
)
const { data } = await response.json()
console.log('İptal edildi:', data.id)Yayın Durumu
Bir gönderinin platform bazlı anlık yayın durumunu ve BullMQ iş bilgisini döner.
Kod Örnekleri
Node.js
const poll = async (postId) => {
while (true) {
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}/status`,
{ headers: { 'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}` } }
)
const { data } = await response.json()
if (['PUBLISHED', 'PARTIAL', 'FAILED'].includes(data.overallStatus)) {
console.log('Tamamlandı:', data.overallStatus)
return data
}
console.log('Bekleniyor:', data.overallStatus, '— 3 saniye sonra tekrar...')
await new Promise(r => setTimeout(r, 3000))
}
}
await poll('post_01HZGK9P3QABC')Başarılı Yanıt
{
"success": true,
"data": {
"postId": "post_01HZGK9P3QABC",
"overallStatus": "PARTIAL",
"job": {
"id": "job_01XYZ",
"state": "completed",
"progress": 100,
"attemptsMade": 1
},
"platforms": [
{
"platform": "instagram",
"username": "@sosyalkopru",
"status": "PUBLISHED",
"publishedAt": "2025-06-10T12:00:05.000Z",
"platformPostId": "17862...",
"platformPostUrl": "https://instagram.com/p/ABC123",
"errorMessage": null
},
{
"platform": "facebook",
"username": "Sosyal Köprü",
"status": "FAILED",
"publishedAt": null,
"platformPostId": null,
"platformPostUrl": null,
"errorMessage": "Oturum süresi doldu, hesabı yeniden bağlayın"
}
]
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Gönderi Kopyala
Bir gönderiyi taslak olarak kopyalar. Tüm içerik, medya ve platform ayarları kopyalanır; scheduledAt temizlenir.
Kod Örnekleri
Node.js
const response = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}/duplicate`,
{
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}` },
}
)
const { data } = await response.json()
console.log('Kopyalandı. Yeni taslak ID:', data.id)Başarılı Yanıt
{
"success": true,
"data": {
"id": "post_01HZGK9P3QNEW",
"status": "DRAFT",
"originalPostId": "post_01HZGK9P3QABC",
"createdAt": "2025-06-10T13:00:00.000Z"
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Toplu İşlemler
Birden fazla gönderi üzerinde aynı anda delete, cancel veya reschedule işlemi yapar. Tek seferde en fazla 50 gönderi işlenebilir.
İstek Gövdesi
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
action | string | Evet | delete cancel reschedule |
postIds | string[] | Evet | İşlenecek gönderi ID’leri (maks. 50) |
publishAt | string | reschedule için | Yeni yayın zamanı (ISO 8601) |
Kod Örnekleri
Node.js
// Toplu iptal
const cancelResponse = await fetch('https://api.sosyalkopru.com/v1/posts/bulk', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: 'cancel',
postIds: [
'post_01HZGK9P3QABC',
'post_01HZGK9P3QDEF',
'post_01HZGK9P3QGHI',
],
}),
})
const { data } = await cancelResponse.json()
console.log(`Başarılı: ${data.succeeded} | Başarısız: ${data.failed}`)
// Toplu yeniden planlama
const rescheduleResponse = await fetch('https://api.sosyalkopru.com/v1/posts/bulk', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SOSYALKOPRU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: 'reschedule',
postIds: ['post_01HZGK9P3QABC', 'post_01HZGK9P3QDEF'],
publishAt: '2025-06-20T09:00:00Z',
}),
})Başarılı Yanıt
{
"success": true,
"data": {
"action": "cancel",
"processed": 3,
"succeeded": 2,
"failed": 1,
"errors": [
{
"id": "post_01HZGK9P3QGHI",
"reason": "PUBLISHED gönderiler iptal edilemez"
}
]
},
"meta": { "requestId": "req_01XYZ", "timestamp": "...", "version": "1" }
}Gönderi Statüleri
| Statü | Açıklama |
|---|---|
DRAFT | Taslak — henüz planlanmamış |
SCHEDULED | Gelecek bir zamana planlandı |
PUBLISHING | BullMQ kuyruğunda işleniyor |
PUBLISHED | Tüm platformlarda başarıyla yayınlandı |
PARTIAL | Bazı platformlarda başarılı, bazılarında başarısız |
FAILED | Tüm platformlarda başarısız |
CANCELLED | İptal edildi |
Desteklenen Platformlar
| Değer | Platform |
|---|---|
instagram | |
facebook | |
linkedin | |
tiktok | TikTok |
twitter | Twitter / X |
youtube | YouTube |