Connected in
three steps
Install the SDK
No dependencies. Works in Node 18 and later, Workers, Next.js and Astro.
npm install @manifolio/sdkGenerate your types
Types come from your live schema, so every field autocompletes.
npx manifolio types --out manifolio.d.tsRead your content
Entries arrive typed, in the language you ask for.
await cms.entries("article", { limit: 10 })
Fast reads,
fresh on publish
Filter, sort and page through entries, ask only for the fields you need and populate references up to three levels deep.
- Cached at the edgeResponses are cached close to your visitors and cleared the instant something is published.
- Preview APIShow drafts on a staging site with a development key that has the preview scope.
- Per-language readsAsk for a language. Missing fields fall back to the main one, field by field.
import { cms } from "@/lib/manifolio";
export default async function Journal() {
const posts = await cms.entries("article", {
fields: ["title", "slug", "cover"],
filter: { category: "brewing" },
sort: "-published",
populate: 1,
});
return posts.map((p) => <Card key={p._id} post={p} />);
}Know the moment
content changes
Send signed events to your build or your cache when entries are published or unpublished, or when a form gets a submission.
- Signed with HMACCheck the signature with parseWebhook from the SDK. Old messages are rejected.
- Retries and historyFailed deliveries retry on their own. See every attempt and resend by hand.
- Test from the adminSend a test event before you go live.

See every request
your sites make
Each key belongs to one environment. The request log shows the status, latency and cache result of every call, live.
- Scoped secret keyscontent:read, content:preview, content:write and analytics:read.
- Publishable keysSafe in the browser, for analytics and forms, and only from the domains you list.
- A live request logFilter by status or path and open any request to see what happened.

