İçeriğe geç
Belgeler menüsüİçerik API’si

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

AdresAçıklama
https://api.metrics.exampleContent API

Kimlik doğrulama

AdYöntemAçıklama
apiKeyBearer belirteci (mk_…)Organizasyonun API anahtarı (mk_ + 40 karakter), kapsam content:read.

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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

assetIdzorunluyolstringDosyanın kimliği.

Biçim: uuid

variantsorgustring

Değerler: original, jpg, medium, thumb · Varsayılan: original

Yanıtlar

  • 200

    Görsel dosyası.

    Yanıt başlıkları

    • Content-Dispositionstring

      attachment; filename="…"

  • 400

    İstek doğrulanamadı (VALIDATION_FAILED). error.fields her 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 JSON INVALID_REQUEST, bozuk imleç CURSOR_INVALID döner.

    application/jsonErrorResponse

  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    application/jsonErrorResponse

GET/v1/content/apps/{appId}/authors

Yazarlar

Etkin ya da yayında yazısı olan yazarlar, profilleriyle. Ö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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

Yanıtlar

  • 200

    Başarılı.

    application/jsonContentApiAuthorList

    Örnek · JSON
    {
      "items": [
        {
          "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"
          ],
          "postCount": 0
        }
      ]
    }
  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

Yanıtlar

  • 200

    Başarılı.

    application/jsonContentApiCategoryList

    Örnek · JSON
    {
      "items": [
        {
          "slug": "string",
          "name": "string",
          "description": "string",
          "position": 0,
          "postCount": 0
        }
      ]
    }
  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

cursorsorgustring

Desen: ^[A-Za-z0-9_-]{1,512}$

limitsorguinteger

1–100 · Varsayılan: 20

localesorgustring

Desen: ^[a-z]{2}(?:-[A-Z]{2})?$ · 2–5 karakter

categorysorgustring

Desen: ^[a-z0-9]+(?:-[a-z0-9]+)*$ · 1–120 karakter

tagsorgustring

1–50 karakter

authorsorgustring

Desen: ^[a-z0-9]+(?:-[a-z0-9]+)*$ · 1–120 karakter

feedsorgustring

Değerler: web, app

searchsorgustring

1–200 karakter

updatedSincesorgustring

Biçim: date-time

sortsorgustring

Değerler: published, updated · Varsayılan: published

Yanıtlar

  • 200

    Baş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.fields her 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 JSON INVALID_REQUEST, bozuk imleç CURSOR_INVALID döner.

    application/jsonErrorResponse

  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

slugzorunluyolstringYazının adresi (slug); eski bir adres yenisine yönlendirme döner.

Yanıtlar

  • 200

    Baş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
      }
    }
  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 410

    E-postayla gelen bağlantı geçersiz, kullanılmış ya da süresi dolmuş (LINK_INVALID, INVITATION_INVALID).

    application/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

tokenzorunluyolstringBelirteç (paylaşım bağlantısı rs_…, ileti takip bağlantısı o1.… / c1.… / u1.…, sağlayıcı webhook adresi, yazı önizlemesi cp_…; uca göre); içinde kiracı kimliği yok.

Yanıtlar

  • 200

    Baş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
    }
  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 410

    E-postayla gelen bağlantı geçersiz, kullanılmış ya da süresi dolmuş (LINK_INVALID, INVITATION_INVALID).

    application/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

cursorsorgustring

Desen: ^[A-Za-z0-9_-]{1,512}$

limitsorguinteger

1–5000 · Varsayılan: 1000

localesorgustring

Desen: ^[a-z]{2}(?:-[A-Z]{2})?$ · 2–5 karakter

feedsorgustring

Değerler: web, app

Yanıtlar

  • 200

    Baş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.fields her 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 JSON INVALID_REQUEST, bozuk imleç CURSOR_INVALID döner.

    application/jsonErrorResponse

  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    application/jsonErrorResponse

GET/v1/content/apps/{appId}/tags

Etiketler

Yayındaki yazılardaki etiketler, 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

AdYerTipAçıklama
appIdzorunluyolstringUygulamanın kimliği.

Biçim: uuid

Yanıtlar

  • 200

    Başarılı.

    application/jsonContentApiTagList

    Örnek · JSON
    {
      "items": [
        {
          "tag": "string",
          "postCount": 0
        }
      ]
    }
  • 401

    Kimlik yok ya da geçersiz: panelde oturum çerezi (SESSION_REQUIRED, ikinci adım bekleyen oturumda TWO_FACTOR_REQUIRED), Management API'de Authorization: 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/jsonErrorResponse

  • 403

    Yetki 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/jsonErrorResponse

  • 404

    Kayı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/jsonErrorResponse

  • 500

    Beklenmeyen hata (INTERNAL_ERROR). Destek talebinde error.traceId iletilir.

    application/jsonErrorResponse

Şemalar

İsteklerde ve yanıtlarda adıyla anılan şemalar.

ContentApiAuthorobject

ContentApiAuthor
AlanTipAçıklama
slugzorunlustring
namezorunlustring
titlezorunlustring

null olabilir

biozorunlustring

null olabilir

avatarzorunluContentApiImage

null olabilir

websiteUrlzorunlustring

null olabilir

linkszorunlustring[]

ContentApiAuthorListobject

ContentApiAuthorList
AlanTipAçıklama
itemszorunluobject[]
items[].slugzorunlustring
items[].namezorunlustring
items[].titlezorunlustring

null olabilir

items[].biozorunlustring

null olabilir

items[].avatarzorunluContentApiImage

null olabilir

items[].websiteUrlzorunlustring

null olabilir

items[].linkszorunlustring[]
items[].postCountzorunluinteger

ContentApiCategoryListobject

ContentApiCategoryList
AlanTipAçıklama
itemszorunluobject[]
items[].slugzorunlustring
items[].namezorunlustring
items[].descriptionzorunlustring

null olabilir

items[].positionzorunluinteger
items[].postCountzorunluinteger

ContentApiCategoryRefobject

ContentApiCategoryRef
AlanTipAçıklama
slugzorunlustring
namezorunlustring

ContentApiImageobject

ContentApiImage
AlanTipAçıklama
assetIdzorunluId

Biçim: uuid

urlzorunlustring
expiresAtzorunluTimestamp

Biçim: date-time

filezorunlustring
mimeTypezorunlustring
widthzorunluinteger

null olabilir

heightzorunluinteger

null olabilir

altzorunlustring

null olabilir

variantszorunluobject
variants.mediumzorunlustring

null olabilir

variants.thumbzorunlustring

null olabilir

ContentApiPostobject

ContentApiPost
AlanTipAçıklama
idzorunluId

Biçim: uuid

slugzorunlustring
localezorunlustring
titlezorunlustring
excerptzorunlustring

null olabilir

urlzorunlustring

null olabilir

categoryzorunluContentApiCategoryRef

null olabilir

tagszorunlustring[]
authorszorunluContentApiAuthor[]
coverzorunluContentApiImage

null olabilir

feedszorunlustring[]
readingMinuteszorunluinteger
publishedAtzorunluTimestamp

Biçim: date-time

updatedAtzorunluTimestamp

Biçim: date-time

revisionzorunluinteger
bodyzorunluContentBodyResponse
htmlzorunlustring
textzorunlustring
toczorunluobject[]
toc[].idzorunlustring
toc[].levelzorunluinteger
toc[].textzorunlustring
wordCountzorunluinteger
seozorunluobject
seo.titlezorunlustring
seo.descriptionzorunlustring

null olabilir

seo.canonicalUrlzorunlustring

null olabilir

seo.noindexzorunluboolean
seo.ogImagezorunluContentApiImage

null olabilir

structuredDatazorunluobject[]
jsonLdzorunlustring
translationszorunluobject[]
translations[].localezorunlustring
translations[].slugzorunlustring
translations[].urlzorunlustring

null olabilir

previousSlugszorunlustring[]
previewzorunluboolean

ContentApiPostPageobject

ContentApiPostPage
AlanTipAçıklama
itemszorunluContentApiPostSummary[]
nextCursorzorunlustring

null olabilir

ContentApiPostResolutionobject

ContentApiPostSummaryobject

ContentApiPostSummary
AlanTipAçıklama
idzorunluId

Biçim: uuid

slugzorunlustring
localezorunlustring
titlezorunlustring
excerptzorunlustring

null olabilir

urlzorunlustring

null olabilir

categoryzorunluContentApiCategoryRef

null olabilir

tagszorunlustring[]
authorszorunluobject[]
authors[].slugzorunlustring
authors[].namezorunlustring
coverzorunluContentApiImage

null olabilir

feedszorunlustring[]
readingMinuteszorunluinteger
publishedAtzorunluTimestamp

Biçim: date-time

updatedAtzorunluTimestamp

Biçim: date-time

revisionzorunluinteger

ContentApiSitemapobject

ContentApiSitemap
AlanTipAçıklama
itemszorunluobject[]
items[].slugzorunlustring
items[].localezorunlustring
items[].urlzorunlustring

null olabilir

items[].updatedAtzorunluTimestamp

Biçim: date-time

items[].alternateszorunluobject[]
items[].alternates[].localezorunlustring
items[].alternates[].urlzorunlustring

null olabilir

nextCursorzorunlustring

null olabilir

ContentApiTagListobject

ContentApiTagList
AlanTipAçıklama
itemszorunluobject[]
items[].tagzorunlustring
items[].postCountzorunluinteger

ContentBodyResponseobject

ContentBodyResponse
AlanTipAçıklama
versionzorunlunumber

Sabit: 1

blockszorunluobject[]

ErrorResponseobject

ErrorResponse
AlanTipAçıklama
errorzorunluobject
error.codezorunlustring
error.messagezorunlustring
error.fieldsobject

Serbest anahtarlar

error.detailsobject

Serbest anahtarlar

error.retryAfterSecondsinteger
error.traceIdzorunlustring

Idstring

Timestampstring