OpenRush
SEO and competitor analysis
- Category
- Marketing
- Primary Subcategory
- SEO Rank Tracking & Keyword Research
Integration details
Description
Research keywords, analyze competitors, check search rankings, and track your own site's search traffic with cited, up-to-date data. Find keywords worth targeting, see why a competitor outranks you, audit a site for technical issues, and review your own Search Console and Analytics for clicks, sources, and positions after connecting those accounts. Useful for keyword discovery, competitor gap analysis, and monitoring traffic over time.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- SEO Rank Tracking & Keyword Research
- Secondary Subcategories
- None listed
- Brand
- OpenRush
- Access
- Account required
- First tracked
- 2026-09-16
- Tool count
- 20
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for OpenRush
Get updates when OpenRush’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT SEO Rank Tracking & Keyword Research
View Category20 tools agents can invoke
Fast, opinionated technical / content health audit across a sampled set of a domain's pages, tuned for organic-search signal over noise. Discovers URLs from the sitemap/robots (or a homepage link-crawl fallback), then samples one representative per URL template BY VALUE: money/content pages first, while enumerated low-value sections (e.g. a jobs board or event listings) get a single spot-check rather than eating the budget. Fetches the sample concurrently, then GATES OUT non-indexable pages — anything intentionally `noindex` (on a low-value page) or canonicalized to another URL is excluded from scoring instead of being reported as a problem (a noindexed job listing is working as intended). Returns: grouped `issue_clusters` (issue + severity + affected page count + which page roles + a fix), a ranked `recommendations` list weighted by the *value* of the pages affected, an `onpage_score`, and cross-page duplicate-title/description checks. Full per-page rows — including excluded pages and why — are linked via `resources` (fetch with export_dataset). Runs in seconds. - `max_pages` (default 10, max 20): how many sampled pages to audit. Key fields: `page_class_summary` (sampled pages by role: core/content/ utility/ephemeral), `pages_excluded` + `excluded_summary` (non-indexable pages skipped, by reason), and `worst_page` (the highest-value page with the most issues — the best drill-down target). Each cluster/recommendation carries `page_classes` so you can tell whether a finding hits money pages or just utility ones. Scope: this reads each page's raw HTML — it does NOT execute JavaScript or measure Core Web Vitals. `render_warning: true` means ≥1 audited page looks client-rendered (its raw HTML is near-empty), so its content checks are low-confidence. Also read `coverage` (audited vs discovered), `discovery_source` (a `homepage_fallback` means no sitemap was found), and `fetch_failures` (pages that didn't respond in time). To confirm which findings hit pages that actually earn search traffic, follow the `inspect_domain` / `inspect_page` next_actions. Only audit a domain the user owns or operates. If ownership isn't already clear from the conversation, confirm with the user before calling this tool.
audit_site
THE backlink gap / link intersect, done server-side in ONE call: referring domains that link to several of a client's competitors, ranked by how many competitors link them, spam- and authority-filtered, with the ones the client already earned flagged. This replaces the hand-run recipe (pull each competitor's referring domains, union thousands of rows, dedupe against the client, enrich for true authority, filter, sort) — all of which used to run in the agent's context. Here it is one call and a compact, report-ready result. How it works: ranks the competitors by true authority, fans out referring-domain pulls to the strongest of them (the top-N recover essentially the full intersect), unions and counts the overlap, attaches TRUE domain authority + spam via the bulk endpoint (the row-level rank on a referring row is page-level and must not be trusted), drops spam ≥ `max_spam` and authority < `min_authority`, flags each row `earned` (client already links from it) or a fresh gap, and sorts by (competitor_count desc, authority desc). Fan-out and per-competitor depth are handled for you — there are no knobs for them. Read `data.summary` for the funnel (union → candidates → after-filter → gap/earned) and per-competitor coverage, and `coverage.scope_note` for what was and wasn't covered. `data.gap` holds the top `limit` rows; `resources` holds the FULL ranked list — fetch it with export_dataset, don't re-run per-competitor pulls. A short list is a good result: if the client already owns the strong domains, that shows up as earned=true, not as junk padding. First get a real competitor set from discover_competitors (seed_keywords mode for a specific vertical); passing domain-similarity giants produces a meaningless gap.
compare_backlink_gap
Keyword gap analysis: terms one or more competitors (1-5 domains) rank for that `domain` does not, plus terms where the target is losing ground. Use after discover_competitors to turn a competitor set into a concrete content/keyword target list. Results group into intent clusters so the agent can prioritize. Both target and competitors must be reasonably indexed for the gap set to be meaningful — see `coverage`.
compare_keyword_coverage
START HERE. List the live OpenRush surface: enabled data domains, the tools in each, the fact types every tool can emit, which sources back them (live SERP, search index, backlinks, owned Search Console/Analytics/Ads), and which tools need an owned-data connection. Use this to discover what's available before assuming a tool exists. Returns the standard OFE envelope; the tool list is in `data.tools`.
describe_capabilities
Which domains AI cites on a category — the map of where to earn a mention, and who AI cites instead of you. Provide `topic` (a real category keyword) or `domain`, and if both are given `topic` wins. Prefer `topic` whenever you know the brand's real category: pass the category as `topic` (and the brand as `domain` if you also want its standing). Fall back to `domain` alone only when the category is unknown — the tool then derives it from the domain's top ranking keywords, which is reliable for an established site but can pick a tangential term for a thin or new site that barely ranks (e.g. a website-migration brand whose top keyword is "migrate ai", an AI/cloud term). When that happens the result is labeled `data.category_confidence: "derived_weak"` and carries a next-action asking you to supply the real category as `topic`; re-run with an explicit `topic` for an accurate map. Coverage is Google AI Overview only (the deep, independently validated surface); this does NOT cover ChatGPT, Claude, Gemini, Perplexity, or CoPilot. The metric is "this domain cited as a source", not "brand discussed". Results are domain-anchored, never brand-name matched. A scattered or tagline-like input returns a low-signal `data_freshness` note instead of junk rows, and "AI search volume" is never surfaced. Use this even when a brand has zero AI presence: it shows where its category is cited so it knows where to earn placement. `next_actions` point to inspect_ai_visibility to see where a domain stands among these sources.
discover_ai_citations
Find organic competitors. Provide exactly one of `domain` or `seed_keywords`. - domain mode: competitors by keyword overlap with the target's indexed set. Broad, but unreliable for new/small sites because the search index lags the live SERP — the response flags this with a `data_freshness` fact. - seed_keywords mode (1-20 queries): aggregates who consistently ranks across those queries by hitting the live SERP database directly. Needs the SEEDS indexed in that market, not the target — returns empty, with a reason, when they are not. Prefer it when domain mode came back thin; read `coverage`.
discover_competitors
Fetch the full rows behind a dataset `uri` that another tool returned in its `resources` block (results too large to inline). Pass the uri verbatim; do not construct one yourself. Datasets are retained for a limited window and may be dropped sooner under load, so a valid uri can come back empty. That is not an error: when it happens the response has `data.available = false` with a `note`, and `next_actions` contains the tool to re-run to regenerate the dataset. Follow that action, then export the fresh uri from the new `resources` block.
export_dataset
Measured, normalized ad performance (spend, impressions, clicks, CTR, CPC, CPM, conversions, conversion value, cost/conversion, conversion rate, ROAS) for one of the user's OWN connected ad accounts — Google Ads today, more ad platforms later — straight from the platform, not a modeled estimate. THE single tool for every ad platform: ask once, and OpenRush handles which platforms are connected. `platform` and `ad_account` are optional: omit both and the single connected platform + activated account are auto-selected. Several connected platforms return `platform_required`; several activated accounts return `account_required`; nothing connected/activated returns `connection_required` (set up in the dashboard). One platform per call — `next_actions` point to any other connected platform and to deeper slices. - `report`: overview (default: account totals + top campaigns + daily trend + Google network split) | campaign | ad_group | asset_group | ad | date | device | network | keyword | search_term (the last three Google-only). Use asset_group for Performance Max campaigns — they have no ad_group/ad rows; their creative unit is the asset group. Every other type (Search, Shopping, Demand Gen, Video, Display) has ad groups and ads. next_actions route to the right drilldown per campaign type, and to both on a mixed account. - `group_by`: the lower-level equivalent of `report` (one dimension) - `period`: last_7_days | last_28_days (default) | last_3_months | last_6_months | last_12_months - `compare_to`: previous_period (default) | previous_year | none Every monetary value carries its currency and is NEVER converted; every conversion/ROAS number carries its attribution basis. Windows are in the account's own time zone; the most recent ~1-2 days are preliminary. Ad clicks are PAID clicks — not GA4 sessions and not Search Console clicks. Read-only: no campaign, budget, or bid changes.
get_ad_performance
Measured Google Search performance (clicks, impressions, CTR, impression-weighted position) for one of the user's OWN websites, straight from their connected Search Console — not a modeled estimate. `website_id` and `domain` are optional, interchangeable selectors: omit both and the single connected website is auto-selected. If the account has several connected websites the call returns a `website_required` error listing safe options in `data.options` — retry with one `website_id`. If nothing is connected yet it returns `connection_required`/`binding_required` (set up in the dashboard). - `period`: last_7_days | last_28_days (default) | last_3_months | last_6_months | last_12_months | last_16_months - `compare_to`: previous_period (default) | previous_year | none - `group_by`: any of page | query | date | device | country (omit for the site total; page + query is allowed but bounded) - `search_type`: web (default) | image | video | news | discover The most recent ~3 days are labeled preliminary; GSC reports search performance, which is not the same as total website traffic.
get_search_performance
Measured website analytics (sessions, users, engaged sessions, engagement rate, average engagement time, page views, bounce rate) for one of the user's OWN websites, straight from their connected Google Analytics (GA4) property — not a modeled estimate. `website_id` and `domain` are optional, interchangeable selectors: omit both and the single connected website is auto-selected. If the account has several connected websites the call returns a `website_required` error listing safe options in `data.options` — retry with one `website_id`. If nothing is connected yet it returns `connection_required`/`binding_required` (set up in the dashboard). - `report`: overview (default, a rich summary: site totals + top channels + top landing pages + a daily trend) | channel | source_medium | campaign | landing_page | country | device | date - `group_by`: the lower-level equivalent of `report` (one dimension) - `period`: last_7_days | last_28_days (default) | last_3_months | last_6_months | last_12_months - `compare_to`: previous_period (default) | previous_year | none Windows are computed in the property's own reporting timezone. The most recent ~1-2 days are labeled preliminary. Sessions are visits, not users, and are not the same as Search Console clicks. This is the universal traffic/attribution/engagement tool: it deliberately reports NO conversions, revenue, or custom events.
get_website_analytics
How a domain shows up in AI answers — its citation count, alone or against named competitor DOMAINS (up to 9), with the gap. Always domain-anchored: pass domains, never brand names (a brand name matches thousands of unrelated answers; a domain is an exact entity). Coverage is Google AI Overview only; this does NOT cover ChatGPT, Claude, Gemini, Perplexity, or CoPilot. The number is "your domain cited as a source", not "how often AI talks about you", and it is a sampled corpus observation, not what any one user sees. AI answers are non-deterministic, so treat movement as directional. A zero is a first-class answer, not an error: a domain AI has not cited yet returns a `brand_mentions` fact with `mentions: 0` plus a `next_actions` pointer to discover_ai_citations (where to earn a mention). Comparing more competitors costs no more — they are batched into one call. Call it solo (no competitors) to also get `data.sample_answers` — real questions where the domain is cited, with the sources cited alongside it. With competitors you get the ranked comparison and share-of-citations gap instead (no sample answers).
inspect_ai_visibility
One domain's link profile, deep. Lean per `view`: ask for only the slices you need. `view` is any subset of (default is just `authority`): - "authority": the headline summary — domain_rank (0-1000, higher = stronger), referring-domain count, total backlinks, dofollow ratio, spam score. The cheap call for judging how established a site is. - "referring_domains": a deep, paginated list of the domains that link to the target. Its row-level rank is PAGE-level, not true domain authority, so don't rank or filter on it directly. Use `limit` (up to 1000) and `offset` to page. For a competitor link-gap, don't page and union these lists yourself — call compare_backlink_gap, which does the union/rank/filter server-side. - "anchors": the anchor-text distribution. - "backlinks": individual links (from-url, anchor, dofollow, first_seen, lost_date). Use `status="lost"` to find lost links to reclaim, and the full list for disavow review. Set `domain_from` to a single source domain to see exactly where and how it links to the target (source-page URL + anchor) — the drill-down after a compare_backlink_gap row. `status` ("live" default | "lost" | "new") and `since` (ISO date; only links new/lost on/after it) apply to the referring_domains and backlinks views for velocity and reclaim work. Backed by the cross-engine backlinks index, so this works even when the organic search-index tools are thin. For a competitor link-gap, `next_actions` point at compare_backlink_gap (server-side join), not a hand-run union.
inspect_backlinks
Starting map for any domain: top organic keywords, top pages, estimated traffic, dominant search intents, and likely competitors in one call. Use this first when handed a bare domain. The `next_actions` typically point to inspect_page (for a winning URL), research_keywords (around a theme), or discover_competitors. Backed by the search index, so a brand-new or barely-indexed domain may return thin `data` — check `coverage` before concluding a site ranks for nothing. If `data.result_status` is `partial`, check `data.section_status`: unavailable sections are unknown, not empty.
inspect_domain
Full detail on a single keyword: monthly volume, CPC, competition level, intent, 12-month trend, the current top SERP, and which SERP features it triggers. Use to validate or deep-dive one term surfaced by research_keywords or a gap analysis before committing to it.
inspect_keyword
Full detail on a single page (exact URL): how many organic keywords it ranks for, estimated monthly traffic, and the top terms driving that traffic. Use to understand why a specific competitor URL wins, or to profile one of your own pages surfaced by inspect_domain's top_pages.
inspect_page
Live SERP snapshot for one query: ranked organic results plus which SERP features are present (AI overview, featured snippet, local pack, paid, people-also-ask, related searches). Use to see who actually ranks right now and what the result page looks like before targeting a query. `depth` (10-100) is how many organic results to pull; raise it only when you need the long tail. Reflects Google today, not the index.
inspect_serp
Where `domain` ranks across a specific keyword set (1-100 keywords), with a position summary. mode controls the data backend: - "auto" (default): search-index lookup, auto-falling back to live SERPs when the target is underindexed. Best signal-to-noise for any-size domain. - "index": search index only. Fastest; reports unranked for new domains. - "live": one live SERP fetch per keyword — slowest and most expensive (one billed query per keyword, capped at 10 per call); always reflects today's Google. Use when "auto"/"index" look stale for a new site. Prefer "auto", which already falls back to live when the target is underindexed. This is a point-in-time read of current positions.
inspect_search_visibility
List the owned-data this account has connected. Two sibling sections, because the products are addressed differently: `data.websites` — the website-addressed products (Search Console, GA4). Each website reports its per-product state under `connections`: - `search_console`: connected | reconnect_required | not_connected - `website_analytics`: connected | reconnect_required | not_connected `search_console` connected means get_search_performance can return data for that website; `website_analytics` connected means get_website_analytics can. `data.ad_accounts` — the account-addressed ad platforms (Google Ads now, more later). Ads are NOT website-addressed: the ad account is the unit, so this is a flat list independent of `websites`, each row carrying `platform`, the opaque `ad_account` id (pass it back to get_ad_performance), `name`, `currency`, `customer_id_display`, and `connection_status`. Only ACTIVATED accounts appear — the ones get_ad_performance can actually query. (A website may separately show an `ad_platform` key under its `connections` only when the user made the OPTIONAL website↔account association; that key is NOT the way to tell whether ads are connected — use `data.ad_accounts` for that.) An account that has connected nothing at all returns EMPTY `websites` and `ad_accounts` with `data.connection_required: true`. Do not invent a website or ad account in that case; tell the user a connection is required. You usually do NOT need to call this first: get_search_performance, get_website_analytics, and get_ad_performance auto-select when the account has exactly one eligible target. Call this when the user asks what's connected, wants to switch target, or an owned-data tool returned a `website_required` / `account_required` error — then retry that tool with a `website_id` from `data.websites` or an `ad_account` from `data.ad_accounts`.
list_connections
List the owned-data this account has connected. Two sibling sections, because the products are addressed differently: `data.websites` — the website-addressed products (Search Console, GA4). Each website reports its per-product state under `connections`: - `search_console`: connected | reconnect_required | not_connected - `website_analytics`: connected | reconnect_required | not_connected `search_console` connected means get_search_performance can return data for that website; `website_analytics` connected means get_website_analytics can. `data.ad_accounts` — the account-addressed ad platforms (Google Ads now, more later). Ads are NOT website-addressed: the ad account is the unit, so this is a flat list independent of `websites`, each row carrying `platform`, the opaque `ad_account` id (pass it back to get_ad_performance), `name`, `currency`, `customer_id_display`, and `connection_status`. Only ACTIVATED accounts appear — the ones get_ad_performance can actually query. (A website may separately show an `ad_platform` key under its `connections` only when the user made the OPTIONAL website↔account association; that key is NOT the way to tell whether ads are connected — use `data.ad_accounts` for that.) An account that has connected nothing at all returns EMPTY `websites` and `ad_accounts` with `data.connection_required: true`. Do not invent a website or ad account in that case; tell the user a connection is required. You usually do NOT need to call this first: get_search_performance, get_website_analytics, and get_ad_performance auto-select when the account has exactly one eligible target. Call this when the user asks what's connected, wants to switch target, or an owned-data tool returned a `website_required` / `account_required` error — then retry that tool with a `website_id` from `data.websites` or an `ad_account` from `data.ad_accounts`.
list_websites
Expand a seed term into a ranked demand list (volume, CPC, competition, intent per keyword). mode: - "ideas" (default): broad, category-level expansion. Best for mapping a topic. - "suggestions": autocomplete-style long-tail off the exact seed. - "related": semantically adjacent terms. Optional filters: `min_volume` drops low-demand noise; `intent` restricts to one of informational | navigational | commercial | transactional.
research_keywords
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are OpenRush alternatives on ChatGPT?
As of 2026-09-29, OpenRush competes with Able SEO by VibeSEO, AccuRanker Search Intelligence, Advanced Web Ranking, Ahrefs, Appskyline, Frase, Grow My Website, GSC SEO & Content Planner, GSC Wizard, Keyword Tool Pro, Keyword Tool: Free SEO Ideas, Keyword.com, PagePulse, SE Ranking, Semji, Semrush, SEO with Distribb, SEOcrawl AI, Serpstat, Sextaris, SignalSumo, SiteGuru, Ubersuggest, vidIQ, Windsor.ai Search Console, Writrex SEO, ラッコキーワード in ChatGPT SEO Rank Tracking & Keyword Research, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.