Changelog

All notable changes to the ContentHub REST API, including new endpoints, breaking changes, and deprecations.

Breaking changes are always announced in advance and given a migration window. Subscribe to status updates to receive notifications.

v2.0.02026-07-28New endpoints
  • KB intelligence endpoint now returns real keyFacts/faqs/keywords/qualityScore (Milestone 2 data)
  • GET /projects/:id/kb/:sourceId/relations, PATCH .../relations/:relationId — KB Milestone 3 duplicate/conflict relations
  • GET /content-gaps, POST /content-gaps/:id/{send-to-planner,send-to-create-post}
  • POST /projects/:id/kb/files (multipart file upload) + POST /projects/:id/kb now accepts type: "FILE" — first REST-key path for KB document uploads
  • Phase 3c of the REST catch-up initiative complete — all phases of docs/development/rest-api-catch-up-plan.md now shipped
v1.9.02026-07-28New endpoints
  • Idea Planner: POST /ideas/runs (dedup gateway, required idempotencyKey), GET /ideas/runs/:id, GET /ideas/runs/:id/ideas, POST /ideas/runs/:id/{retry,reuse}
  • Market Insights: GET|POST /market-insights/runs, GET /market-insights/runs/:id, POST /market-insights/runs/:id/{retry,reuse,cancel}, POST /market-insights/topics/:id/{create-post-brief,create-idea,mark-used}
  • New ideas:read/ideas:write and marketInsights:read/marketInsights:write scopes
  • Phase 3b of the REST catch-up initiative complete — see docs/development/rest-api-catch-up-plan.md
v1.8.02026-07-28New endpoints
  • Brand Analyzer: GET|POST /brand-profile, GET /brand-profile/:id, POST /brand-profile/:id/{approve-and-apply,archive}, GET /brand-profile/analysis/:analysisJobId, POST /brand-profile/analysis/:analysisJobId/retry
  • New brand:read/brand:write scopes
  • Phase 3a of the REST catch-up initiative — see docs/development/rest-api-catch-up-plan.md
v1.7.02026-07-28New endpoints
  • Integration connection: GET|PUT /projects/:id/connection, POST /projects/:id/connection/test — new default-off integrations:connect scope
  • Integration sync: GET /projects/:id/sync/adapters, POST /projects/:id/sync/{preview,run} — new default-off integrations:sync scope
  • WordPress categories: GET|POST /projects/:id/wp-categories, PATCH|DELETE /projects/:id/wp-categories/:categoryId
  • GET /audit-log — new audit:read scope
  • Idempotency-Key header support on all 4 generation-triggering POSTs
  • SSRF hardening: all WordPress connection/sync fetches now DNS-rebind-protected (packages/queue/lib/wp-url-validator.ts)
  • Phase 2 of the REST catch-up initiative — see docs/development/rest-api-catch-up-plan.md
v1.6.02026-07-28New endpoints
  • content:generate body widened: promptTemplateId, searchIntent, contentAngle, originalInsight, imageStrategy, minimumImageQualityScore, featuredImage, bodyImages
  • POST /content/:id/featured-image/regenerate
  • GET|DELETE /content/:id/preview, POST /content/:id/preview/token
  • GET /jobs/:progressId — unified async job progress poll across content/KB/brand/idea/market-insight jobs
  • Phase 1b of the REST catch-up initiative — see docs/development/rest-api-catch-up-plan.md
v1.5.02026-07-28New endpoints
  • Content: POST /content/create-post, POST /content/:id/regenerate, POST /content/:id/archive, POST /content/:id/unarchive, POST /content/:id/publish/retry, GET /content/calendar (?view=grid|agenda)
  • Projects: POST /projects, PATCH /projects/:id (metadata only, no credentials) — new projects:write scope
  • Settings: GET|PUT /settings/{brand-voice,keywords,languages,forbidden-words} — new settings:read/settings:write scopes
  • Usage: GET /usage/wallet, GET /usage/costs — new usage:read scope
  • Dashboard: GET /dashboard/stats, GET /dashboard/recent-content
  • Prompt Templates: GET /prompt-templates — new promptTemplates:read scope
  • Fixed a pre-existing scope/UI drift: kb:process is now selectable in the create-API-key dialog
  • First phase of the REST catch-up initiative — see docs/development/rest-api-catch-up-plan.md
v1.4.02026-07-28Rate limiting
  • Per-key and per-workspace request rate limiting now enforced on every endpoint, tiered by cost (read/write/expensive/egress)
  • New 429 error code RATE_LIMITED, distinct from QUOTA_EXCEEDED, with a Retry-After header
  • See /docs/rate-limits for the full per-tier limit table
v1.3.12026-07-28Bug fixes
  • GET /api/v1/projects/:id/kb/:sourceId/intelligence now returns real keyFacts/faqs/keywords/qualityScore (previously hardcoded null even after KB Phase 2 Milestone 2 shipped)
  • POST /api/v1/content/:id/generate now accepts all 7 contentType values (HOW_TO, PRODUCT_GUIDE, LOCAL_GUIDE were missing)
  • Corrected stale KB file-upload note referencing the removed presigned-R2 flow
v1.1.02026-06-01New endpoints
  • KB endpoints: GET/POST /api/v1/projects/:id/kb, DELETE /api/v1/projects/:id/kb/:sourceId (kb:read / kb:write scopes)
  • Publish Slots endpoints: full CRUD at /api/v1/publish-slots (slots:read / slots:write scopes)
  • GET /api/v1/publish-slots/:id/upcoming — preview next N slot datetimes
  • DELETE /api/v1/products/:id — delete a product (products:write scope)
  • POST /api/v1/content/:id/publish — new optional scheduledAt field for delayed publishing
  • 2 new scopes added: slots:read, slots:write
  • Total endpoints: 22 (up from 12)
v1.0.02026-05-30Initial release
  • REST API launched under /api/v1/
  • Resources: content, products, projects
  • Bearer API key authentication with 9 scopes
  • AI generation via POST /api/v1/content/:id/generate
  • Paginated list endpoints with page + limit parameters
  • Public documentation at /docs
  • Interactive API reference powered by Scalar