Everything you need to ship with Pressroom.
Step-by-step guides for everyday work, plus a focused developer reference for building integrations.
Getting started
Pressroom is a single workspace for planning, drafting, and publishing across all of your WordPress sites. After signing in, the welcome checklist walks you through the five steps below — you can also jump straight in:
- Connect at least one WordPress site.
- Connect an AI provider (your own key).
- Compose your first draft.
- Schedule or publish it.
- Invite teammates and set up reviews.
Connect a WordPress site
Open Sites from the sidebar and click Add site (or go directly to /sites/new). You'll need:
- The site's full URL (including
https://). - A WordPress username with publish permissions.
- An application password generated from WP Admin → Users → Profile → Application Passwords.
Pressroom verifies the connection by calling the WP REST API. Once green, the site shows up everywhere — Compose, Calendar, Health, Drift, Plugins, Media, etc.
Compose & edit drafts
Start from Compose for AI-assisted drafting, or open Content to browse and edit existing drafts. Inside a draft you can:
- Run the SEO analyzer and AI assists (rewrite, expand, summarize).
- Manage taxonomy, featured media, and internal links.
- Browse and restore previous revisions.
- Request a review from a teammate.
Publish & schedule
From any draft, choose Publish now or Schedule. Use the Calendar to drag drafts onto future dates, and Publishing windows to restrict when each site accepts new posts. The Orchestration view shows the live publishing queue across every connected site.
Connect an AI provider
AI features (composer, SEO, translations) use your own provider key — Pressroom never charges per token. Open AI providers and add either:
- OpenAI-compatible — works with OpenAI, Azure OpenAI, OpenRouter, Groq, Together, and any compatible gateway. Provide a base URL and model id (e.g.
gpt-4o-mini). - Anthropic — provide your Anthropic key and model id (e.g.
claude-sonnet-4-5).
Mark one provider as the default. Use Test on the provider card to verify the key and model before relying on it.
Translations
Open Translations, pick a source draft, choose target locales, and Pressroom uses your default AI provider to produce translated drafts. Each translation is a new draft you can edit before publishing.
Team & reviews
Site health & drift
Authentication
All requests to the public API are authenticated with a personal API key. Generate keys from API keys in your workspace. Each key's secret is shown once — store it in your secret manager.
Send the key as a Bearer token in the Authorization header:
curl https://kind-evolve-shine.lovable.app/api/public/v1/drafts \
-H "Authorization: Bearer pr_live_xxxxxxxxxxxxxxxxxxxx"401 Unauthorized.REST API
List drafts
Returns the authenticated key owner's drafts, most recently updated first.
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max results, 1–100. Defaults to 25. |
| state | string | Filter: editing, queued, publishing, published, failed. |
curl "https://kind-evolve-shine.lovable.app/api/public/v1/drafts?state=published&limit=10" \
-H "Authorization: Bearer $PRESSROOM_KEY"Example response:
{
"drafts": [
{
"id": "f1c8…",
"title": "Q3 product update",
"state": "published",
"target_status": "publish",
"site_id": "9a7e…",
"wp_post_id": 1284,
"scheduled_at": null,
"updated_at": "2026-05-12T14:01:33.000Z",
"created_at": "2026-05-10T09:21:08.000Z"
}
],
"count": 1
}Webhooks
Configure webhooks under Webhooks. Pressroom will POST a JSON payload to your URL whenever a subscribed event fires.
Event payload
{
"event": "draft.published",
"delivered_at": "2026-05-12T14:02:00.000Z",
"data": {
"draft_id": "f1c8…",
"site_id": "9a7e…",
"wp_post_id": 1284,
"link": "https://example.com/q3-update",
"title": "Q3 product update",
"status": "publish"
}
}Verifying signatures
Each request includes X-Pressroom-Signature in the form sha256=<hex>. Compute HMAC-SHA256 over the raw request body using your webhook secret and compare with a constant-time check.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(secret: string, body: string, header: string) {
const expected = "sha256=" + createHmac("sha256", secret).update(body).digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(header);
return a.length === b.length && timingSafeEqual(a, b);
}Available events
draft.published— A draft was published to WordPress.draft.scheduled— A draft was scheduled for future publish.draft.failed— A publish attempt failed.draft.review_requested— A reviewer was asked to approve.draft.approved— A draft was approved.site.connected— A WordPress site was connected.site.error— A site health check failed.
Errors
The API uses standard HTTP status codes:
| Status | Meaning | When |
|---|---|---|
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Invalid query parameters. |
| 401 | Unauthorized | Missing, invalid, or revoked key. |
| 404 | Not Found | Resource doesn't exist. |
| 429 | Too Many Requests | Rate limit exceeded. |
| 500 | Server Error | Something went wrong on our end. |