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 alllimit(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
Recommended sources
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.
Link GitHub profile
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.
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 bydays(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