Start here
Delivery quickstart
Publish a sample article and display it with three ordinary HTTP requests. No SDK or delivery key required.
PeopleTide Content · HTTP integration guides
1. Publish a sample article.
Open the workspace and select your site. Create an article content type with a text or Markdown body, then create an article with slug welcome. Save it, request publication, and have a publisher approve it. Wait for the release to become active.
- Use organisation and site UUIDs from your workspace API responses; the authoring site list is GET /api/v1/sites.
- The organisation UUID is returned by GET /api/v1/session for your signed-in session.
- An unpublished site returns 404 NO_PUBLISHED_RELEASE; saving a draft alone does not make delivery available.
2. Configure your project.
Replace the UUID placeholders with the site that owns the published article. These identifiers are public routing information, not agent credentials.
CONTENT_ORIGIN=https://content.peopletide.com
CONTENT_ORGANIZATION_ID=YOUR_ORGANIZATION_UUID
CONTENT_SITE_ID=YOUR_SITE_UUID3. Add the delivery helper.
Save this as delivery.js in a project using ES modules. The helper fetches one release and returns null when the requested article is not in that release.
// delivery.js — no SDK or API key required. Node 22+ or a modern browser.
export async function getArticle({ origin, organization, site, slug }) {
const base = new URL(origin);
if (base.protocol !== 'https:' && !['localhost', '127.0.0.1'].includes(base.hostname)) {
throw new Error('Use an HTTPS Content origin');
}
if (![organization, site].every(id => /^[a-f0-9-]{36}$/.test(id))) {
throw new Error('Set your organization and site UUIDs');
}
const prefix = '/delivery/v1/' + organization + '/' + site + '/';
async function read(path) {
const url = new URL(path, base);
if (url.origin !== base.origin || !url.pathname.startsWith(prefix) || url.search || url.hash) {
throw new Error('Unexpected delivery URL');
}
const response = await fetch(url, {
credentials: 'omit', cache: 'no-store', redirect: 'error',
signal: AbortSignal.timeout(8000),
});
if (!response.ok) throw new Error('Content delivery returned ' + response.status);
return response.json();
}
const current = await read(prefix + 'current.json');
const manifest = await read(current.url);
const entry = manifest.entries.find(item => item.type === 'article' && item.slug === slug);
if (!entry) return null;
const document = await read(entry.url);
return { releaseId: current.releaseId, document };
}4. Read your article.
In Node 22+, save this as example.mjs alongside delivery.js and run node --env-file=.env example.mjs. Browser projects pass their public configuration as shown in the framework guides.
import { getArticle } from './delivery.js';
const result = await getArticle({
origin: process.env.CONTENT_ORIGIN,
organization: process.env.CONTENT_ORGANIZATION_ID,
site: process.env.CONTENT_SITE_ID, slug: 'welcome',
});
if (!result) throw new Error('Publish the welcome article first');
console.log(result.releaseId, result.document.title);5. Verify the published version.
Change and save a draft: delivery should still return the approved version. Publish a new release and fetch again after the discovery cache expires. Confirm its release ID and title changed together.