API reference

Base URL: `https://app.pressroom.com`

API reference

Base URL: https://app.pressroom.com

Authentication

All API requests require a bearer token in the Authorization header:

Authorization: Bearer pr_your_token_here

Create API tokens in Settings > API Tokens in the Pressroom dashboard. Tokens are scoped to your organization — a valid token authenticates the request and sets the org context automatically.

If no token is provided, you’ll receive a 401 Unauthorized response.

Organizations

List organizations

GET /api/orgs

Returns: [{id, name, domain, created_at}]

Create organization

POST /api/orgs
{
  "name": "Acme Inc",
  "domain": "acme.com"
}

Get organization

GET /api/orgs/{org_id}

Delete organization

DELETE /api/orgs/{org_id}

Cascading delete — removes all signals, content, settings, team, and audit data.


Pipeline

Scout

POST /api/pipeline/scout

Query params:

  • since_hours (int, default 24) — How far back to look

Response:

{
  "signals_raw": 45,
  "signals_relevant": 12,
  "signals_saved": 10,
  "signals_skipped_dupes": 2,
  "signals": [{...}]
}

Generate

POST /api/pipeline/generate

Body:

{
  "channels": ["linkedin", "blog", "x_thread"]
}

Response:

{
  "items": [
    {"id": 1, "channel": "linkedin", "headline": "..."},
    {"id": 2, "channel": "blog", "headline": "..."}
  ]
}

Regenerate

POST /api/pipeline/regenerate

Body: {"content_id": 42, "channel": "linkedin"}


Signals

List signals

GET /api/signals

Query params:

  • limit (int, default 50)

Response: [{id, type, source, title, url, summary, prioritized, created_at}]


Content

List content

GET /api/content

Query params:

  • status (str) — “queued”, “approved”, “published”, “spiked”, or empty for all
  • limit (int, default 50)

Get content

GET /api/content/{content_id}

Returns full content including body text.

Update content

PATCH /api/content/{content_id}

Body (all fields optional):

{
  "status": "approved",
  "headline": "New headline",
  "body": "Updated body text"
}

Humanize content

PATCH /api/content/{content_id}/humanize

Runs the humanizer skill on the content body.

Schedule content

POST /api/content/{content_id}/schedule

Body: {"publish_at": "2025-01-15T09:00:00Z"}

Delete (spike) content

DELETE /api/content/{content_id}

List published content performance

GET /api/content/published/performance

Returns performance metrics (views, likes, comments, shares) for all published content.

Get content performance

GET /api/content/{content_id}/performance

Returns post-publish metrics for a specific content item.

Fetch content performance

POST /api/content/{content_id}/fetch-performance

Triggers a fresh fetch of performance metrics from the publishing platform (LinkedIn, Dev.to).


Stories

List stories

GET /api/stories

Query params:

  • limit (int, default 20)

Create story

POST /api/stories

Body:

{
  "title": "Story headline",
  "angle": "Editorial angle",
  "editorial_notes": "Context for generation",
  "signal_ids": [12, 15, 23]
}

Get story

GET /api/stories/{story_id}

Returns story with all attached signals and editor notes.

Update story

PUT /api/stories/{story_id}

Body: {title?, angle?, editorial_notes?}

Delete story

DELETE /api/stories/{story_id}

Add signal to story

POST /api/stories/{story_id}/signals

Body: {"signal_id": 28, "editor_notes": "Use as evidence"}

Remove signal from story

DELETE /api/stories/{story_id}/signals/{story_signal_id}

Update signal notes

PUT /api/stories/{story_id}/signals/{story_signal_id}

Body: {"editor_notes": "Updated notes"}

Generate from story

POST /api/stories/{story_id}/generate

Body:

{
  "channels": ["linkedin", "blog"],
  "team_member_id": 5
}

Response: {"story_id": 1, "generated": 2, "content": [{...}]}

Discover signals

POST /api/stories/{story_id}/discover

Body: {"mode": "web"}


Sources (SIGINT)

List sources

GET /api/sources

Query params:

  • type (str) — “reddit”, “hackernews”, “rss”, “x_search”, “trend”
  • active_only (bool, default true)

Create source

POST /api/sources

Body:

{
  "type": "reddit",
  "name": "r/programming",
  "config": {"subreddit": "programming"},
  "category_tags": ["tech", "development"],
  "fetch_interval_hours": 6
}

Update source

PATCH /api/sources/{source_id}

Delete source

DELETE /api/sources/{source_id}

Source subscriptions

GET /api/sources/subscriptions
POST /api/sources/subscriptions        — {"source_id": 5, "enabled": true}
POST /api/sources/subscriptions/bulk   — {"source_ids": [1, 2, 3]}

Sweep sources

POST /api/sources/sweep

Body: {"source_ids": [1, 2, 3]} (optional — sweeps all if empty)

SIGINT feed

GET /api/sources/feed

Query params:

  • limit (int, default 40)
  • min_score (float, optional)

Returns relevance-scored signals.

Fingerprint

POST /api/sources/fingerprint/rebuild
GET /api/sources/fingerprint
GET /api/sources/recommended

Seed defaults

POST /api/sources/seed

Wire

List wire sources

GET /api/wire/sources

Create wire source

POST /api/wire/sources

Body:

{
  "type": "github_release",
  "name": "My Repo Releases",
  "config": {"repo": "owner/repo"}
}

Update wire source

PATCH /api/wire/sources/{source_id}

Delete wire source

DELETE /api/wire/sources/{source_id}

Fetch wire signals

POST /api/wire/fetch

Body: {"wire_source_id": 5} (optional — fetches all if empty)

List wire signals

GET /api/wire/signals

Query params:

  • limit (int, default 40)
  • type (str, optional)

Settings

Get all settings

GET /api/settings

Returns all settings with sensitive values masked.

Get single setting (unmasked)

GET /api/settings/raw/{key}

Update settings

PUT /api/settings

Body: {"settings": {"key1": "value1", "key2": "value2"}}

Connection status

GET /api/settings/status

Returns connection status for all services.

API keys

GET /api/settings/api-keys
POST /api/settings/api-keys     — {"label": "My Key", "key_value": "sk-..."}
PUT /api/settings/api-keys/{id} — {"label": "Updated Label"}
DELETE /api/settings/api-keys/{id}

Publishing

Publish approved content

POST /api/publish

Response: {"published": 3, "errors": 0, "results": [{channel, status}]}

LinkedIn OAuth

POST /api/linkedin/authorize
GET /api/linkedin/profile

Facebook OAuth

POST /api/facebook/authorize

SEO Audit

Run audit

POST /api/audit/seo

Body: {"domain": "example.com"}

Query params:

  • deep (bool, default true) — Enable Claude-powered analysis

README audit

POST /api/audit/readme

Body: {"repo": "owner/repo"}

Audit history

GET /api/audit/history

Query params:

  • audit_type (str) — “seo” or “readme”
  • limit (int, default 20)

SEO PR Pipeline

Start run

POST /api/seo-pr/run

Body:

{
  "repo_url": "https://github.com/owner/repo",
  "domain": "example.com",
  "base_branch": "main"
}

List runs

GET /api/seo-pr/runs

Get run status

GET /api/seo-pr/runs/{run_id}

Get run plan

GET /api/seo-pr/runs/{run_id}/plan

Delete run

DELETE /api/seo-pr/runs/{run_id}

Competitive Intelligence

Scan competitors

POST /api/competitive/scan

Body: {"competitor_urls": ["https://competitor1.com", "https://competitor2.com"]}

Get results

GET /api/competitive/{org_id}

AI Visibility

Scan

POST /api/ai-visibility/scan

Results

GET /api/ai-visibility/{org_id}

Manage questions

GET /api/ai-visibility/{org_id}/questions
PUT /api/ai-visibility/{org_id}/questions

Body: {"questions": ["What is the best CI/CD tool?", "How to implement GitOps?"]}


Analytics

Dashboard

GET /api/analytics/dashboard

Response:

{
  "signals": {"total": 150, "today": 12, "week": 45},
  "content": {"queued": 5, "approved": 3, "published": 20, "spiked": 8},
  "approval_rate": 0.71,
  "top_signals": [{...}],
  "top_spiked": [{...}]
}

YouTube

Generate script

POST /api/youtube/generate

Body: {"content_id": 42} or {"brief": "Topic description"}

List scripts

GET /api/youtube/scripts

Export as Remotion JSON

GET /api/youtube/scripts/{script_id}/export

Update script

PATCH /api/youtube/scripts/{script_id}

Body: {title?, sections?, talking_points?, lower_thirds?}

Delete script

DELETE /api/youtube/scripts/{script_id}

Render video

POST /api/youtube/scripts/{script_id}/render

Triggers Remotion rendering pipeline for the script. Returns a render job ID.

Render chyron

POST /api/youtube/render-chyron

Body: {"text": "Lower third text", "style": "default"}

Renders a standalone brand chyron/lower-third overlay.

Upload footage

POST /api/youtube/scripts/{script_id}/upload-footage

Upload raw footage or b-roll to associate with a script. Accepts multipart form data.

Publish rendered video

POST /api/youtube/scripts/{script_id}/publish-rendered

Uploads the rendered video to YouTube with metadata from the script (title, description, tags).


Onboarding

Crawl domain

POST /api/onboard/crawl

Body: {"domain": "example.com"}

Synthesize profile

POST /api/onboard/profile

Body: {"crawl_data": {...}, "domain": "example.com", "extra_context": ""}

Classify DreamFactory services

POST /api/onboard/df-classify

Apply profile

POST /api/onboard/apply

Body: {"profile": {...}, "service_map": {...}, "crawl_pages": {...}}

Check status

GET /api/onboard/status

Response: {complete, has_company, has_voice, has_df, has_service_map, company_name, industry, org_id}


Team

List members

GET /api/team

Add member

POST /api/team

Body:

{
  "name": "Jane Smith",
  "title": "VP Engineering",
  "bio": "...",
  "email": "jane@example.com",
  "linkedin_url": "...",
  "expertise_tags": ["backend", "devops"]
}

Update member

PUT /api/team/{member_id}

Delete member

DELETE /api/team/{member_id}

Discover team

POST /api/team/discover

Auto-discovers members from GitHub org and company pages.

Analyze voice

POST /api/team/{member_id}/analyze-voice

Runs voice analysis on the team member’s writing samples. Generates a voice profile (persona, tone, vocabulary patterns) from their existing content.

POST /api/team/link-github

Body: {"member_id": 5, "github_username": "janesmith"}

Links a team member to their GitHub profile for gist publishing and profile enrichment.

Check gist readiness

GET /api/team/gist-check

Returns which team members have linked GitHub accounts and are ready for gist generation.

Generate gist

POST /api/team/{member_id}/generate-gist

Body: {"content_id": 42} or {"brief": "Topic description"}

Generates a GitHub gist draft from content or a brief, using the team member’s voice profile.

Publish gist

POST /api/team/{member_id}/publish-gist

Body: {"gist_id": "abc123"}

Publishes a generated gist to the team member’s linked GitHub account.


Email

Compose draft

POST /api/email/drafts/compose

Body: {"content_id": 42}

List drafts

GET /api/email/drafts

Query params:

  • status (str, optional)
  • limit (int, default 20)

Get draft

GET /api/email/drafts/{draft_id}

Update draft

PUT /api/email/drafts/{draft_id}

Body: {subject?, html_body?, text_body?, recipients?, status?}

Delete draft

DELETE /api/email/drafts/{draft_id}

Preview (HTML)

GET /api/email/drafts/{draft_id}/preview

Returns rendered HTML.


Assets

List assets

GET /api/assets

Query params:

  • type (str, optional)

Add asset

POST /api/assets

Body: {"asset_type": "blog", "url": "https://blog.example.com", "label": "Company Blog", "description": ""}

Update asset

PUT /api/assets/{asset_id}

Delete asset

DELETE /api/assets/{asset_id}

Sync GitHub orgs

POST /api/assets/github/sync-orgs

Skills

List skills

GET /api/skills

Read skill

GET /api/skills/{name}

Update skill

PUT /api/skills/{name}

Body: {"content": "# Skill prompt..."}

Create skill

POST /api/skills

Body: {"name": "my_skill", "content": "# My Skill\n..."}

Delete skill

DELETE /api/skills/{name}

Core skills (humanizer, seo_geo) are protected from deletion.

Invoke skill

POST /api/skills/invoke/{name}

Body: {"text": "Text to process"}


Webhooks

GitHub webhook

POST /api/webhook/github

Handles push, release, and other GitHub events.


Google Search Console

Upload service account

POST /api/gsc/service-account

Body: {"credentials": {...}} — Google service account JSON credentials for GSC access.

Connection status

GET /api/gsc/status

Returns whether GSC is connected and which properties are accessible.

List properties

GET /api/gsc/properties

Returns all verified GSC properties (domains and URL prefixes).

Set active property

PUT /api/gsc/property

Body: {"property_url": "sc-domain:example.com"}

Sets the active GSC property for analytics queries.

Search analytics

GET /api/gsc/analytics

Query params:

  • start_date (str) — ISO date (default: 28 days ago)
  • end_date (str) — ISO date (default: today)
  • dimensions (str) — Comma-separated: “query”, “page”, “country”, “device”
  • row_limit (int, default 100)

Returns search performance data (clicks, impressions, CTR, position).

List sitemaps

GET /api/gsc/sitemaps

Returns submitted sitemaps and their status.

Inspect URL

POST /api/gsc/inspect

Body: {"url": "https://example.com/page"}

Returns index coverage status, crawl info, and mobile usability for a specific URL.

Summary

GET /api/gsc/summary

Returns a high-level summary of GSC data: total clicks, impressions, average CTR, average position.

Blog performance with GSC

GET /api/gsc/blog-performance

Query params:

  • blog_url (str) — Blog base URL to filter by
  • days (int, default 28)

Returns GSC search analytics filtered to blog content, with per-post breakdowns.


Blog Management

Scrape blog posts

POST /api/blog/scrape

Body: {"url": "https://blog.example.com"}

Crawls a blog URL and imports discovered posts into the blog content library.

List blog posts

GET /api/blog/posts

Query params:

  • limit (int, default 50)

Returns scraped/imported blog posts.

Delete blog post

DELETE /api/blog/posts/{post_id}

Brand

Scrape brand assets

POST /api/brand/scrape

Body: {"domain": "example.com"}

Auto-discovers brand assets (logos, colors, fonts, social links) from a domain crawl.

Crawl target for brand

POST /api/brand/crawl-target

Body: {"url": "https://example.com/brand", "type": "brand_page"}

Crawls a specific URL to extract brand assets.

Get brand data

GET /api/brand/{org_id}

Returns discovered brand assets, colors, logos for an organization.


Medium

Publish to Medium

POST /api/medium/publish

Body: {"content_id": 42, "publish_status": "draft"}

Publishes a content item to Medium as a draft. Requires Medium integration token in settings.


Site Properties

List properties

GET /api/properties

Returns SEO site properties (domains, blog URLs) configured for auditing workflows.

Create property

POST /api/properties

Body: {"domain": "example.com", "blog_url": "https://blog.example.com", "label": "Main Site"}

Update property

PUT /api/properties/{property_id}

Body: {domain?, blog_url?, label?}

Delete property

DELETE /api/properties/{property_id}

Token Usage

Current usage

GET /api/usage

Returns API token consumption broken down by operation type.

Usage history

GET /api/usage/history

Query params:

  • days (int, default 30)
  • granularity (str) — “daily” or “hourly”

Returns token usage over time.


Activity Log

Create log entry

POST /api/log

Body: {"action": "pipeline_run", "details": {...}}

List log entries

GET /api/log

Query params:

  • limit (int, default 100)
  • action (str, optional) — Filter by action type

Returns the war room log of all platform actions.


Slack

Test Slack connection

POST /api/slack/test

Sends a test message to verify the configured Slack webhook.

Notify for content item

POST /api/slack/notify/{content_id}

Sends a Slack notification for a specific content item.

Notify content queue

POST /api/slack/notify-queue

Pushes the current content queue summary to the configured Slack channel.


Data Sources

List data sources

GET /api/datasources

Returns configured external data source connections.

Create data source

POST /api/datasources

Body:

{
  "name": "My API Source",
  "type": "rest_api",
  "config": {"base_url": "https://api.example.com", "auth_header": "Bearer ..."}
}

Types: "mcp", "rest_api"

Update data source

PUT /api/datasources/{datasource_id}

Body: {name?, config?}

Delete data source

DELETE /api/datasources/{datasource_id}

Test data source

POST /api/datasources/{datasource_id}/test

Tests connectivity to the configured data source.


Content Import

Paste import

POST /api/import/paste

Body: {"text": "Content to import...", "title": "Optional title", "channel": "blog"}

Imports pasted text as a content item.

File import

POST /api/import/file

Accepts multipart form data with a file upload. Supported formats: .txt, .md, .html, .docx.

Import templates

GET /api/import/templates

Returns available import templates for structured content import.


Company Audit

Get company audit

GET /api/company/audit

Returns the most recent company-level audit results.

Run company audit

POST /api/company/audit

Triggers a comprehensive company audit covering SEO, brand presence, and AI visibility.


Scoreboard

Org scoreboard

GET /api/scoreboard

Returns all orgs ranked by SEO score, AI citability, content activity.

Team activity scoreboard

GET /api/scoreboard/{org_id}/team-activity

Returns per-team-member activity stats (content generated, published, approved) for an organization.


Other

POST /api/hubspot/sync    — Sync to HubSpot