Documentation
REST API & SDK
Pull your published blog content into any app - a headless frontend, a WordPress or Shopify integration, a static-site build, or your own server. Read access to articles, categories, tags, authors, search and site metadata, over a simple JSON API and a typed TypeScript SDK.
API-key auth
One key per workspace. Send it as a Bearer token.
JSON REST
Predictable envelopes, pagination and errors.
Typed SDK
@verbinge/sdk - zero-dependency, works in Node & edge.
Authentication
Every request needs a workspace API key. Create one in Settings → API keys. You’ll see the secret once - copy it somewhere safe. Send it in the Authorization header:
curl https://verbinge.com/api/v1/articles?limit=10 \
-H "Authorization: Bearer nvy_your_key_here"Keys are secrets - use them from a server, never from browser code. To render your blog on a page without a key, use the one-line embed instead.
Base URL
https://verbinge.com/api/v1Endpoints
All endpoints return published content scoped to your workspace.
| Method | Path | Description |
|---|---|---|
| GET | /articles | List published articles. Query: page, limit, category (slug), tag (slug). |
| GET | /articles/{slug} | A single published article - full HTML/Markdown, SEO and author. |
| GET | /categories | Categories defined in your workspace. |
| GET | /tags | Tags defined in your workspace. |
| GET | /authors | Authors with at least one published article. |
| GET | /authors/{id} | A single author profile (byline + bio + links). |
| GET | /search?q= | Full-text search across published articles. |
| GET | /site | Blog metadata: title, description, canonical URL, logo. |
| GET | /openapi.json | Machine-readable OpenAPI 3.1 spec (no auth) for client codegen. |
Response shape
Successful responses wrap the payload in data; list endpoints add pagination.
{
"data": [
{
"id": "…",
"title": "How onboarding drives retention",
"slug": "onboarding-retention",
"url": "https://acme.verbinge.com/onboarding-retention",
"excerpt": "…",
"coverImage": { "url": "…", "alt": "…", "width": 1200, "height": 630 },
"category": "Growth",
"tags": ["retention", "activation"],
"readingTime": 6,
"author": { "id": "…", "name": "Jane Doe", "jobTitle": "Head of Growth", "avatarUrl": "…" },
"publishedAt": "2026-07-01T09:00:00.000Z",
"updatedAt": "2026-07-01T09:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 10, "total": 24, "totalPages": 3, "hasMore": true }
}TypeScript SDK
@verbinge/sdk is a thin, fully-typed wrapper over the REST API. No dependencies; runs anywhere fetch exists.
npm i @verbinge/sdkimport { VerbingeClient } from '@verbinge/sdk';
// Server-side only - never expose your key in a browser bundle.
const verbinge = new VerbingeClient({ apiKey: process.env.VERBINGE_API_KEY! });
// List published articles (newest first), with pagination
const { data, pagination } = await verbinge.articles.list({ limit: 10 });
// Filter by category or tag slug
const guides = await verbinge.articles.list({ category: 'guides', page: 2 });
// A single post - full content, SEO and author
const post = await verbinge.articles.get('onboarding-retention');
// Search, taxonomy, authors and site metadata
const { data: hits } = await verbinge.search({ q: 'retention' });
const categories = await verbinge.categories.list();
const site = await verbinge.site.get();Errors
Non-2xx responses use a consistent shape. The SDK throws a typed VerbingeError carrying status and code.
{ "error": { "code": "invalid_key", "message": "Unknown or revoked API key." } }Common codes: missing_key / invalid_key (401), not_found (404), missing_query (400).