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"])
end

Referencia 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/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.

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/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.

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.