Analyze URLs and competitors
Run deep competitive briefs on cited sources and competitor pages, then poll, list, refresh, and delete them.
Produce a deep, structured brief for any URL — a cited source, a competitor page, or a page you want to outperform. Pendium scrapes the page, runs SERP and competitive analysis, and returns topic coverage, content-structure patterns, gaps, and writer guidance. This job also covers reading, listing, refreshing, and deleting those analyzed URLs (bookmarks).
When to use
- Reach for this when you have a specific URL to understand or beat — often a source from
get_cited_sources, a competitor page, or a page ranking for a keyword you want. - Analysis and refresh use LLM credits and require a Starter or Pro plan.
- Analysis is async:
analyze_urlreturns abriefIdyou poll withget_analyzed_urluntilstatus: completed.
Typical sequence
analyze_url— kick off the brief for a URL. Returns abriefId.get_analyzed_url— poll every 15–30s untilstatus: "completed".list_analyzed_urls— find existingbriefIds and understand the content pipeline.refresh_analyzed_url— re-run the analysis for an existing brief when the page has changed.delete_analyzed_url— permanently remove a brief and its analysis from the agent's knowledge.
Tools
analyze_url
Analyze a URL and generate a deep brief: scrapes the page, runs SERP analysis for the target keyword, analyzes competing pages, and produces a structured brief with topic coverage, content-structure patterns, competitive gaps, and writer guidance.
Authentication: Paid (Starter or Pro — uses LLM credits for scraping and analysis). An account in read-only mode can't analyze a URL (LLM spend) — the tool errors with a read-only message.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to create the brief for. Grounds the analysis in this brand's context. |
sourceUrl | string (URL) | Yes | The URL to analyze — a cited source, competitor page, or any URL. |
Async. Returns briefId, status, and reused. Calling the tool twice on the same agent + URL returns the existing brief instead of re-billing. Poll get_analyzed_url with the briefId (typically 30–60 seconds).
get_analyzed_url
Get the status and data for an analyzed URL created by analyze_url. Poll every 15–30s until status is completed. Once complete, returns the full analysis with topic coverage, content structure, competitive analysis, and writer guidance.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID the brief belongs to. |
briefId | string (uuid) | Yes | The analyzed-URL ID returned by analyze_url. |
Status progression: pending → scraping → searching → analyzing → gap_analysis → completed (or failed). Returns the brief's status, keyword, sourceUrl, and timestamps; once completed, also the full analysis and gapAnalysis objects. Use list_analyzed_urls to find brief IDs.
refresh_analyzed_url
Re-run the analysis for an existing analyzed URL: re-scrapes the page, re-runs SERP and competitive analysis, and refreshes the brief.
Authentication: Paid (Starter or Pro — re-analysis uses LLM credits, same as analyze_url).
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent the analyzed URL belongs to. |
briefId | string (uuid) | Yes | The analyzed-URL id to refresh (the briefId from list_analyzed_urls). |
Async. Returns immediately with status: "queued" when a fresh re-analysis started, or status: "already_in_flight" when one was already running (a no-op). Poll get_analyzed_url after a minute or two.
Note: Refresh updates the brief itself. If this URL was already embedded into the knowledge base, its embedded summary (what
query_knowledgesearches) is not re-embedded by a refresh — that content can stay as it was at first analysis. This matches the web app's refresh behavior.
delete_analyzed_url
Permanently remove an analyzed URL — a bookmark — and its deep analysis from the agent's knowledge. Destructive and irreversible. Anyone with access to the agent, including shared team members, can delete one.
Authentication: Required
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent the analyzed URL belongs to. |
briefId | string (uuid) | Yes | The analyzed-URL id to delete (the briefId from list_analyzed_urls). |
Returns success: true with syntheticId and deletedBriefId.
list_analyzed_urls
List analyzed URLs for a brand — structured content plans with goals, key messages, creative direction, and strategic guidance. Use it to understand the content pipeline and avoid duplicating planned work, and to find briefIds for the tools above.
Authentication: Required
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
syntheticId | integer | Yes | — | The agent ID to list analyzed URLs for. |
limit | integer (1–50) | No | 20 | Number of briefs to return. |
Returns briefCount and a briefs array. Key per-brief fields: title (working title), goal (strategic goal), seedIdea (original idea), postConcept (detailed concept), creativeDirection (format/style guidance), keyMessage (core message), and status ("planned", "in_progress", "completed", etc.).