Ana sayfa
REST API

Seomio API ile içerikleri sitenize çekin

Yayınlanmış blog içeriklerinizi kendi sitenizden istediğiniz an okuyun. Sitenizde yazma tarafı kurmanız gerekmez; listeyi ve detayı iki uç noktadan çekip kendi şablonunuzda gösterirsiniz.

Künye

Yön
Siteniz → Seomio (pull)
Temel adres
https://api.seomio.com.tr
Kimlik
x-secret-key: <secret key>
Biçim
JSON — yalnızca okuma (GET)

Nasıl çalışır

Bu yöntem pull modelidir: içerik Seomio'da durur, siteniz ihtiyaç duydukça API'den okur. Sitenizde yeni bir yazma ucu açmanız, veritabanı alanı eklemeniz gerekmez — mevcut şablonunuza bir liste ve bir detay sayfası bağlamanız yeterlidir.

Bu yöntem şuralarda iyi

  • • Statik/JAMstack siteler (Next.js, Nuxt, Astro)
  • • Blog bölümünü tamamen Seomio'ya bırakmak isteyenler
  • • Kendi şablonunuzda tam kontrol istediğiniz durumlar

Webhook daha uygun olabilir

  • • İçeriğin kendi veritabanınızda durmasını istiyorsanız
  • • Yayın anında bildirim/otomasyon tetiklemek istiyorsanız
  • • Site tarafında dış servise bağımlı kalmak istemiyorsanız
Webhook dokümanına git →

Kimlik doğrulama

Tüm istekler secret key ile kimliklenir. Anahtar sizin çalışma alanınızı temsil eder; yalnızca kendi yayınlanmış içeriklerinize erişim verir.

  1. 1

    Anahtarınızı alın

    Panel → Ayarlar → Çalışma Alanı ekranında Secret Key alanını kopyalayın.
  2. 2

    Sunucu tarafında saklayın

    Anahtarı ortam değişkenine koyun (SEOMIO_SECRET_KEY). Tarayıcıya düşen hiçbir koda yazmayın — anahtar herkese açık olursa üçüncü kişiler de içeriklerinizi çekebilir.
  3. 3

    Her isteğe başlık olarak ekleyin

    x-secret-key: <anahtar> veya Authorization: Bearer <anahtar> — ikisi de kabul edilir.

Anahtarı istemci tarafında kullanmayın

fetch çağrınız tarayıcıda çalışıyorsa anahtar herkese görünür. Çağrıyı sunucu bileşeninde, API route'unda veya build sırasında yapın; tarayıcıya yalnızca hazır içeriği gönderin.

Temel bilgiler

Tüm uç noktalar aynı zarf yapısını kullanır; hata durumunda da aynı biçim döner.

AlanTipAçıklama
Temel adresURLhttps://api.seomio.com.tr
MetotHTTPYalnızca GET — bu uçlar salt okunurdur.
successbooleanHer yanıtın ilk alanı. false ise data yerine message alanına bakın.
dataarray | objectListe uçlarında dizi, detay ucunda tek nesne.
paginationobjectYalnızca liste ucunda: total, page, limit, pages.
KapsamYalnızca yayınlanmış (published) yazılar döner. Taslak, arşiv ve silinmiş içerikler API'de görünmez.

Blog listesi

Yayınlanmış yazıları sayfalanmış olarak, en yeniden eskiye doğru döndürür.

GET/api/public/blog
AlanTipZorunluAçıklama
x-secret-keyheaderEvetÇalışma alanı anahtarınız (veya Authorization: Bearer).
pagenumberHayırSayfa numarası. Varsayılan: 1.
limitnumberHayırSayfa başına kayıt. Varsayılan: 20.
languagestringHayırDil kodu ile filtre (tr, en…). Çok dilli üretim kullanıyorsanız her dil için ayrı liste çekebilirsiniz.
İstek
curl -X GET "https://api.seomio.com.tr/api/public/blog?page=1&limit=10" \
  -H "x-secret-key: SIZIN_SECRET_KEYINIZ"
Yanıt (200)
{
  "success": true,
  "data": [
    {
      "_id": "6840f1c2a91b4e0012ab77d3",
      "title": "PVC Zemin Bakımı: Dayanıklılığı Nasıl Korursunuz?",
      "slug": "pvc-zemin-bakimi",
      "excerpt": "PVC zeminlerin ömrünü uzatan bakım adımları.",
      "keyword": "pvc zemin bakımı",
      "coverImageUrl": "https://cdn.seomio.com.tr/blog-images/cover-8f21.png",
      "publishedDate": "2026-08-19T09:00:00.000Z",
      "readingTimeMinutes": 8,
      "wordCount": 1850,
      "language": "tr",
      "createDate": "2026-08-18T21:14:03.000Z"
    }
  ],
  "pagination": {
    "total": 42,
    "page": 1,
    "limit": 10,
    "pages": 5
  }
}

Liste yanıtı hafiftir

Listede content alanı gelmez — yazının tam HTML gövdesi yalnızca detay ucundadır. Liste sayfanızı kart görünümü için gereken alanlarla (title, excerpt, coverImageUrl, readingTimeMinutes) kurun.

Blog detayı

Tek bir yazıyı slug değeriyle, tam HTML gövdesi ve SEO alanlarıyla birlikte getirir.

GET/api/public/blog/{slug}
AlanTipZorunluAçıklama
x-secret-keyheaderEvetÇalışma alanı anahtarınız.
slugpathEvetListe yanıtındaki slug değeri — kendi URL yapınızda da bunu kullanmanız önerilir.
İstek
curl -X GET "https://api.seomio.com.tr/api/public/blog/pvc-zemin-bakimi" \
  -H "x-secret-key: SIZIN_SECRET_KEYINIZ"
Yanıt (200) — sadeleştirilmiş
{
  "success": true,
  "data": {
    "_id": "6840f1c2a91b4e0012ab77d3",
    "title": "PVC Zemin Bakımı: Dayanıklılığı Nasıl Korursunuz?",
    "slug": "pvc-zemin-bakimi",
    "content": "<div class=\"key-takeaways\">...</div><h2>Giriş</h2><p>...</p>",
    "excerpt": "PVC zeminlerin ömrünü uzatan bakım adımları.",
    "keyword": "pvc zemin bakımı",
    "secondaryKeywords": ["pvc zemin temizliği", "pvc zemin ömrü"],
    "metaTitle": "PVC Zemin Bakımı | Marka",
    "metaDescription": "PVC zemin bakımı için pratik ve uzman önerileri.",
    "coverImageUrl": "https://cdn.seomio.com.tr/blog-images/cover-8f21.png",
    "wordCount": 1850,
    "readingTimeMinutes": 8,
    "seoScore": 87,
    "language": "tr",
    "publishedDate": "2026-08-19T09:00:00.000Z"
  }
}
AlanTipAçıklama
contentstring (HTML)Tam HTML gövde. Gövde görselleri (CDN mutlak URL), "İlgili İçerikler" bölümü ve JSON-LD yapısal verisi gömülüdür. Şablonunuzda olduğu gibi basmanız yeterlidir.
metaTitle / metaDescriptionstringSayfanızın <title> ve meta description değerleri için hazır.
coverImageUrlstring (URL)Kapak görselinin mutlak CDN adresi — öne çıkan görsel olarak kullanın.
secondaryKeywordsstring[]İkincil anahtar kelimeler — etiket/ilgili içerik kurgusu için kullanılabilir.
readingTimeMinutes / wordCountnumberOkuma süresi ve kelime sayısı.
seoScorenumber | nullSeomio'nun kendi on-page SEO puanı (0–100). Gösterme zorunluluğu yoktur.
languagestringYazının dili.
publishedDatestring (ISO 8601)Yayın tarihi.

Yanıtta gördüğünüzden fazla alan olabilir

Detay ucu yazının tüm kaydını döndürür; yukarıdaki tablo sitenizde işinize yarayacak alanları özetler. Tanımadığınız alanları yok sayabilirsiniz — ileride eklenen alanlar entegrasyonunuzu bozmaz.

Hata kodları

Hatalar da aynı JSON zarfıyla döner.

Örnek hata gövdesi
{
  "success": false,
  "message": "Invalid secret key"
}
KodAnlamıNe yapmalı
401Anahtar başlığı hiç gönderilmemişx-secret-key başlığını ekleyin.
403Anahtar geçersiz veya çalışma alanı aktif değilPanelden anahtarı yeniden kopyalayın; abonelik durumunu kontrol edin.
404Bu slug ile yayınlanmış bir yazı yokYazı taslak/arşiv olabilir ya da slug değişmiştir; listeden güncel slug'ı alın.
500Sunucu tarafı hataKısa bir süre sonra tekrar deneyin; sürerse bize iletin.

Örnek entegrasyonlar

Anahtarın sunucuda kaldığı, önbellekli ve hataya dayanıklı kullanım kalıpları.

Next.js — veri katmanı
// lib/seomio.ts — anahtar YALNIZCA sunucu tarafında kullanılır
const BASE = "https://api.seomio.com.tr";

async function seomio(path: string) {
  const res = await fetch(BASE + path, {
    headers: { "x-secret-key": process.env.SEOMIO_SECRET_KEY as string },
    // İçerik sık değişmiyor; 1 saatlik önbellek hem hızlı hem ekonomik
    next: { revalidate: 3600 }
  });

  if (!res.ok) throw new Error("Seomio API hatası: " + res.status);

  const json = await res.json();
  if (!json.success) throw new Error(json.message || "Bilinmeyen hata");
  return json;
}

export async function getPosts(page = 1, limit = 12) {
  const json = await seomio("/api/public/blog?page=" + page + "&limit=" + limit);
  return { posts: json.data, pagination: json.pagination };
}

export async function getPost(slug: string) {
  const json = await seomio("/api/public/blog/" + slug);
  return json.data;
}
Next.js — detay sayfası
// app/blog/[slug]/page.tsx
import { getPost } from "@/lib/seomio";

export default async function BlogDetail({ params }: { params: { slug: string } }) {
  const post = await getPost(params.slug);

  return (
    <article>
      <h1>{post.title}</h1>
      {post.coverImageUrl && <img src={post.coverImageUrl} alt={post.title} />}

      {/* content tam HTML gövdedir: görseller, iç linkler ve JSON-LD gömülü gelir */}
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </article>
  );
}

export async function generateMetadata({ params }: { params: { slug: string } }) {
  const post = await getPost(params.slug);
  return {
    title: post.metaTitle || post.title,
    description: post.metaDescription || post.excerpt
  };
}
PHP — cURL
<?php
// seomio.php — anahtarı .env / config dosyasında tutun, şablona sızdırmayın

function seomio_get($path) {
    $ch = curl_init('https://api.seomio.com.tr' . $path);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => ['x-secret-key: ' . getenv('SEOMIO_SECRET_KEY')],
        CURLOPT_TIMEOUT        => 15,
    ]);

    $body   = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($status !== 200) {
        return null;
    }

    $json = json_decode($body, true);
    return isset($json['success']) && $json['success'] ? $json : null;
}

// Liste
$list = seomio_get('/api/public/blog?page=1&limit=12');
$posts = $list ? $list['data'] : [];

// Detay
$detail = seomio_get('/api/public/blog/pvc-zemin-bakimi');
$post = $detail ? $detail['data'] : null;

Yayın ipuçları

Çektiğiniz içerikten SEO açısından tam verim almanız için.

  • Önbellek kullanın. İçerik dakika dakika değişmez; 30–60 dakikalık bir önbellek (ISR/CDN) hem sayfa hızını hem dayanıklılığı artırır.
  • JSON-LD'yi ikinci kez eklemeyin. content içinde Article/FAQ/Breadcrumb yapısal verisi zaten gömülüdür; şablonunuzda aynı türden ikinci bir JSON-LD basmak çakışma yaratır.
  • slug'ı koruyun. Kendi URL'nizde Seomio'daki slug'ı kullanırsanız iç linkler ve "İlgili İçerikler" bölümündeki bağlantılar doğru sayfalara düşer.
  • metaTitle / metaDescription'ı kullanın. Bu alanlar anahtar kelimeye göre üretilir; başlığı kendi şablon ekinizle uzatmak yerine olduğu gibi kullanmak daha iyi sonuç verir.
  • Görselleri indirmek zorunda değilsiniz. Kapak ve gövde görselleri CDN üzerinden mutlak URL ile gelir ve kimlik doğrulama gerektirmez. Kendi medya kitaplığınıza almak isterseniz de serbestsiniz.
  • Sitemap'inize ekleyin. Liste ucundaki slug ve publishedDate alanlarıyla sitemap üretmek, indekslenmeyi hızlandırır.

Panelde canlı deneyin

Giriş yaptıysanız API Playground ekranından bu uç noktaları kendi anahtarınızla, tarayıcıdan çıkmadan test edebilirsiniz.

Sonraki adım

Webhook ile otomatik yayın

İçeriğin üretildiği anda sitenize düşmesini istiyorsanız push yöntemi.

Takıldığınız yer mi var?

Entegrasyon desteği

Endpoint'inizin aldığı isteği ve döndüğü yanıtı yazın, birlikte bakalım.

info@seomio.com.tr