GeliştiricilerBeta

Gönderilerinizi kodunuzdan ya da yapay zekâ asistanınızdan planlayın.

postyay REST API’si ve MCP sunucusu uygulamanın yaptığını yapar: medyayı yükler, aynı ön kontrolleri çalıştırır, TikTok ve Bluesky’a planlar ve her gönderiyi yayına girene kadar takip eder. Tek ihtiyacınız bir API anahtarı.

BetaAPI ve MCP sunucusu beta aşamasında ve beta sürdükçe her plana dahil. v1 sözleşmesi yalnızca büyür: alanlar eklenir, adı değişmez ve kaldırılmaz.

Hızlı başlangıç

Sıfırdan yayındaki bir gönderiye beş adım. Örneklerin hepsi curl ile; anahtarınızı bir kez tanımlayın: export POSTYAY_API_KEY=pyk_live_….

  1. 1

    Bir API anahtarı oluşturun

    Ayarlar → API anahtarları bölümüne gidin, anahtara bir ad verin (ör. “Zapier” ya da “Claude”) ve kopyalayın. Anahtarı yalnızca bir kez görürsünüz; biz sadece özetini (hash) saklarız.

  2. 2

    Bağlı hesaplarınızı listeleyin

    Önce uygulamada TikTok ya da Bluesky hesabınızı bağlayın. Her hesabın id değeri, gönderinin gideceği yerdir; health hesabın yeniden bağlanması gerekip gerekmediğini söyler.

    GET /api/v1/accounts
    curl https://postyay.com/api/v1/accounts \
      -H "Authorization: Bearer $POSTYAY_API_KEY"
  3. 3

    Bir video ya da fotoğraf yükleyin

    Dosyayı multipart olarak gönderin ya da herkese açık bir URL verin, biz indirelim. Dönen id değerini saklayın. Biçimi her platform için yayın sırasında biz dönüştürürüz.

    POST /api/v1/media
    curl https://postyay.com/api/v1/media \
      -H "Authorization: Bearer $POSTYAY_API_KEY" \
      -F [email protected]
    
    # or let postyay download it
    curl https://postyay.com/api/v1/media \
      -H "Authorization: Bearer $POSTYAY_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{ "url": "https://example.com/clip.mp4" }'
  4. 4

    Gönderiyi planlayın

    Tek gönderi, birden çok hesap. TikTok için settings.privacyLevel zorunlu. schedule; "now", ISO 8601 bir zaman ya da "draft" olabilir. Önce uygulamadaki ön kontrollerin aynısı çalışır; sorun çıkaracak her şey violations olarak döner.

    POST /api/v1/posts
    curl https://postyay.com/api/v1/posts \
      -H "Authorization: Bearer $POSTYAY_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: $(uuidgen)" \
      -d '{
        "text": "Behind the scenes of the shoot #bts",
        "mediaIds": ["MEDIA_ID"],
        "targets": [
          { "accountId": "TIKTOK_ACCOUNT_ID",
            "settings": { "privacyLevel": "PUBLIC_TO_EVERYONE", "allowComment": true } },
          { "accountId": "BLUESKY_ACCOUNT_ID",
            "settings": { "altText": { "MEDIA_ID": "A camera crew on set" } } }
        ],
        "schedule": "now"
      }'
    
    # "schedule": "2026-10-01T09:00:00+03:00" schedules it, "draft" only saves it.
  5. 5

    Yayına girene kadar takip edin

    Gönderiyi birkaç saniyede bir sorgulayın. status değeri published olduğunda her hedefin canlı url adresi gelir. TikTok videolarının işlenmesi birkaç dakika sürebilir.

    GET /api/v1/posts/{id}
    while :; do
      status=$(curl -s https://postyay.com/api/v1/posts/POST_ID \
        -H "Authorization: Bearer $POSTYAY_API_KEY" | jq -r .status)
      echo "$status"
      case "$status" in published|failed|needs_action|canceled) break ;; esac
      sleep 5
    done
    200 OK
    {
      "id": "5b0e…",
      "status": "published",
      "source": "api",
      "targets": [
        { "platform": "tiktok", "status": "published",
          "url": "https://www.tiktok.com/@you/video/7431…" },
        { "platform": "bluesky", "status": "published",
          "url": "https://bsky.app/profile/you.bsky.social/post/3l…" }
      ]
    }

Kimlik doğrulama

Anahtarı her isteğin Authorization başlığında gönderin: Bearer pyk_live_….

  • Anahtar, onu oluşturan üye adına ve o çalışma alanında işlem yapar. Üye çalışma alanından ayrılırsa anahtar çalışmaz olur.
  • Anahtarı Ayarlar’dan dilediğiniz an iptal edebilirsiniz; hemen çalışmaz olur. Son kullanım zamanı, artık gerekmeyen anahtarları fark etmenizi kolaylaştırır.
  • Anahtarlara parola gibi davranın: sunucunuzda ya da asistanınızın ayarlarında tutun; tarayıcıya, mobil uygulamaya ya da herkese açık bir depoya asla koymayın.

Hatalar

Her hata aynı biçimdedir. requestId ayrıca x-trace-id başlığında da gelir; destekle iletişime geçerken bu değeri paylaşın.

400 Bad Request
{
  "code": "PREFLIGHT",
  "message": "TikTok allows 2,200 characters — you're 100 over.",
  "requestId": "3f0c9d2e-…",
  "violations": [
    { "accountId": "…", "platform": "tiktok", "code": "text_too_long",
      "message": "TikTok allows 2,200 characters — you're 100 over.",
      "params": { "max": 2200, "over": 100 },
      "fix": { "mode": "manual", "action": "shorten_text" } }
  ]
}

VALIDATION_ERROR hatasına details (hatalı alanlar) eklenir. PREFLIGHT hatasına violations eklenir: her sorun için bir kayıt; hesap, platform ve text_too_long ya da media_required gibi sabit bir code ile.

401
UNAUTHORIZED
API anahtarı gönderilmedi.
401
INVALID_API_KEY
Anahtar hatalı biçimde ya da böyle bir anahtar yok.
401
API_KEY_REVOKED
Anahtar iptal edildi ya da oluşturan üye çalışma alanından ayrıldı.
403
PLAN_REQUIRED
Çalışma alanının planı API erişimini kapsamıyor.
400
VALIDATION_ERROR
İstek gövdesi ya da sorgu geçersiz; details alanına bakın.
400
PREFLIGHT
Gönderi bir platformda başarısız olur; violations alanına bakın.
400
INVALID_SETTINGS
Bir hedefin platform ayarları eksik ya da geçersiz (ör. TikTok gizliliği).
400
PAST_TIME
Planlanan zaman geçmiş.
400
ACCOUNT_NOT_FOUND
Hesap bu çalışma alanına bağlı değil.
400
MEDIA_NOT_FOUND
Medya bu çalışma alanında yok ya da henüz hazır değil.
400
RECONNECT_REQUIRED
Hesabın uygulamada yeniden bağlanması gerekiyor.
400
URL_NOT_ALLOWED
Medya URL’si özel ya da ayrılmış bir adrese gidiyor.
402
PLAN_LIMIT_POSTS
Planın aylık gönderi sınırı doldu. Taslaklar yine kaydedilir.
409
NOT_EDITABLE
Gönderi yayınlanıyor ya da yayınlandı; artık değiştirilemez.
409
IN_FLIGHT
Gönderi şu an yayınlanıyor; bir dakika sonra tekrar deneyin.
409
IDEMPOTENCY_KEY_REUSED
Bu Idempotency-Key farklı bir gövdeyle kullanılmış.
409
IDEMPOTENCY_IN_PROGRESS
Bu Idempotency-Key ile gelen ilk istek hâlâ işleniyor.
413
TOO_LARGE
Dosya yükleme boyutu sınırını aşıyor.
415
UNSUPPORTED_MEDIA
Kabul ettiğimiz bir video, fotoğraf ya da PDF değil.
429
RATE_LIMITED
Çok fazla istek; Retry-After kadar saniye bekleyin.

İstek sınırları

Sınırlar anahtar başınadır ve bir dakikalık pencerelerle sayılır: dakikada 60 istek, bunların en fazla 10 tanesi gönderi oluşturabilir. MCP araç çağrıları da aynı bütçeden düşer.

Her yanıt nerede olduğunuzu söyler: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (saniye) ve RateLimit-Policy. Sınırı aşınca Retry-After ile birlikte 429 RATE_LIMITED alırsınız.

429 Too Many Requests
RateLimit-Policy: 60;w=60, 10;w=60;comment="posts"
RateLimit-Limit: 60
RateLimit-Remaining: 0
RateLimit-Reset: 23
Retry-After: 23

Gönderiler, uygulamada oluşturulanlar gibi planınızın aylık gönderi sınırına da sayılır. Kullanımınızı GET /api/v1/me gösterir.

Sayfalama

Listeler en yeniden eskiye { data, nextCursor } döner. limit (1–100, varsayılan 25) gönderin; sonraki sayfa için cursor=nextCursor ekleyin. Son sayfada nextCursor değeri null olur. GET /api/v1/posts ayrıca status, accountId, from ve to ile süzülebilir.

GET /api/v1/posts
curl "https://postyay.com/api/v1/posts?status=scheduled&limit=50" \
  -H "Authorization: Bearer $POSTYAY_API_KEY"

# next page
curl "https://postyay.com/api/v1/posts?status=scheduled&limit=50&cursor=NEXT_CURSOR" \
  -H "Authorization: Bearer $POSTYAY_API_KEY"

Tekrar güvenliği (idempotency)

Ağ aksaklıkları olur. POST /api/v1/posts isteğine bir Idempotency-Key başlığı (ör. bir UUID) ekleyin ve gönül rahatlığıyla yeniden deneyin: 24 saat boyunca aynı anahtar ve aynı gövde, ikinci bir gönderi oluşturmak yerine ilk sonucu Idempotent-Replayed: true ile döndürür. Aynı anahtar farklı bir gövdeyle gelirse reddedilir.

Gönderinin yaşam döngüsü

Bir gönderi bir ya da daha çok hesaba gider; her biri kendi durumu olan bir hedeftir. Gönderinin status değeri, hedeflerinin en acil olanıdır.

draft
Kaydedildi, planlanmadı.
scheduled
Zamanını bekliyor.
queued
Zamanı geldi; yayına alındı.
preparing
Medya platform için dönüştürülüyor.
publishing
Platforma gönderiliyor.
processing
Platform kabul etti ve işliyor.
published
Yayında; hedefin url değeri var.
needs_action
Birinin müdahale etmesi gerekiyor (ör. hesabı yeniden bağlamak); error alanına bakın.
failed
Denemelerden sonra vazgeçildi; error alanına bakın.
canceled
Gönderi yayınlanmadan silindi.

MCP sunucusu

postyay Model Context Protocol’ü destekler; yapay zekâ asistanları gönderilerinizi sizin için planlayabilir: “bu videoyu yarın saat 9’da TikTok ve Bluesky’a gönder”. REST API ile aynı anahtarı, sınırları ve kontrolleri kullanır.

Uç nokta

https://postyay.com/mcp

Streamable HTTP (durumsuz, JSON yanıtlar). Kimlik doğrulama: Authorization: Bearer pyk_live_….

Araçlar

  • list_accountsBağlı hesaplar; kimlikleri ve durumlarıyla.
  • upload_media_from_urlHerkese açık bir URL’den video, fotoğraf ya da PDF indirir.
  • create_postGönderiyi oluşturur ve planlar (hemen, belirli bir zamanda ya da taslak), ön kontrol geri bildirimiyle.
  • schedule_postVar olan bir taslağı planlar.
  • list_postsDurumlarıyla gönderiler; süzülmüş ve sayfalanmış.
  • get_post_statusBir gönderinin yayın zaman çizelgesi ve canlı adresleri.
  • reschedule_postGönderiyi yeni bir zamana taşır.
  • delete_postGönderiyi siler, yayınlanmamış hedefleri iptal eder.
  • get_best_timePaylaşım için bir zaman önerir. Şimdilik sabit bir kural (saat diliminizde yarın 09:00); kitle verisine dayanmaz ve bunu açıkça söyler.

Asistanınızı bağlayın

Claude Code

Tek komut sunucuyu anahtarınızla ekler:

Terminal
claude mcp add --transport http postyay https://postyay.com/mcp \
  --header "Authorization: Bearer pyk_live_…"

Claude Desktop

Şunu claude_desktop_config.json dosyasına ekleyin (Ayarlar → Geliştirici → Yapılandırmayı düzenle) ve Claude’u yeniden başlatın. mcp-remote uzak sunucuya köprü kurar ve anahtarınızı başlık olarak gönderir.

claude_desktop_config.json
{
  "mcpServers": {
    "postyay": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://postyay.com/mcp",
               "--header", "Authorization:${POSTYAY_API_KEY}"],
      "env": { "POSTYAY_API_KEY": "Bearer pyk_live_…" }
    }
  }
}

Cursor, VS Code ve diğer istemciler

Uzak bir MCP sunucusu için HTTP başlığı tanımlamanıza izin veren her istemci, URL ve başlıkla çalışır:

mcp.json
{
  "mcpServers": {
    "postyay": {
      "url": "https://postyay.com/mcp",
      "headers": { "Authorization": "Bearer pyk_live_…" }
    }
  }
}

ChatGPT ve claude.ai (web bağlayıcıları)

Bu bağlayıcılar OAuth ile oturum açar (ya da kimlik doğrulamasız bağlanır) ve API anahtarı gönderemez. postyay’in MCP sunucusu şimdilik yalnızca API anahtarıyla çalıştığı için bu bağlayıcılar henüz desteklenmiyor. OAuth ile oturum açma planlarımızda var. O zamana kadar Claude Desktop, Claude Code ya da başlık gönderebilen başka bir istemci kullanın.

API başvurusu

API’nin doğrulamada kullandığı şemaların aynısından üretilir. Temel URL: https://postyay.com/api/v1. OpenAPI belgesini Postman’e, Insomnia’ya ya da kod üreticinize aktarabilirsiniz.

get/api/v1/me

Current key, workspace and limits

Yanıtlar

  • 200Me · The key and its workspace.
  • 401Missing, unknown or revoked API key.
  • 429Too many requests; wait Retry-After seconds.
get/api/v1/accounts

List connected accounts

Every connected account with its health. Use the id as a post target.

Yanıtlar

  • 200AccountList · Connected accounts, oldest first.
  • 401Missing, unknown or revoked API key.
  • 429Too many requests; wait Retry-After seconds.
post/api/v1/media

Upload media

Send the file as multipart/form-data (one file part), or JSON { "url": "https://…" } and we download it. Videos (MP4, MOV, WebM), photos (JPEG, PNG, WebP, GIF, HEIC, AVIF) and PDFs. Conversion for each platform happens at publish time.

İstek gövdesi

Yanıtlar

  • 201Media · The stored media.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 413The file is over the size limit.
  • 415Not a supported file type.
  • 429Too many requests; wait Retry-After seconds.
post/api/v1/media/uploads

Start a direct upload (large files)

For big videos: returns a presigned URL; PUT the file there with the given headers, then call POST /media/{id}/complete. Available when postyay stores media in object storage; otherwise 409 DIRECT_UPLOAD_UNAVAILABLE (use POST /media).

İstek gövdesi

Yanıtlar

  • 201MediaUploadTicket · Where to upload the file.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 409The post’s state doesn’t allow this now, or an idempotent request is still running.
  • 413The file is over the size limit.
  • 415Not a supported file type.
  • 429Too many requests; wait Retry-After seconds.
post/api/v1/media/{id}/complete

Finish a direct upload

Checks what arrived, reads the file’s details and marks it ready. Safe to call again.

Parametreler

id *
path
string (uuid)
The media id.

Yanıtlar

  • 200Media · The ready media.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 404Not found in this workspace.
  • 409The post’s state doesn’t allow this now, or an idempotent request is still running.
  • 413The file is over the size limit.
  • 429Too many requests; wait Retry-After seconds.
get/api/v1/media/{id}

Get media

Parametreler

id *
path
string (uuid)
The media id.

Yanıtlar

  • 200Media · The media.
  • 401Missing, unknown or revoked API key.
  • 404Not found in this workspace.
  • 429Too many requests; wait Retry-After seconds.
get/api/v1/posts

List posts

Newest first, paginated with cursor.

Parametreler

status
query
"draft" | "scheduled" | "queued" | "preparing" | "publishing" | "processing" | "published" | "needs_action" | "failed" | "canceled"
Posts with at least one target in this status.
accountId
query
string
Posts that go to this account.
from
query
string (date-time)
Scheduled at or after (ISO 8601).
to
query
string (date-time)
Scheduled at or before (ISO 8601).
limit
query
integer
Default: 25.
cursor
query
string
nextCursor from the previous page.

Yanıtlar

  • 200PostList · A page of posts.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 429Too many requests; wait Retry-After seconds.
post/api/v1/posts

Create or schedule a post

Validates accounts, media and per-platform settings, runs pre-flight (text length, media type, duration, aspect…) for every target, and schedules it. Problems come back as 400 PREFLIGHT with violations. Send an Idempotency-Key header to retry safely: the same key and body within 24 hours returns the first result (Idempotent-Replayed: true).

Parametreler

Idempotency-Key
header
string
Any unique string, e.g. a UUID.

İstek gövdesi

Yanıtlar

  • 201Post · The created post, with its timeline.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 402The plan’s monthly post limit is reached (PLAN_LIMIT_POSTS).
  • 403The key’s role or plan doesn’t allow this.
  • 409The post’s state doesn’t allow this now, or an idempotent request is still running.
  • 429Too many requests; wait Retry-After seconds.
get/api/v1/posts/{id}

Get a post and its status

Each target’s status, timeline and, once published, its live url.

Parametreler

id *
path
string (uuid)
The post id.

Yanıtlar

  • 200Post · The post.
  • 401Missing, unknown or revoked API key.
  • 404Not found in this workspace.
  • 429Too many requests; wait Retry-After seconds.
patch/api/v1/posts/{id}

Edit or reschedule a post

Send only what changes, e.g. { "schedule": "2026-10-01T09:00:00Z" }. Pre-flight runs again. 409 NOT_EDITABLE once a target is publishing or published.

Parametreler

id *
path
string (uuid)
The post id.

İstek gövdesi

Yanıtlar

  • 200Post · The updated post.
  • 400VALIDATION_ERROR (see details), PREFLIGHT (see violations), or another request problem.
  • 401Missing, unknown or revoked API key.
  • 402The plan’s monthly post limit is reached (PLAN_LIMIT_POSTS).
  • 403The key’s role or plan doesn’t allow this.
  • 404Not found in this workspace.
  • 409The post’s state doesn’t allow this now, or an idempotent request is still running.
  • 429Too many requests; wait Retry-After seconds.
delete/api/v1/posts/{id}

Delete a post

Cancels every target that hasn’t published. Already-published posts stay on the platform. 409 IN_FLIGHT while it is publishing.

Parametreler

id *
path
string (uuid)
The post id.

Yanıtlar

  • 204Deleted.
  • 401Missing, unknown or revoked API key.
  • 403The key’s role or plan doesn’t allow this.
  • 404Not found in this workspace.
  • 409The post’s state doesn’t allow this now, or an idempotent request is still running.
  • 429Too many requests; wait Retry-After seconds.

Nesneler

MediaFromUrl

url *
string (uri)
A public http(s) URL of a video, photo or PDF. Redirects are followed; private addresses are refused.

MediaUploadInit

width
integer
height
integer
durationSec
number
name
string
Original file name.
mime *
string
The file’s type, e.g. video/mp4.
bytes *
integer
Exact size in bytes; the upload URL only accepts this size.

TikTokSettings

privacyLevel *
"PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY"
Required: TikTok has no default. Must be one the creator allows.
allowComment
boolean
Default: false.
allowDuet
boolean
Default: false.
allowStitch
boolean
Default: false.
disclose
boolean
Commercial content disclosure; needs yourBrand and/or brandedContent. Default: false.
yourBrand
boolean
Default: false.
brandedContent
boolean
Paid partnership. Can’t be combined with SELF_ONLY. Default: false.
isAigc
boolean
The content is AI-generated. Default: false.
coverTimestampMs
integer

BlueskySettings

altText
object
Alt text per attached media id. Default: {}.

TargetInput

accountId *
string
From GET /v1/accounts.
settings
object
Platform options: see TikTokSettings (TikTok needs privacyLevel) and BlueskySettings. Default: {}.
override
object
Different text or title for this account only.
override.text
string
override.title
string

CreatePost

text
string
The caption. Default: "".
title
string
mediaIds
string[]
From POST /v1/media, in order. Default: [].
targets *
schedule *
"now" | "draft" | string (date-time)
"now" publishes within seconds, an ISO 8601 time schedules it, "draft" saves it without scheduling (drafts may be incomplete).

UpdatePost

text
string
title
string | null
null removes it.
mediaIds
string[]
targets
Replaces the whole list.
schedule
"now" | "draft" | string (date-time)
"now" publishes within seconds, an ISO 8601 time schedules it, "draft" saves it without scheduling (drafts may be incomplete).

Violation

accountId *
string
The target account the problem is on.
platform *
"x" | "bluesky" | "threads" | "linkedin" | "facebook" | "instagram" | "youtube" | "tiktok" | "pinterest"
code *
string
Stable machine code, e.g. text_too_long, video_too_long, media_required.
message *
string
English explanation.
mediaId
string
The attached media item the problem is about, when there is one.
params
object
Raw values behind the message (limits, sizes, seconds).
fix
object
How it can be resolved. manual: change the content. confirm: we can fix it in the app (crop, trim) once you agree.
fix.mode *
"confirm" | "manual"
fix.action *
string

Error

code *
string
Stable machine code, e.g. VALIDATION_ERROR, PREFLIGHT, RATE_LIMITED, NOT_FOUND.
message *
string
Human-readable explanation (English).
requestId *
string
Quote this when contacting support; it is also sent as the x-trace-id header.
details
object[]
Field problems, on VALIDATION_ERROR.
violations
Pre-flight problems, on PREFLIGHT.

Account

id *
string (uuid)
platform *
"x" | "bluesky" | "threads" | "linkedin" | "facebook" | "instagram" | "youtube" | "tiktok" | "pinterest"
handle *
string
@username on TikTok and Bluesky.
displayName *
string | null
avatarUrl *
string | null
health *
"healthy" | "expiring" | "reconnect_required" | "limited"
reconnect_required: posts to it can’t publish until it is reconnected in the app.
healthMessage *
string | null
sandbox *
boolean
Connected through the sandbox provider: nothing reaches the real platform.
connectedAt *
string (date-time)

Media

id *
string (uuid)
kind *
"image" | "video" | "document"
mime *
string
bytes *
integer
width *
number | null
height *
number | null
durationSec *
number | null
originalName *
string | null
status *
"uploading" | "processing" | "ready" | "failed"
Only ready media can be attached to a post.

MediaUploadTicket

media *
The pending media (status: "uploading") until you call complete.
upload *
object
upload.url *
string
PUT the raw file bytes here.
upload.method *
"PUT"
upload.headers *
object
Send exactly these headers with the PUT.
upload.expiresAt *
string (date-time)

TimelineEvent

status *
"draft" | "scheduled" | "queued" | "preparing" | "publishing" | "processing" | "published" | "needs_action" | "failed" | "canceled"
message *
string
code *
string | null
at *
string (date-time)

Target

id *
string (uuid)
accountId *
string
platform *
"x" | "bluesky" | "threads" | "linkedin" | "facebook" | "instagram" | "youtube" | "tiktok" | "pinterest"
status *
"draft" | "scheduled" | "queued" | "preparing" | "publishing" | "processing" | "published" | "needs_action" | "failed" | "canceled"
draft → scheduled → queued → preparing → publishing → processing → published; or needs_action / failed / canceled.
scheduledAt *
string (date-time) | null
publishedAt *
string (date-time) | null
url *
string | null
The live post, once published.
error *
object | null
error.code *
string | null
error.message *
string
settings *
object
override *
object | null
override.text
string
override.title
string
timeline
Oldest first. On single-post responses only.

Post

id *
string (uuid)
status *
"draft" | "scheduled" | "queued" | "preparing" | "publishing" | "processing" | "published" | "needs_action" | "failed" | "canceled"
The most urgent of its targets’ statuses (e.g. needs_action beats published).
source *
"web" | "api" | "mcp"
Where it was created.
text *
string
title *
string | null
media *
scheduledAt *
string (date-time) | null
createdAt *
string (date-time)
updatedAt *
string (date-time)
targets *

AccountList

data *
nextCursor *
string | null
Pass as cursor for the next page; null on the last one.

PostList

data *
nextCursor *
string | null
Pass as cursor for the next page; null on the last one.

Me

workspace *
object
workspace.id *
string (uuid)
workspace.name *
string
workspace.plan *
"free" | "creator" | "pro" | "agency"
workspace.timezone *
string
key *
object
key.id *
string (uuid)
key.name *
string
key.prefix *
string
usage *
object
usage.postsThisMonth *
integer
Scheduled or published posts created this UTC month.
usage.postsLimit *
integer | null
null: unlimited.
usage.accounts *
integer
usage.accountsLimit *
integer
rateLimits *
object
rateLimits.requestsPerMinute *
integer
rateLimits.postsPerMinute *
integer
apiAccess *
"beta" | "ga"

BestTime

at *
string (date-time)
timezone *
string
basis *
"heuristic"
explanation *
string