Geliştirici
Public API
Kendi sisteminizden medya yükleyin, gönderi oluşturun ve yayınlayın. Yüzey bilerek dar: "gönderi at" senaryosunun tamamı, fazlası değil. Tüm zamanlar RFC 3339, tüm cevaplar tek bir zarfın içinde.
Temel adres
https://api.akisla.com/v1Kimlik başlığı
Authorization: Bearer smp_<prefix>_<secret>Kimlik doğrulama
Panelden bir API anahtarı üretin ve her isteğe Bearer olarak ekleyin. Sır yalnızca üretildiği anda görünür; sunucuda yalnızca özeti saklanır, dolayısıyla kaybedilen bir anahtar geri getirilemez — yenisi üretilir.
Anahtar, onu üretenden fazlasını yapamaz
Anahtar organizasyona aittir, sıradan bir rol taşır ve yaratıcısı adına hareket eder. Üstüne workspace kısıtı koyabilirsiniz; hiç koymazsanız yaratıcısının eriştiği her workspace'e erişir.
Tek kapı, tek kimlik
/v1 yalnızca API anahtarı kabul eder, panel oturumu değil. Kapsam dışı bir workspace 404 döner — 403 değil, çünkü bir kimliğin görmediği kaydın var olduğunu doğrulamak da bilgi vermektir.
İptal anında geçerlidir
Bir anahtarı panelden iptal ettiğiniz an sonraki istek 401 alır. Rotasyon için yeni anahtar üretin, geçişi yapın, eskisini iptal edin.
İstek limitleri
Bütçe anahtar başınadır: bir entegrasyonunuz döngüye girse diğerleri çalışmaya devam eder. Kova sürekli dolar — dakikalık bütçenin tamamını bir kerede harcayıp sonra sabit hıza oturabilirsiniz.
okuma
Okuma uçları, dakikada.
yazma
Yazma uçları (medya · gönderi · yayın), dakikada. Bir gönderi yayınlamak üç istektir.
Bütçe her cevapta bildirilir
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1785667890
{ "error": { "message": "rate limit exceeded", "code": "RATE_LIMITED" } }Hatalar
Her hata aynı zarfla döner. Kod makine içindir ve kalıcıdır: yenisi eklenebilir, var olan yeniden adlandırılmaz. Mesaj insan içindir ve değişebilir — koşullarınızı koda bağlayın, mesaja değil.
Hata zarfı
{
"error": {
"message": "account_ids is required",
"code": "VALIDATION_ERROR"
}
}UNAUTHORIZED401Anahtar eksik, bozuk, süresi geçmiş veya iptal edilmiş.
FORBIDDEN403Anahtarın rolü bu işlem için yetersiz.
NOT_FOUND404Kayıt yok — ya da anahtarın kapsamı dışında.
INVALID_BODY400Gövde ayrıştırılamadı (bozuk JSON, yanlış tip).
VALIDATION_ERROR400Bir alan reddedildi; mesaj alanı adıyla anar.
BAD_REQUEST400İstek eksik: örneğin yüklemede dosya yok.
EMPTY_POST400Ne metin ne medya var; boş gönderi oluşturulmaz.
MEDIA_NOT_FOUND400Verilen medya id'lerinden biri bu workspace'te yok.
ACCOUNT_NOT_FOUND400Verilen hesap id'lerinden biri bu workspace'te yok veya bağlı değil.
NO_TARGETS400Hiç geçerli hedef kalmadı.
SCHEDULE_IN_PAST400scheduled_at geçmiş bir an.
UNSUPPORTED_TYPE415Dosya türü desteklenmiyor.
NOT_PUBLISHABLE409Gönderi bulunduğu durumdan yayına geçemez (örneğin zaten yayınlanmış).
NO_QUEUE_SLOTS409Workspace'in tanımlı kuyruk slotu yok.
RATE_LIMITED429Bütçe doldu; Retry-After kadar bekleyin.
INTERNAL500Bizim tarafımızda bir hata. Tekrar deneyin, sürerse yazın.
Workspace'ler ve hesaplar
Her şeyin başladığı yer: anahtarın hangi müşterilere ve hangi bağlı hesaplara eriştiği.
/v1/workspacesokumaAnahtarın erişebildiği workspace'ler. Kısıtlı bir anahtar yalnızca kendi listesini görür.
İstek
curl -X GET "https://api.akisla.com/v1/workspaces" \
-H "Authorization: Bearer $SMP_API_KEY"Cevap
{
"data": [
{ "id": 24, "name": "Kahve Dünyası" }
],
"meta": { "has_more": false, "total": 1 }
}/v1/workspaces/{workspace_id}/accountsokumaWorkspace'e bağlı sosyal hesaplar. Token'lar hiçbir zaman burada görünmez.
İstek
curl -X GET "https://api.akisla.com/v1/workspaces/{workspace_id}/accounts" \
-H "Authorization: Bearer $SMP_API_KEY"Cevap
{
"data": [
{
"id": 41,
"platform": "instagram",
"handle": "kahvedunyasi",
"display_name": "Kahve Dünyası",
"status": "active"
}
],
"meta": { "has_more": false, "total": 1 }
}Medya
Görsel ve videolar gönderiye eklenmeden önce yüklenir ve bir id alır.
/v1/workspaces/{workspace_id}/mediayazmaBir dosyayı workspace'in kütüphanesine yükler. Dönen url süreli imzalıdır, saklamayın.
Gövde alanları
filezorunluYüklenecek dosya (multipart alan adı file).
multipart/form-data
İstek
curl -X POST "https://api.akisla.com/v1/workspaces/{workspace_id}/media" \
-H "Authorization: Bearer $SMP_API_KEY" \
-F "file=@post.jpg"Cevap
{
"data": {
"id": 318,
"file_name": "post.jpg",
"media_type": "image",
"mime_type": "image/jpeg",
"width": 1080,
"height": 1350,
"url": "https://…/blob/…?token=…"
}
}Yükleme sınırı istek başına 25 MB. Görselin boyutu sunucuda ölçülür; video boyutu ve kapak karesi tarayıcıya özgü olduğu için API'den yüklenen videolar ölçüsüz kalır — bu alanları okuyan her şey zaten bu durumu karşılar.
Gönderiler
Bir gönderi önce taslak olarak oluşur. Yazmak ile yollamak ayrı iki karardır — entegrasyon için de öyle kalır.
/v1/workspaces/{workspace_id}/postsyazmaTaslak oluşturur. Metin veya medyadan en az biri gerekir.
Gövde alanları
bodyGönderi metni. Platforma özgü metin için overrides kullanın.
string
media_idsEklenecek medya id'leri, yükleme sırasıyla.
int[]
İstek
curl -X POST "https://api.akisla.com/v1/workspaces/{workspace_id}/posts" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Yeni sezon başladı.", "media_ids": [318] }'Cevap
{
"data": {
"id": 62,
"workspace_id": 24,
"body": "Yeni sezon başladı.",
"status": "draft",
"created_at": "2026-08-02T14:05:00+03:00",
"targets": [],
"media_ids": [318]
}
}/v1/workspaces/{workspace_id}/postsokumaGönderileri filtreli listeler. Platform ve hesap, gönderinin hedefleri üzerinden eşleşir; tarih aralığı takvim anına uygulanır, dolayısıyla taslakları hariç tutar.
Sorgu parametreleri
statusTek bir duruma daraltır. Boş bırakırsanız hepsi.
string
platformGönderinin hedeflerinden biri bu platformdaysa eşleşir.
string
account_idGönderinin hedeflerinden biri bu hesapsa eşleşir.
int
fromBu andan itibaren (takvim anına göre).
RFC 3339
toBu ana kadar (takvim anına göre).
RFC 3339
sortSıralama. Tanımsız bir değer sessizce varsayılana düşer.
string
limitEn fazla kaç satır. Üst sınır 100; kesildiğinde meta.has_more true olur.
int
İstek
curl -X GET "https://api.akisla.com/v1/workspaces/{workspace_id}/posts" \
-H "Authorization: Bearer $SMP_API_KEY"Cevap
{
"data": [ { "id": 62, "status": "scheduled", "…": "…" } ],
"meta": {
"has_more": false,
"total": 24,
"status_counts": { "draft": 9, "scheduled": 12, "published": 3 }
}
}/v1/posts/{post_id}okumaTek gönderi, hedefleriyle birlikte. Yayın sonucunu buradan yoklarsınız: her hedefin kendi durumu ve hata mesajı vardır.
İstek
curl -X GET "https://api.akisla.com/v1/posts/{post_id}" \
-H "Authorization: Bearer $SMP_API_KEY"Cevap
{
"data": {
"id": 62,
"status": "published",
"published_at": "2026-08-03T10:00:00+03:00",
"targets": [
{
"account_id": 41,
"platform": "instagram",
"handle": "kahvedunyasi",
"status": "published",
"format": "feed",
"provider_post_id": "17912…"
}
],
"media_ids": [318]
}
}status kabul ettiği değerler
- draft
- pending_approval
- approved
- scheduled
- publishing
- published
- partial_failed
- failed
sort kabul ettiği değerler
- created_desc
- created_asc
- date_desc
- date_asc
Yayınlama
Aynı gövde üç uçta: hemen yayınla, belirli bir ana zamanla, ya da workspace'in kuyruğundaki ilk boş slota bırak.
/v1/posts/{post_id}/publishyazmaTaslağı seçilen hesaplara hemen yayınlar. Yayın asenkron çalışır: cevap publishing döner, sonucu gönderiyi getirerek öğrenirsiniz.
Gövde alanları
account_idszorunluHangi hesaplara gideceği. En az bir, en fazla yirmi.
int[]
overridesPlatform başına metin. Verilmeyen platform ana metni kullanır.
map<platform,string>
formatsPlatform başına biçim (örneğin instagram için reels).
map<platform,string>
titlesPlatform başına başlık — başlık isteyen platformlar için (YouTube gibi).
map<platform,string>
İstek
curl -X POST "https://api.akisla.com/v1/posts/{post_id}/publish" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_ids": [41],
"formats": { "instagram": "reels" },
"overrides": { "x": "Kısa hâli." }
}'Cevap
{
"data": { "id": 62, "status": "publishing", "…": "…" }
}/v1/posts/{post_id}/scheduleyazmaTaslağı belirli bir ana zamanlar. scheduled_at gelecekte olmalıdır.
Gövde alanları
account_idszorunluHangi hesaplara gideceği. En az bir, en fazla yirmi.
int[]
scheduled_atzorunluYayın anı, RFC 3339. Gelecekte olmalı.
RFC 3339
overridesPlatform başına metin. Verilmeyen platform ana metni kullanır.
map<platform,string>
formatsPlatform başına biçim (örneğin instagram için reels).
map<platform,string>
titlesPlatform başına başlık — başlık isteyen platformlar için (YouTube gibi).
map<platform,string>
İstek
curl -X POST "https://api.akisla.com/v1/posts/{post_id}/schedule" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_ids": [41],
"scheduled_at": "2026-08-03T10:00:00+03:00"
}'Cevap
{
"data": {
"id": 62,
"status": "scheduled",
"scheduled_at": "2026-08-03T10:00:00+03:00"
}
}/v1/posts/{post_id}/queueyazmaTaslağı workspace'in kuyruğundaki ilk boş slota koyar. Slot tanımlı değilse istek reddedilir.
Gövde alanları
account_idszorunluHangi hesaplara gideceği. En az bir, en fazla yirmi.
int[]
overridesPlatform başına metin. Verilmeyen platform ana metni kullanır.
map<platform,string>
formatsPlatform başına biçim (örneğin instagram için reels).
map<platform,string>
titlesPlatform başına başlık — başlık isteyen platformlar için (YouTube gibi).
map<platform,string>
İstek
curl -X POST "https://api.akisla.com/v1/posts/{post_id}/queue" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "account_ids": [41] }'Cevap
{
"data": {
"id": 62,
"status": "scheduled",
"scheduled_at": "2026-08-10T10:00:00+03:00"
}
}Baştan sona bir örnek
Bir görseli yükleyip yarın sabaha zamanlamak ve sonucunu öğrenmek — dört istek.
bash
# 1. Upload the asset
MEDIA_ID=$(curl -s -X POST "https://api.akisla.com/v1/workspaces/24/media" \
-H "Authorization: Bearer $SMP_API_KEY" \
-F "file=@post.jpg" | jq .data.id)
# 2. Compose the draft
POST_ID=$(curl -s -X POST "https://api.akisla.com/v1/workspaces/24/posts" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"body\":\"Yeni sezon başladı.\",\"media_ids\":[$MEDIA_ID]}" | jq .data.id)
# 3. Schedule it — composing and sending stay two decisions
curl -X POST "https://api.akisla.com/v1/posts/$POST_ID/schedule" \
-H "Authorization: Bearer $SMP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"account_ids":[41],"scheduled_at":"2026-08-03T10:00:00+03:00"}'
# 4. Ask how it went
curl "https://api.akisla.com/v1/posts/$POST_ID" \
-H "Authorization: Bearer $SMP_API_KEY"