Documentación
Tres formas de leer el contenido y una referencia generada a partir de las propias rutas, de modo que no puede describir un endpoint que no existe.
Inicios rápidos
fetch simple
Sin SDK ni paso de compilación. Esta es toda la integración para una lista de entradas.
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
El SDK más un webhook de revalidación, para que al pulsar Publicar se regenere la página en lugar de esperar a que venza una caché.
// 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, en tiempo de compilación
Para un sitio estático sin entorno de ejecución: obtenga el contenido durante la compilación y escriba los archivos que espera el generador.
# _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"])
endReferencia de la API
Se lee del árbol de rutas en tiempo de compilación. Un endpoint aparece aquí cuando el archivo existe y desaparece cuando se elimina, así que no puede documentar algo que no está.
Entrega
Contenido publicado, leído con un token de entrega. Es seguro incluirlo en el entorno de un sitio consumidor: solo puede leer.
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.
Administración
Escrituras vinculadas a una membresía, de modo que una clave nunca puede hacer más que la persona que la creó. Es lo que usan los scripts de importación.
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.
Compatibilidad con Strapi
La forma de consulta de Strapi sobre el mismo contenido publicado, para que un sitio existente pueda migrar antes de reescribirse.
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.
Cuatro reglas que conviene conocer antes de empezar
- La entrega es estricta de forma predeterminada
- `?locale=ka` devuelve solo lo publicado en georgiano. El contenido que falta se ve como contenido que falta, en lugar de convertirse en inglés sin aviso. Agregue `fallback=default` o `fallback=chain` para activar el respaldo y consulte `localeFallback` en cada elemento para ver qué se sustituyó.
- La API sirve datos publicados, nunca borradores
- Un documento en edición sigue sirviendo su última versión publicada hasta que alguien vuelva a publicar. Si un cambio no aparece, es que no se ha publicado: esa es precisamente la función.
- Las claves multimedia nunca cambian
- Reemplazar una imagen crea un recurso nuevo con una URL nueva. La anterior sigue funcionando, porque las cachés perimetrales y los sitios ya compilados todavía apuntan a ella.
- Cada idioma se publica por separado
- Publicar el inglés no publica el alemán. Un documento no tiene un único estado de publicación: cada versión de idioma tiene el suyo.