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"])
endAPI-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/authorsThe 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/verifyExchange a preview token for the draft it was minted for. Needs a delivery token with draft access.
GET/api/v1/siteThe site's settings and its content languages.
GET/api/v1/site/typesThe 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/authorsList or create authors.
PATCHDELETE/api/v1/manage/authors/{id}Edit or remove one author.
POST/api/v1/manage/documentsCreate 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}/localesStart a translation of a document.
POST/api/v1/manage/documents/{id}/transitionMove one language version through the workflow, including publishing it.
GET/api/v1/manage/documents/lookupFind a document by slug, drafts included — how an import decides whether it has already brought a post across.
POST/api/v1/manage/mediaReserve an upload and get a presigned PUT for object storage.
POST/api/v1/manage/media/{id}/completeConfirm the bytes arrived. Idempotent, so a retried import does not count the storage twice.
GET/api/v1/manage/typesContent 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.