Postlip Metrics Content API
Sitelerin ve uygulamaların blogu kendi tasarımıyla çizmek için okuduğu API: yalnız YAYINDAKİ yazılar (taslak, onaydaki sürüm ya da yayından kaldırılmış yazı hiç dönmez; çalışma sürümü yalnız editörlerin verdiği önizleme belirteciyle). Kimlik: organizasyonun panelden oluşturduğu API anahtarı, kapsam content:read (yalnız bu kapsamlı anahtar uygulamanın «içerik anahtarı»dır), Authorization: Bearer mk_… — yalnız sunucu tarafında. Önbellek: ETag / Last-Modified, If-None-Match / If-Modified-Since ile 304; değişiklikler imzalı yayın webhook'uyla (content.post.published|updated|unpublished, Metrics-Signature) duyurulur, site önbelleğini uzun tutup webhook'ta yeniler. İçerik HTML değil blok belgesidir; html alanı Postlip Metrics'in kaçışlayarak çizdiği güvenli HTML'dir. Hata gövdesi { "error": { "code", "message", "traceId" } }, message isteğin dilinde (Accept-Language: tr, en).
Sürüm 1.0.0OpenAPI 3.1.1OpenAPI belgesini indir
Bu sayfa derleme sırasında depodaki docs/api/openapi/content.json dosyasından üretilir.
Sunucular
Kimlik doğrulama
İçerik (blog)
8 uç
Yazılar (blok içerik, SEO, kapak, kategori, etiket, yazarlar), iş akışı (onaya gönderme, onay, dört göz, zamanlama, yayın, yayından kaldırma, arşiv), sürümler ve farkları, zaman çizelgesi, yorumlar, süreli önizleme bağlantıları, yasaklı ifadeler, ayarlar; siteler için İçerik API’si (yalnız yayındaki yazılar) ve yayın webhook’ları.
GET/v1/content/apps/{appId}/assets/{assetId}
Görselin dosyası
Yayındaki bir yazının (ya da yazarının) gösterdiği görselin baytları — görselleri kendi sunucusunda tutan siteler için; kütüphanenin geri kalanı bu anahtarla okunamaz. Sürüm: original (metadata temizlenmiş), jpg, medium (1080 px WebP), thumb (320 px WebP).
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Görsel dosyası.
Yanıt başlıkları
Content-Dispositionstringattachment; filename="…"
400İstek doğrulanamadı (
VALIDATION_FAILED).error.fieldsher hatalı alan için isteğin dilinde mesajları taşır; alan yolu noktayla yazılır (properties.2.enumValues), gövdenin bütünü için_. Okunamayan JSONINVALID_REQUEST, bozuk imleçCURSOR_INVALIDdöner.application/jsonErrorResponse401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
GET/v1/content/apps/{appId}/categories
Kategoriler
Yayındaki yazı sayılarıyla. Önbellek: ETag (gövdenin özeti) ve Last-Modified (uygulamanın sunulan içeriğinin son değişikliği; imzalı görsel bağlantıları saatte bir yenilendiği için en eski bu saatin başı); If-None-Match ya da If-Modified-Since eşleşirse 304, gövdesiz. Cache-Control: private, max-age=60, Vary: Authorization.
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Başarılı.
application/jsonContentApiCategoryListÖrnek · JSON{ "items": [ { "slug": "string", "name": "string", "description": "string", "position": 0, "postCount": 0 } ] }401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
GET/v1/content/apps/{appId}/posts
Yayındaki yazılar
Yalnız YAYINDAKİ yazılar: taslak, onaydaki sürüm ya da yayından kaldırılmış yazı bu uçlardan hiç dönmez (yalnız önizleme belirteciyle). Filtreler: dil, kategori (adres), etiket, yazar (adres), yayın yeri (web site, app uygulama içi akış), arama, updatedSince (artımlı eşitleme); sıralama ilk yayın ya da son güncelleme; imleç sayfalama (en çok 100). Önbellek: ETag (gövdenin özeti) ve Last-Modified (uygulamanın sunulan içeriğinin son değişikliği; imzalı görsel bağlantıları saatte bir yenilendiği için en eski bu saatin başı); If-None-Match ya da If-Modified-Since eşleşirse 304, gövdesiz. Cache-Control: private, max-age=60, Vary: Authorization.
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Başarılı.
application/jsonContentApiPostPageÖrnek · JSON{ "items": [ { "id": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "slug": "string", "locale": "string", "title": "string", "excerpt": "string", "url": "string", "category": { "slug": "string", "name": "string" }, "tags": [ "string" ], "authors": [ { "slug": "string", "name": "string" } ], "cover": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } }, "feeds": [ "web" ], "readingMinutes": 0, "publishedAt": "2026-11-06T14:46:00+03:00", "updatedAt": "2026-11-06T14:46:00+03:00", "revision": 0 } ], "nextCursor": "string" }400İstek doğrulanamadı (
VALIDATION_FAILED).error.fieldsher hatalı alan için isteğin dilinde mesajları taşır; alan yolu noktayla yazılır (properties.2.enumValues), gövdenin bütünü için_. Okunamayan JSONINVALID_REQUEST, bozuk imleçCURSOR_INVALIDdöner.application/jsonErrorResponse401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
GET/v1/content/apps/{appId}/posts/{slug}
Yazı (adresiyle)
Yazının belgesi: blok içerik, Postlip Metrics'in kaçışlayarak çizdiği HTML (sabit etiket seti; betik, stil, satır içi HTML yok), düz metin, içindekiler, okuma süresi, yazarlar ve profilleri, SEO (başlık, açıklama, kanonik adres, noindex, OG görseli), schema.org JSON-LD (structuredData ve <script> için kaçışlanmış jsonLd), çeviriler, eski adresler, görseller (süreli imzalı bağlantı + anahtarla okunan kalıcı file adresi). Eski bir adres { kind: "redirect" } döner (API 301 vermez: istemci sessizce izleyip eski adresi tutmasın — site kendi 301'ini verir); yayından kaldırılmış yazının adresi 410 CONTENT_POST_GONE, bilinmeyen 404. Önbellek: ETag (gövdenin özeti) ve Last-Modified (uygulamanın sunulan içeriğinin son değişikliği; imzalı görsel bağlantıları saatte bir yenilendiği için en eski bu saatin başı); If-None-Match ya da If-Modified-Since eşleşirse 304, gövdesiz. Cache-Control: private, max-age=60, Vary: Authorization.
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Başarılı.
application/jsonContentApiPostResolutionÖrnek · JSON{ "kind": "post", "post": { "id": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "slug": "string", "locale": "string", "title": "string", "excerpt": "string", "url": "string", "category": { "slug": "string", "name": "string" }, "tags": [ "string" ], "authors": [ { "slug": "string", "name": "string", "title": "string", "bio": "string", "avatar": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } }, "websiteUrl": "string", "links": [] } ], "cover": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } }, "feeds": [ "web" ], "readingMinutes": 0, "publishedAt": "2026-11-06T14:46:00+03:00", "updatedAt": "2026-11-06T14:46:00+03:00", "revision": 0, "body": { "version": 1, "blocks": [ {} ] }, "html": "string", "text": "string", "toc": [ { "id": "string", "level": 0, "text": "string" } ], "wordCount": 0, "seo": { "title": "string", "description": "string", "canonicalUrl": "string", "noindex": true, "ogImage": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } } }, "structuredData": [ {} ], "jsonLd": "string", "translations": [ { "locale": "string", "slug": "string", "url": "string" } ], "previousSlugs": [ "string" ], "preview": true } }401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse410E-postayla gelen bağlantı geçersiz, kullanılmış ya da süresi dolmuş (
LINK_INVALID,INVITATION_INVALID).application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
GET/v1/content/apps/{appId}/preview/{token}
Önizleme (belirteçle)
Editörlerin verdiği önizleme belirteciyle çalışma sürümünün belgesi (preview: true, seo.noindex: true): sitenin kendi tasarımıyla önizleme sayfası için. Belirteç anahtarın uygulamasına ait olmalı. Cache-Control: no-store.
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Başarılı.
application/jsonContentApiPostÖrnek · JSON{ "id": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "slug": "string", "locale": "string", "title": "string", "excerpt": "string", "url": "string", "category": { "slug": "string", "name": "string" }, "tags": [ "string" ], "authors": [ { "slug": "string", "name": "string", "title": "string", "bio": "string", "avatar": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } }, "websiteUrl": "string", "links": [ "string" ] } ], "cover": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } }, "feeds": [ "web" ], "readingMinutes": 0, "publishedAt": "2026-11-06T14:46:00+03:00", "updatedAt": "2026-11-06T14:46:00+03:00", "revision": 0, "body": { "version": 1, "blocks": [ {} ] }, "html": "string", "text": "string", "toc": [ { "id": "string", "level": 0, "text": "string" } ], "wordCount": 0, "seo": { "title": "string", "description": "string", "canonicalUrl": "string", "noindex": true, "ogImage": { "assetId": "01a1b249-9ed2-77e8-af53-0c99529e68cb", "url": "string", "expiresAt": "2026-11-06T14:46:00+03:00", "file": "string", "mimeType": "string", "width": 0, "height": 0, "alt": "string", "variants": { "medium": "string", "thumb": "string" } } }, "structuredData": [ {} ], "jsonLd": "string", "translations": [ { "locale": "string", "slug": "string", "url": "string" } ], "previousSlugs": [ "string" ], "preview": true }401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse410E-postayla gelen bağlantı geçersiz, kullanılmış ya da süresi dolmuş (
LINK_INVALID,INVITATION_INVALID).application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
GET/v1/content/apps/{appId}/sitemap
Site haritası
Yayındaki, noindex olmayan yazıların adresi, son güncellemesi ve çevirileri (hreflang); imleç sayfalama (en çok 5 000). Önbellek: ETag (gövdenin özeti) ve Last-Modified (uygulamanın sunulan içeriğinin son değişikliği; imzalı görsel bağlantıları saatte bir yenilendiği için en eski bu saatin başı); If-None-Match ya da If-Modified-Since eşleşirse 304, gövdesiz. Cache-Control: private, max-age=60, Vary: Authorization.
Management API anahtarı gerekir (Authorization: Bearer mk_…); işlem anahtarın organizasyonunda ve uygulama kapsamında tek bir RLS işleminde çalışır.
Gerekli kapsam: content:read.
- Kimlik
- apiKey
- Gerekli kapsam
content:read
Parametreler
Yanıtlar
200Başarılı.
application/jsonContentApiSitemapÖrnek · JSON{ "items": [ { "slug": "string", "locale": "string", "url": "string", "updatedAt": "2026-11-06T14:46:00+03:00", "alternates": [ { "locale": "string", "url": "string" } ] } ], "nextCursor": "string" }400İstek doğrulanamadı (
VALIDATION_FAILED).error.fieldsher hatalı alan için isteğin dilinde mesajları taşır; alan yolu noktayla yazılır (properties.2.enumValues), gövdenin bütünü için_. Okunamayan JSONINVALID_REQUEST, bozuk imleçCURSOR_INVALIDdöner.application/jsonErrorResponse401Kimlik yok ya da geçersiz: panelde oturum çerezi (
SESSION_REQUIRED, ikinci adım bekleyen oturumdaTWO_FACTOR_REQUIRED), Management API'deAuthorization: Bearer mk_…(API_KEY_INVALID: yok, bilinmiyor, iptal edilmiş ya da süresi dolmuş). Giriş uçlarında hatalı bilgiler de 401 döner (INVALID_CREDENTIALS,TOTP_CODE_INVALID).application/jsonErrorResponse403Yetki yok: rol gereken izni vermiyor (
PERMISSION_REQUIRED,error.details.permissions), API anahtarının kapsamı eksik (API_KEY_SCOPE_MISSING,error.details.scopes) ya da organizasyon askıda (ORGANIZATION_SUSPENDED).application/jsonErrorResponse404Kayıt bulunamadı ya da çağıranın kapsamında değil; ikisi bilerek ayırt edilmez (ör.
APP_NOT_FOUND,EVENT_DEFINITION_NOT_FOUND). Biçimi geçersiz kimlikler de 404 döner.application/jsonErrorResponse500Beklenmeyen hata (
INTERNAL_ERROR). Destek talebindeerror.traceIdiletilir.application/jsonErrorResponse
Şemalar
İsteklerde ve yanıtlarda adıyla anılan şemalar.