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/v1

Kimlik 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.

API anahtarlarım

İ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.

    300

    okuma

    Okuma uçları, dakikada.

    60

    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"
  }
}
  • UNAUTHORIZED401

    Anahtar eksik, bozuk, süresi geçmiş veya iptal edilmiş.

  • FORBIDDEN403

    Anahtarın rolü bu işlem için yetersiz.

  • NOT_FOUND404

    Kayıt yok — ya da anahtarın kapsamı dışında.

  • INVALID_BODY400

    Gövde ayrıştırılamadı (bozuk JSON, yanlış tip).

  • VALIDATION_ERROR400

    Bir alan reddedildi; mesaj alanı adıyla anar.

  • BAD_REQUEST400

    İstek eksik: örneğin yüklemede dosya yok.

  • EMPTY_POST400

    Ne metin ne medya var; boş gönderi oluşturulmaz.

  • MEDIA_NOT_FOUND400

    Verilen medya id'lerinden biri bu workspace'te yok.

  • ACCOUNT_NOT_FOUND400

    Verilen hesap id'lerinden biri bu workspace'te yok veya bağlı değil.

  • NO_TARGETS400

    Hiç geçerli hedef kalmadı.

  • SCHEDULE_IN_PAST400

    scheduled_at geçmiş bir an.

  • UNSUPPORTED_TYPE415

    Dosya türü desteklenmiyor.

  • NOT_PUBLISHABLE409

    Gönderi bulunduğu durumdan yayına geçemez (örneğin zaten yayınlanmış).

  • NO_QUEUE_SLOTS409

    Workspace'in tanımlı kuyruk slotu yok.

  • RATE_LIMITED429

    Bütçe doldu; Retry-After kadar bekleyin.

  • INTERNAL500

    Bizim 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.

GET/v1/workspacesokuma

Anahtarı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 }
}
GET/v1/workspaces/{workspace_id}/accountsokuma

Workspace'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.

POST/v1/workspaces/{workspace_id}/mediayazma

Bir dosyayı workspace'in kütüphanesine yükler. Dönen url süreli imzalıdır, saklamayın.

Gövde alanları

  • filezorunlu

    Yü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.

POST/v1/workspaces/{workspace_id}/postsyazma

Taslak oluşturur. Metin veya medyadan en az biri gerekir.

Gövde alanları

  • body

    Gönderi metni. Platforma özgü metin için overrides kullanın.

    string

  • media_ids

    Eklenecek 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]
  }
}
GET/v1/workspaces/{workspace_id}/postsokuma

Gö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

  • status

    Tek bir duruma daraltır. Boş bırakırsanız hepsi.

    string

  • platform

    Gönderinin hedeflerinden biri bu platformdaysa eşleşir.

    string

  • account_id

    Gönderinin hedeflerinden biri bu hesapsa eşleşir.

    int

  • from

    Bu andan itibaren (takvim anına göre).

    RFC 3339

  • to

    Bu ana kadar (takvim anına göre).

    RFC 3339

  • sort

    Sıralama. Tanımsız bir değer sessizce varsayılana düşer.

    string

  • limit

    En 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 }
  }
}
GET/v1/posts/{post_id}okuma

Tek 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.

POST/v1/posts/{post_id}/publishyazma

Taslağı seçilen hesaplara hemen yayınlar. Yayın asenkron çalışır: cevap publishing döner, sonucu gönderiyi getirerek öğrenirsiniz.

Gövde alanları

  • account_idszorunlu

    Hangi hesaplara gideceği. En az bir, en fazla yirmi.

    int[]

  • overrides

    Platform başına metin. Verilmeyen platform ana metni kullanır.

    map<platform,string>

  • formats

    Platform başına biçim (örneğin instagram için reels).

    map<platform,string>

  • titles

    Platform 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", "…": "…" }
}
POST/v1/posts/{post_id}/scheduleyazma

Taslağı belirli bir ana zamanlar. scheduled_at gelecekte olmalıdır.

Gövde alanları

  • account_idszorunlu

    Hangi hesaplara gideceği. En az bir, en fazla yirmi.

    int[]

  • scheduled_atzorunlu

    Yayın anı, RFC 3339. Gelecekte olmalı.

    RFC 3339

  • overrides

    Platform başına metin. Verilmeyen platform ana metni kullanır.

    map<platform,string>

  • formats

    Platform başına biçim (örneğin instagram için reels).

    map<platform,string>

  • titles

    Platform 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"
  }
}
POST/v1/posts/{post_id}/queueyazma

Taslağı workspace'in kuyruğundaki ilk boş slota koyar. Slot tanımlı değilse istek reddedilir.

Gövde alanları

  • account_idszorunlu

    Hangi hesaplara gideceği. En az bir, en fazla yirmi.

    int[]

  • overrides

    Platform başına metin. Verilmeyen platform ana metni kullanır.

    map<platform,string>

  • formats

    Platform başına biçim (örneğin instagram için reels).

    map<platform,string>

  • titles

    Platform 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"
Sosyal Medya Yönetim Platformu