SEO Ultimate
Pricing
from $0.35 / keywords tracking
SEO Ultimate
All in one SEO tool & content writer/rewriter. Track keyword rankings, analyze backlinks, run competitor research, generate AI-powered content writing and content rewriting, audit PageSpeed - all with pay-per-event pricing. The only SEO tool you need.
Pricing
from $0.35 / keywords tracking
Rating
0.0
(0)
Developer

Monster Leads
Actor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
SEO Ultimate — All in One SEO Tracker & Content Writing Tool
The complete SEO tracker for agencies and developers. Track keyword rankings, analyze backlinks, run competitor research, generate AI-powered content, and audit page performance, all from a single Apify actor with Pay-Per-Event (PPE) pricing. Pay only for the SEO tools when you use them.
Whether you need a rank tracker, keywords tracking, content writing, or content rewriting, SEO Ultimate covers the full SEO workflow in one API call.
What You Can Do
| Feature | PPE Event | Price |
|---|---|---|
| Site SEO Overview (SEO Tracker) | site-seo | $0.25 |
| Related Keywords | related-keywords | $0.15 |
| Keyword Tracking & Rank Tracker | keyword-tracking | $0.35 |
| Backlinks (DataForSEO WHOIS) | backlinks | $0.15 |
| Ranked Keywords | ranked-keywords | $0.25 |
| Competitor Analysis | competitors | $0.15 |
| Keyword Ideas (Google Ads) | keyword-ideas | $0.15 |
| AI Longtail Keyword Suggestions | longtail-keywords | $0.15 |
| Performance Check (PageSpeed) | performance | $0.07 |
| AI Alt Text Generator | alt-text | $0.09/image |
| Article Ideas (up to 30 titles) | article-ideas | $0.11 |
| Content Write — Full Article | article-generate | $0.25/article |
| Content Rewrite — Article Rewrite | article-rewrite | $0.25/rewrite |
Why SEO Ultimate?
- Rank tracker — monitor Google positions across organic, paid, featured snippet, and AI overview SERPs
- Keyword tracking — track every keyword a domain ranks for with position history, difficulty, search volume, and CPC
- SEO tools in one place: backlinks, competitor gaps, keyword ideas, and PageSpeed audits
- Content write — generate SEO-optimized articles from your target keywords with AI
- Content rewrite — refresh outdated content while preserving intent and boosting keyword targeting
- Pay-Per-Event — no subscription lock-in, pay per endpoint used
Input
Required
| Field | Type | Description |
|---|---|---|
domain | string | Target domain to analyze. https://, www., and trailing paths are stripped automatically (e.g. example.com, https://www.example.com, and www.example.com/page all resolve to example.com) |
Site SEO Overview (SEO Tracker)
Get an instant SEO health snapshot. Returns the domain's organic keyword distribution, paid keyword distribution, and backlink summary in one call — the fastest way to assess a domain's overall search presence.
| Field | Type | Default | Description |
|---|---|---|---|
runSiteSeo | boolean | false | Fetch organic keywords, paid keywords, and backlink stats for the domain |
What it returns:
organic_keywords— breakdown of how many keywords the domain ranks for in each position band (pos_1throughpos_91_100), plusetv(estimated traffic value), total keywordcount, andestimated_paid_traffic_costpaid_keywords— same position-band breakdown for paid (Google Ads) keywordsbacklinks—total_domains(all referring domains),unique_domains(unique root domains),referring_pages,dofollowlinks, andtotalbacklinks
Related Keywords
Returns up to 10 related keyword suggestions for a single seed keyword — the same keywords Google shows at the bottom of a search results page under "Searches related to…". Each suggestion comes with search volume, competition, CPC, and bid range data, making it useful for expanding a topic cluster or discovering what searchers look for next.
| Field | Type | Default | Description |
|---|---|---|---|
runRelatedKeywords | boolean | false | Fetch related keyword suggestions for a seed keyword |
relatedKeyword | string | (none) | Single seed keyword to expand. Example: phone |
What it returns (relatedKeywords array):
Each item contains: keyword, search_volume, competition, competition_level, cpc, min_cpc (low top-of-page bid), max_cpc (high top-of-page bid).
Keyword Tracking & Rank Tracker
The core rank tracking and keywords tracking tool. Returns the full list of keywords the domain ranks for, with detailed SERP data per keyword — position, title, URL, rank changes, keyword difficulty, search volume, CPC, and more. Each page returns 100 keywords.
| Field | Type | Default | Description |
|---|---|---|---|
runKeywordTracking | boolean | false | Fetch ranked keywords with full SERP details |
keywordTrackingPage | integer | 1 | Page of results. Each page = 100 keywords. Page 1 = 1–100, page 2 = 101–200, etc. |
What it returns (keywords array):
Each item contains:
keyword— the keyword stringkeyword_info—search_volume,competition,competition_level,cpckeyword_properties—keyword_difficulty(0–100)ranked_serp_element—type,rank_absolute,title,url,breadcrumb,website_name,is_image,is_video,is_featured_snippet, andrank_changes(previous_rank_absolute,is_new,is_up,is_down)se_results_count— total number of Google results for this keyword
Backlinks
| Field | Type | Default | Description |
|---|---|---|---|
runBacklinks | boolean | true | Fetch backlink count, referring domains, and dofollow links |
backlinksPage | integer | 1 | Page of results. Each page = 100 domains. Page 1 = 1–100, page 2 = 101–200, etc. |
backlinksOrder | select | searchVolumeDesc | Sort order. searchVolumeDesc = highest organic traffic domains first; searchVolumeAsc = lowest first |
Ranked Keywords
| Field | Type | Default | Description |
|---|---|---|---|
runRankedKeywords | boolean | true | Fetch keywords the domain currently (or previously) ranks for on Google |
page | integer | 1 | Page of results. Each page = 100 keywords. Page 1 = 1–100, page 2 = 101–200, etc. |
type | select | organic | SERP type: organic, paid, featured_snippet, ai_overview |
liveorlost | select | live | live = currently ranking; lost = previously ranked; all = both |
minvolume | integer | 10 | Only return keywords with monthly search volume greater than this |
minposition | integer | 100 | Only return keywords ranking at position 1 up to this number |
orderby | select | desc | Sort by search volume: desc = highest first; asc = lowest first |
Competitor Analysis
| Field | Type | Default | Description |
|---|---|---|---|
runCompetitors | boolean | true | Fetch domains competing for the same keywords |
competitorsPage | integer | 1 | Page of results. Each page = 20 competitors. Page 1 = 1–20, page 2 = 21–40, etc. |
competitorType | select | organic | SERP type to base detection on: organic, paid, featured_snippet |
competitorsOrderby | select | keywordCountDesc | Sort order: keywordCountDesc = most shared keywords first (recommended); keywordCountAsc = fewest first; trafficDesc = highest traffic first; trafficAsc = lowest traffic first |
excludeDomains | string list | (none) | Specific domains to remove from results (max 20). E.g. known partners or irrelevant sites |
intersectingDomains | string list | (none) | Up to 3 known competitor domains used to improve result relevance |
Keyword Ideas
| Field | Type | Default | Description |
|---|---|---|---|
runKeywordIdeas | boolean | true | Generate keyword ideas seeded from the domain's ranked keywords. Requires runRankedKeywords |
AI Longtail Keywords
| Field | Type | Default | Description |
|---|---|---|---|
runAiKeywords | boolean | false | Generate long-tail keyword suggestions using AI (Gemini via OpenRouter) |
longtailSeeds | string | (none) | Pipe-separated seed keywords (max 10). E.g. white hat|leather jackets |
Performance Check (PageSpeed)
| Field | Type | Default | Description |
|---|---|---|---|
runPageSpeed | boolean | true | Run Google PageSpeed Insights |
pageSpeedUrl | string | https://<domain> | Full URL to test. Defaults to the domain with https:// |
pageSpeedStrategy | select | desktop | Device to test: desktop = desktop emulation; mobile = mobile emulation |
psType | string list | ["performance"] | Audit categories: performance, seo, accessibility, best_practices |
AI Alt Text
| Field | Type | Default | Description |
|---|---|---|---|
runAltText | boolean | false | Generate alt text for images using AI vision |
altTextType | select | seo | seo = keyword-rich, max 155 chars; accessibility = descriptive ("Image of ..."), max 160 chars |
keywordImportance | number | 1.0 | Only active when mainKeyword is set. Probability (0.0–1.0) that the keyword appears in output. 1.0 = always; 0.7 = 70% chance; 0.0 = never. Supports multi-word keywords |
autoKeyword | boolean | false | If true, AI may use a partial match or natural variation of the keyword instead of the exact phrase. Works with keywordImportance |
altTextProducts | array | [] | Array of image objects. Required: imageUrl. Optional: mainKeyword (keyword to include, controlled by keywordImportance + autoKeyword) |
Content Write — Article Generation
Generate SEO-optimized articles from scratch. Use your target keywords to produce fully structured content ready for publishing.
| Field | Type | Default | Description |
|---|---|---|---|
runArticleIdeas | boolean | false | Generate up to 30 article title ideas using AI |
articleKeywords | string | (none) | Pipe-separated keywords to target. Example: react tutorials|javascript for beginners |
articleTitles | string | (none) | Pipe-separated existing titles used as inspiration. AI generates new distinct titles. Example: Start with React JS|JS intro for dummies |
runArticles | boolean | false | Generate a full article. Independent of runArticleIdeas — pass articleTitle and/or mainKeyword directly |
articleTitle | string | (none) | The article title to write. If omitted, the AI generates a title from mainKeyword |
articleTitleAdjust | boolean | false | If true and articleTitle is set, AI may adjust it slightly for SEO. If false, title is used exactly as given |
mainKeyword | string | (none) | Optional. Primary SEO keyword the article is built around. If omitted, AI writes freely based on the title |
mainKeywordImportance | number | 1.0 | Keyword placement: 1.0 = first paragraph; 0.7 = first two paragraphs; 0.4 = anywhere; below 0.4 = only if natural |
mainKeywordAdjustment | boolean | false | If true, AI may use keyword variations and partial matches instead of exact phrase |
secondaryKeyword | string | (none) | Lower-importance keyword woven in 1–2 times naturally |
returnType | select | JSON | Output format: JSON = structured title/subtitle/content object; HTML = raw HTML; TEXT = plain text |
addQA | boolean | false | Append a FAQ section to each article (JSON: question/answer keys; HTML: <details>/<summary>; TEXT: Q:/A: lines) |
useTags | boolean | true | Use bold, italic, and blockquote formatting in the article |
useTable | boolean | false | Include a relevant comparison or data table in the article |
articleTone | select | informative | Writing tone for all generated articles. Options: informative, professional, casual, enthusiastic, empathetic, storytelling, humorous, authoritative, conversational |
linkText | string | (none) | Anchor text for a link to inject into the article (e.g. organic cotton t-shirts). Requires linkDestination |
linkDestination | string | (none) | Link URL — internal path (e.g. /products/organic-tshirt) or full external URL (e.g. https://example.com/page). Requires linkText |
articleStrategy | select | mix | Used when articleKeywords and articleTitles are both empty. Seeds from ranked keywords, suggested keyword ideas, or mix of both |
articleProductContext | object | (none) | Product details to reference in articles (title, description, price, url, etc.) |
shopDomain | string | (none) | Shopify store domain used in article content |
shopName | string | (none) | Store display name used in article content |
How article ideas work (runArticleIdeas)
Generates up to 30 { title, keyword, strategy } idea objects — headline suggestions and the keyword each targets. These are informational output only; they do not trigger article writing on their own.
Seeds come from one of three sources (in priority order):
- Manual —
articleKeywordsand/orarticleTitlesare provided → ideas based directly on those inputs - Auto — both are empty → seeds pulled from ranked keywords / keyword ideas using
articleStrategy
How content writing works (runArticles)
Generates a single article. Both articleTitle and mainKeyword are optional — use any combination:
| Scenario | Result |
|---|---|
articleTitle + mainKeyword | Article written with your exact title, built around your keyword |
articleTitle only | Article written with your title; AI writes freely without a keyword constraint |
mainKeyword only | AI generates a fitting title from the keyword, article built around it |
| Neither | AI generates both title and content freely (not recommended) |
Title control — articleTitleAdjust:
false(default) →articleTitleis used exactly as giventrue→ AI may tweak the title slightly for better SEO while keeping the intent
Keyword placement — mainKeywordImportance:
1.0→ must appear in the very first paragraph0.7→ within the first two paragraphs0.4→ anywhere in the body- below
0.4→ only if it fits naturally
Inline link injection — linkText + linkDestination:
When both fields are provided, the AI embeds a hyperlink naturally within the article body using your anchor text. This is a powerful SEO technique:
- Internal links (e.g.
/products/organic-tshirt,/collections/summer) — pass link juice between your own pages and improve crawlability. Point readers (and search engines) to relevant product or category pages. - External links (e.g.
https://example.com/study) — cite sources or partners to build topical authority and trust signals.
Both fields are required together — supplying only one has no effect.
Content Rewrite — Article Rewrite
Refresh existing content with a fully rewritten version. Improve SEO targeting, update tone, and eliminate duplicate phrases — without losing the original topic or intent.
| Field | Type | Default | Description |
|---|---|---|---|
runArticleRewrite | boolean | false | Rewrite an existing article. Requires articleContent |
articleContent | string | (required) | The original article body — HTML or plain text. Maximum 1200 characters; anything beyond is automatically stripped |
articleTitle | string | (none) | Optional title for the rewritten article. If omitted, the AI generates a title from the content and mainKeyword |
articleTitleAdjust | boolean | false | If true and articleTitle is set, AI may adjust it slightly for SEO |
mainKeyword | string | (none) | Optional. SEO keyword to target in the rewrite |
mainKeywordImportance | number | 1.0 | Keyword placement: same scale as article generation |
mainKeywordAdjustment | boolean | false | Allow keyword variations and partial matches |
secondaryKeyword | string | (none) | Lower-importance keyword woven in 1–2 times |
returnType | select | JSON | Output format: JSON, HTML, or TEXT |
addQA | boolean | false | Append a FAQ section |
useTags | boolean | true | Use bold, italic, and blockquote formatting |
useTable | boolean | false | Include a comparison or data table |
articleTone | select | informative | Writing tone (same options as article generation) |
linkText | string | (none) | Anchor text for an inline link to inject |
linkDestination | string | (none) | Link URL — internal path or full external URL |
How content rewrite works
runArticleRewrite takes your existing content and produces a fully rewritten version — fresh phrasing, new structure, no copied sentences — while preserving the original topic and intent. All SEO controls from article generation apply identically.
Title behaviour:
articleTitleprovided → used as-is (or adjusted for SEO ifarticleTitleAdjustistrue)articleTitleomitted → AI generates a title from the rewritten content andmainKeyword
articleContent notes:
- Accepts both HTML (e.g.
<p>…</p>) and plain text - Hard limit of 1200 characters — content beyond that is silently stripped before sending to the AI
- The rewritten output will be 600–1300 visible characters regardless of input length
Minimal example
{"domain": "example.com"}
Full example
{"domain": "example.com","runBacklinks": true,"backlinksPage": 1,"backlinksOrder": "searchVolumeDesc","runRankedKeywords": true,"page": 1,"type": "organic","liveorlost": "live","minvolume": 10,"minposition": 100,"orderby": "desc","runCompetitors": true,"competitorsPage": 1,"competitorType": "organic","competitorsOrderby": "keywordCountDesc","excludeDomains": ["amazon.com"],"intersectingDomains": ["competitor.com"],"runKeywordIdeas": true,"runAiKeywords": false,"runPageSpeed": true,"pageSpeedStrategy": "desktop","psType": ["performance", "seo"],"runArticleIdeas": false,"runArticles": false,"articleStrategy": "mix"}
Output
{"domain": "example.com","timestamp": "2025-01-01T00:00:00.000Z","siteSeo": {"organic_keywords": {"pos_1": 35658587,"pos_2_3": 32908196,"pos_4_10": 47313535,"pos_11_20": 41082282,"pos_21_30": 31014870,"pos_31_40": 26330832,"pos_41_50": 23440124,"pos_51_60": 20841011,"pos_61_70": 19548812,"pos_71_80": 18046963,"pos_81_90": 16082534,"pos_91_100": 9175823,"etv": 23900310990.23,"count": 321444096,"estimated_paid_traffic_cost": 79567794585.68},"paid_keywords": {"pos_1": 8,"pos_2_3": 1,"pos_4_10": 0,"pos_11_20": 0,"pos_21_30": 0,"pos_31_40": 0,"pos_41_50": 0,"pos_51_60": 0,"pos_61_70": 0,"pos_71_80": 0,"pos_81_90": 0,"pos_91_100": 0,"etv": 169.81,"count": 9,"estimated_paid_traffic_cost": 1027.99},"backlinks": {"total_domains": 10194664,"unique_domains": 5757246,"referring_pages": 5313948233,"dofollow": 4849266257,"total": 6520586114}},"relatedKeywords": [{ "keyword": "smartphone", "search_volume": 246000, "competition": 0.95, "competition_level": "HIGH", "cpc": 4.20, "min_cpc": 2.10, "max_cpc": 8.50 }],"keywordTracking": [{"keyword": "organic cotton shirt","keyword_info": { "search_volume": 2400, "competition": 0.45, "competition_level": "MEDIUM", "cpc": 0.85 },"keyword_properties": { "keyword_difficulty": 32 },"ranked_serp_element": {"type": "organic","rank_absolute": 3,"title": "Organic Cotton Shirts — EcoWear","url": "https://example.com/products/organic-cotton-shirt","breadcrumb": "https://example.com › products","website_name": "Example","is_image": false,"is_video": false,"is_featured_snippet": false,"rank_changes": { "previous_rank_absolute": 5, "is_new": false, "is_up": true, "is_down": false }},"se_results_count": 48000000}],"backlinks": {"referringDomains": 1200,"referringMainDomains": 850,"dofollow": 980,"total": 4500},"rankedKeywords": [{ "keyword": "organic cotton shirt", "position": 3, "searchVolume": 2400 }],"competitors": [{ "domain": "competitor.com", "avgPosition": 5, "intersections": 120 }],"keywordIdeas": [{ "keyword": "best organic shirts", "searchVolume": 880, "cpc": 0.45 }],"aiKeywords": ["sustainable cotton clothing men", "eco friendly t-shirts"],"pageSpeed": {"desktop": { "performanceScore": 92, "seoScore": 98, "lcp": 1200, "tbt": 50, "cls": 0.01 },"mobile": { "performanceScore": 65, "seoScore": 95, "lcp": 3800, "tbt": 280, "cls": 0.05 }},"altText": [],"articleIdeas": [],"articles": [],"articleRewrite": null}
API Keys
Keys are pre-configured. You can override them via input fields dataForSeoLogin, dataForSeoPassword, openRouterApiKey, pageSpeedApiKey, or via environment variables.
PPE Configuration
Each event name must be registered in the Apify Console under your actor's Monetization settings. Set the price per event there — the ppe* input fields shown in the UI are for display/documentation only.