Documentation

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:

  1. Connect at least one WordPress site.
  2. Connect an AI provider (your own key).
  3. Compose your first draft.
  4. Schedule or publish it.
  5. 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.

Use a dedicated WordPress user for Pressroom so audit logs stay clean and you can revoke access without disrupting human accounts.

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.

Keys are encrypted at rest and only decrypted server-side when you trigger an AI action. They are never sent to the browser.

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

Invite teammates from Team. Roles control who can publish, who can only request reviews, and who can manage billing. Reviewers see pending requests in Reviews; every approval, edit, and publish lands in Audit.

Site health & drift

Health runs periodic checks on every connected site (REST reachable, auth valid, plugin versions). Drift highlights posts that were edited directly in WordPress after Pressroom published them, so nothing silently falls out of sync.

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"
Keys can be revoked at any time. A revoked key returns 401 Unauthorized.

REST API

List drafts

GET/api/public/v1/drafts

Returns the authenticated key owner's drafts, most recently updated first.

ParameterTypeDescription
limitintegerMax results, 1–100. Defaults to 25.
statestringFilter: 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.
We retry once on connection errors. Endpoints should respond within 8 seconds and return a 2xx status to acknowledge.

Errors

The API uses standard HTTP status codes:

StatusMeaningWhen
200OKRequest succeeded.
400Bad RequestInvalid query parameters.
401UnauthorizedMissing, invalid, or revoked key.
404Not FoundResource doesn't exist.
429Too Many RequestsRate limit exceeded.
500Server ErrorSomething went wrong on our end.

Ready to ship?

Connect your first site or generate an API key to start building.