Your blog, on your website, powered by our API.
PersonnaPress writes, stores, and versions your articles. Your site fetches them with one GET request. No CMS to install, no plugin to maintain.
14-day free trial. No credit card required.
How It Works
Store once, deliver anywhere
- 01
Generate
Drop your notes into PersonnaPress. The AI writes a full SEO blog post in your brand voice, ready for review in under 90 seconds.
- 02
Store and version
After you approve, the article is stored with a clean slug, full revision history, and SEO metadata. Every edit creates a numbered revision you can restore.
- 03
Fetch via API
Your site calls GET /public/v1/articles with your delivery token. You receive HTML, metadata, and ready-to-use SEO structured data in one response.
The Response
Everything you need in one call
GET /public/v1/articles/{slug} returns the article HTML, metadata, and a complete SEO object. No extra requests, no server-side SEO assembly needed.
{
"slug": "how-to-price-consulting-services",
"title": "How to Price Consulting Services Without Guessing",
"excerpt": "Most consultants underprice because they anchor to hourly rates instead of value delivered.",
"featured_image_url": "https://cdn.personnapress.com/images/how-to-price-consulting.jpg",
"author": "Alex Morgan",
"tags": ["consulting", "pricing", "freelance"],
"category": "Business",
"published_at": "2026-07-14T09:00:00+00:00",
"updated_at": "2026-07-14T10:23:00+00:00",
"reading_time_minutes": 7,
"html": "<h2>The problem with hourly pricing</h2><p>When you charge by the hour...</p>",
"seo": {
"reading_time_minutes": 7,
"meta_description": "Learn how to price consulting services based on value, not hours. Three frameworks that help independent consultants earn more without working more.",
"json_ld": {
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to Price Consulting Services Without Guessing",
"description": "Learn how to price consulting services based on value, not hours.",
"image": "https://cdn.personnapress.com/images/how-to-price-consulting.jpg",
"datePublished": "2026-07-14T09:00:00+00:00",
"dateModified": "2026-07-14T10:23:00+00:00",
"author": { "@type": "Person", "name": "Alex Morgan" },
"keywords": "consulting, pricing, freelance"
},
"og": {
"title": "How to Price Consulting Services Without Guessing",
"description": "Learn how to price consulting services based on value, not hours.",
"image": "https://cdn.personnapress.com/images/how-to-price-consulting.jpg"
}
}
}Integration
Add it to your site in one request
Copy-paste examples for the most common setups. The same API works from any language or framework. Publishing to a GitHub Pages repo instead?
Plain fetch
// Plain fetch: works in any JavaScript environment
const res = await fetch(
"https://api.personnapress.com/public/v1/articles/how-to-price-consulting-services",
{
headers: {
Authorization: "Bearer ppd_your_token_here",
},
}
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const article = await res.json();
document.querySelector("h1").textContent = article.title;
document.querySelector("article").innerHTML = article.html;Next.js App Router
// Next.js App Router: async Server Component
// app/blog/[slug]/page.tsx
import type { Metadata } from "next";
const API = "https://api.personnapress.com/public/v1/articles";
const TOKEN = process.env.PERSONNAPRESS_DELIVERY_TOKEN!;
async function getArticle(slug: string) {
const res = await fetch(`${API}/${slug}`, {
headers: { Authorization: `Bearer ${TOKEN}` },
next: { revalidate: 60 },
});
if (!res.ok) return null;
return res.json();
}
export async function generateMetadata(
{ params }: { params: { slug: string } }
): Promise<Metadata> {
const article = await getArticle(params.slug);
if (!article) return {};
return {
title: article.title,
...(article.seo.meta_description && { description: article.seo.meta_description }),
...(article.seo.og && { openGraph: article.seo.og }),
};
}
export default async function BlogPostPage(
{ params }: { params: { slug: string } }
) {
const article = await getArticle(params.slug);
if (!article) return <p>Article not found.</p>;
return (
<main>
<h1>{article.title}</h1>
<article dangerouslySetInnerHTML={{ __html: article.html }} />
</main>
);
}Astro
---
// src/pages/blog/[slug].astro
const { slug } = Astro.params;
const res = await fetch(
`https://api.personnapress.com/public/v1/articles/${slug}`,
{
headers: {
Authorization: `Bearer ${import.meta.env.PERSONNAPRESS_TOKEN}`,
},
}
);
const article = await res.json();
---
<html lang="en">
<head>
<title>{article.title}</title>
{article.seo.meta_description && <meta name="description" content={article.seo.meta_description} />}
{article.seo.og?.title && <meta property="og:title" content={article.seo.og.title} />}
{article.seo.og?.image && <meta property="og:image" content={article.seo.og.image} />}
<script type="application/ld+json" set:html={JSON.stringify(article.seo.json_ld)} />
</head>
<body>
<h1>{article.title}</h1>
<article set:html={article.html} />
</body>
</html>Why PersonnaPress
Built for blogs, not for everything
A Contentful alternative that writes the content for you and ships SEO data in every response.
| Feature | PersonnaPress | Contentful | DropInBlog |
|---|---|---|---|
| AI writes the content | |||
| SEO structured data in every response | partial | ||
| Revision history included | |||
| Publishes to WordPress, X, LinkedIn, GitHub | |||
| Built specifically for blogs |
FAQ
Questions about the headless blog API
Get Started
Your blog does not need a CMS.
PersonnaPress handles content creation, storage, and delivery. Your site calls one endpoint and renders the result.
Start free, no credit card14-day free trial. One API for content, SEO data, and images.
