Dokumentation

Drei Wege, Inhalte abzurufen, und eine Referenz, die aus den Routen selbst erzeugt wird und daher keinen Endpunkt beschreiben kann, den es nicht gibt.

Schnellstart

Einfaches fetch

Kein SDK, kein Build-Schritt. Das ist die gesamte Integration für eine Beitragsliste.

const response = await fetch(
  "https://api.schemahaus.com/v1/content/blog-post?locale=ka&limit=10",
  { headers: { authorization: `Bearer ${process.env.SCHEMAHAUS_TOKEN}` } },
);

const { data, meta } = await response.json();
// data is only what is PUBLISHED in Georgian. Nothing is substituted
// unless you ask: add &fallback=chain, and check item.localeFallback.

Next.js

Das SDK plus ein Revalidierungs-Webhook: Wenn jemand in der Redaktion auf Veröffentlichen klickt, wird die Seite neu erzeugt, statt auf den Ablauf eines Caches zu warten.

// app/[locale]/blog/[slug]/page.tsx
import { createClient } from "@schemahaus/client";

const cms = createClient({
  token: process.env.SCHEMAHAUS_TOKEN,
  site: process.env.SCHEMAHAUS_SITE,
});

export default async function Post({ params }) {
  const { locale, slug } = await params;
  const post = await cms.document("blog-post", slug, { locale });

  if (!post) notFound();
  return <article dangerouslySetInnerHTML={{ __html: post.data.body }} />;
}

// Publishing fires a webhook. Point a nextjs_revalidate webhook at your
// deploy and the page rebuilds itself when an editor presses publish.

Jekyll, zur Build-Zeit

Für eine statische Website ganz ohne Laufzeitumgebung: Rufen Sie die Inhalte während des Builds ab und schreiben Sie die Dateien, die der Generator erwartet.

# _plugins/schemahaus.rb — runs at build time, writes _posts/
require "net/http"
require "json"

site = ENV.fetch("SCHEMAHAUS_SITE")
token = ENV.fetch("SCHEMAHAUS_TOKEN")

uri = URI("https://api.schemahaus.com/v1/content/blog-post?locale=en")
request = Net::HTTP::Get.new(uri)
request["authorization"] = "Bearer #{token}"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

JSON.parse(response.body)["data"].each do |post|
  File.write("_posts/#{post["publishedAt"][0, 10]}-#{post["slug"]}.md",
             "---\ntitle: #{post["data"]["title"].inspect}\n---\n" +
             post["data"]["body"])
end

API-Referenz

Beim Build aus dem Routenbaum gelesen. Ein Endpunkt erscheint hier, wenn die Datei existiert, und verschwindet, wenn sie gelöscht wird – Nicht-Vorhandenes kann hier also nicht dokumentiert sein.

Auslieferung

Veröffentlichte Inhalte, gelesen mit einem Auslieferungstoken. Kann bedenkenlos in der Umgebung einer Website hinterlegt werden: Es kann lesen und sonst nichts.

  • GET/api/v1/authors

    The site's authors, with their per-language biographies.

  • GET/api/v1/content/{apiId}

    Published documents of one content type. Filter, sort, paginate by `page` or by cursor (`?cursor=` to start, then each page's `meta.nextCursor`); `?locale=` is strict unless `fallback` says otherwise.

  • GET/api/v1/content/{apiId}/{identifier}

    One published document, by slug or by document id.

  • GET/api/v1/media/{id}

    One media asset's metadata and variant URLs.

  • POST/api/v1/preview/verify

    Exchange a preview token for the draft it was minted for. Needs a delivery token with draft access.

  • GET/api/v1/site

    The site's settings and its content languages.

  • GET/api/v1/site/types

    The content types on the site, with their fields. Addressed by apiId; no internal ids are returned.

Verwaltung

Schreibzugriffe, an eine Mitgliedschaft gebunden: Ein Schlüssel kann nie mehr als die Person, die ihn erstellt hat. Das verwenden auch die Importskripte.

  • GETPOST/api/v1/manage/authors

    List or create authors.

  • PATCHDELETE/api/v1/manage/authors/{id}

    Edit or remove one author.

  • POST/api/v1/manage/documents

    Create a document in one language.

  • PATCHDELETE/api/v1/manage/documents/{id}

    Edit one language version, or soft-delete the whole document. Editing takes the revision you last read.

  • POST/api/v1/manage/documents/{id}/locales

    Start a translation of a document.

  • POST/api/v1/manage/documents/{id}/transition

    Move one language version through the workflow, including publishing it.

  • GET/api/v1/manage/documents/lookup

    Find a document by slug, drafts included — how an import decides whether it has already brought a post across.

  • POST/api/v1/manage/media

    Reserve an upload and get a presigned PUT for object storage.

  • POST/api/v1/manage/media/{id}/complete

    Confirm the bytes arrived. Idempotent, so a retried import does not count the storage twice.

  • GET/api/v1/manage/types

    Content types WITH their internal ids, which every write below needs.

Strapi-Kompatibilität

Die Abfragestruktur von Strapi über dieselben veröffentlichten Inhalte, sodass eine bestehende Website umziehen kann, bevor sie neu geschrieben wird.

  • GET/api/strapi/api/{plural}

    The Strapi compatibility layer: Strapi's query shape over the same published content, so an existing site can move before it is rewritten.

Vier Regeln, die Sie vorab kennen sollten

Die Auslieferung ist standardmäßig strikt
`?locale=ka` liefert nur, was auf Georgisch veröffentlicht ist. Fehlende Inhalte bleiben als fehlend erkennbar, statt stillschweigend auf Englisch zu erscheinen. Mit `fallback=default` oder `fallback=chain` aktivieren Sie den Fallback; an `localeFallback` jedes Eintrags sehen Sie, was ersetzt wurde.
Die API liefert veröffentlichte Daten, nie Entwürfe
Ein Dokument in Bearbeitung liefert weiterhin seine zuletzt veröffentlichte Fassung aus, bis jemand erneut veröffentlicht. Erscheint eine Änderung nicht, wurde sie nicht veröffentlicht – genau so ist es gedacht.
Medienschlüssel ändern sich nie
Wird ein Bild ersetzt, entsteht ein neues Asset mit neuer URL. Das alte funktioniert weiter, weil Edge-Caches und bereits gebaute Websites noch darauf verweisen.
Jede Sprache wird separat veröffentlicht
Wer die englische Fassung veröffentlicht, veröffentlicht nicht die deutsche. Es gibt keinen gemeinsamen Veröffentlichungsstatus für ein Dokument – jede Sprachversion hat ihren eigenen.