# SEO Article Generator with Website Context (`uduzgun/seo-article-draft-generator`) Actor

Generate review-ready SEO article drafts from a topic, website, or YouTube video. Uses website context, search intent, brand notes, metadata, FAQs, sources, internal-link suggestions, and optional featured images for blogs, SaaS, e-commerce, and service pages.

- **URL**: https://apify.com/uduzgun/seo-article-draft-generator.md
- **Developed by:** [Uygar Duzgun](https://apify.com/uduzgun) (community)
- **Categories:** Automation, SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## SEO Article Generator with Website Context

Generate SEO-ready article drafts from a topic or YouTube URL using customer website context, search intent, metadata, FAQs, and internal-link suggestions.

This is not a generic AI article writer. It uses a multi-step SEO content workflow built from practical e-commerce SEO work, where organic search is one of the most heavily invested growth channels. The workflow uses website context, target page context, source material, article structure, metadata, FAQ ideas, and internal-link opportunities before returning a review-ready draft.

This Actor calls the Uygar Content API at `/api/v1/generate`, waits for the server-sent event result, and writes one structured dataset item with the article draft and SEO metadata. Add the customer's website, target page, reference articles, brand notes, audience details, or product context to make the draft fit the business behind the article.

### Who it is for

Use this Actor when you need a strong first draft for a blog, service page, category-support article, or content brief and want the SEO structure handled before an editor reviews the piece. It is built for agencies, consultants, SaaS teams, e-commerce operators, local service businesses, and teams that publish SEO content regularly.

This is not an automatic publishing pipeline and it does not guarantee rankings. It produces a structured draft with SEO fields, source context, FAQ ideas, and internal-link suggestions so a human editor can publish faster with better inputs.

### What it does

- Turns a topic, keyword, title idea, or YouTube URL into a markdown SEO article draft.
- Uses supplied company website, target page, reference articles, brand context, audience notes, and product details when you provide them.
- Adds focus keyword, SEO keywords, meta description, FAQ, sources, and internal-link suggestions when returned by the backend.
- Can generate an optional featured image.
- Keeps raw model output out of the public dataset, while returning a usage summary with model breakdown, tokens, calls, and estimated cost.

### Use cases

- Draft blog posts for AI automation, SaaS, consulting, local service, and B2B websites.
- Turn YouTube tutorials or product videos into article drafts.
- Create Swedish or English article drafts with brand context.
- Produce a first draft with SEO metadata that an editor can review before publishing.

### What you get

Each successful run returns one article package:

- markdown article draft
- title, excerpt, focus keyword, SEO keywords, and meta description
- FAQ suggestions and source references when available
- internal-link suggestions for site owners
- optional featured image URL
- SEO score returned by the backend
- usage summary with model breakdown, input/output tokens, LLM calls, and estimated cost

### Input

- `sourceType`: `topic_research` for a topic idea or `youtube_video` for a YouTube URL.
- `sourceInput`: article topic, keyword, title idea, or YouTube URL.
- `companyWebsite`: the customer's public website for brand and offer context.
- `articleDestinationUrl`: where the article will be published, or the page/category it should support.
- `referenceUrls`: optional public customer pages or existing articles, one URL per line.
- `language`: `en` or `sv`.
- `tone`: `professional`, `conversational`, or `technical`.
- `targetWordCount`: target article length from 600 to 1600 words.
- `generateImage`: generate a featured image when enabled.
- `findYoutube`: include related YouTube tutorials when available.
- `niche` and `clientContext`: optional brand, audience, product, public-page summary, and editorial instructions.

Advanced/private inputs:

- `apiKey`: optional customer-scoped Uygar Content API key override. Leave it blank on public Store runs.

### Example inputs

Topic to article:

```json
{
  "sourceType": "topic_research",
  "sourceInput": "AI automation for small business support teams",
  "companyWebsite": "https://example.com",
  "articleDestinationUrl": "https://example.com/blog/ai-automation-support",
  "referenceUrls": "https://example.com/services\nhttps://example.com/blog/customer-support-guide",
  "niche": "AI automation consulting",
  "tone": "professional",
  "targetWordCount": 600,
  "language": "en",
  "generateImage": false,
  "findYoutube": false,
  "clientContext": "Write for founders and operations managers. The company sells practical AI automation workshops and wants direct, non-hype content."
}
````

YouTube video to article:

```json
{
  "sourceType": "youtube_video",
  "sourceInput": "https://www.youtube.com/watch?v=VIDEO_ID",
  "tone": "technical",
  "targetWordCount": 1000,
  "language": "en",
  "generateImage": true
}
```

### Output

The default dataset contains one item with:

- request ID and status
- title, excerpt, focus keyword, SEO keywords, meta description
- markdown article content
- SEO score when returned by the backend
- image URL when generated
- internal links, FAQ, sources, claim checks, YouTube tutorials, URL QA warnings
- usage summary with model breakdown, tokens, LLM calls, and estimated cost

### Limits and review

This Actor creates drafts, not legal, medical, financial, or compliance advice. Review facts, claims, and citations before publishing. Image generation and YouTube enrichment can add runtime and cost. YouTube conversion requires a public transcript or captions; videos without a usable transcript fail with a clear transcript error.

# Actor input Schema

## `apiKey` (type: `string`):

Optional advanced override. Leave blank on public Store runs; the Actor owner should configure UYGAR\_CONTENT\_API\_KEY as a secret environment variable.

## `sourceType` (type: `string`):

Use topic\_research for a topic idea or youtube\_video for a YouTube URL.

## `sourceInput` (type: `string`):

The article topic, keyword, title idea, or YouTube URL.

## `companyWebsite` (type: `string`):

The public company website to use for brand, offer, audience, and internal-link context.

## `articleDestinationUrl` (type: `string`):

Where the article will be published, or the page/category the article should support.

## `referenceUrls` (type: `string`):

Optional public customer pages or existing articles to use as context. Add one URL per line.

## `niche` (type: `string`):

Optional niche or industry context.

## `tone` (type: `string`):

Writing tone for the article draft.

## `targetWordCount` (type: `integer`):

Target article length. The backend may cap or adjust this depending on runtime constraints.

## `language` (type: `string`):

Article output language.

## `generateImage` (type: `boolean`):

Generate a featured image for the article.

## `findYoutube` (type: `boolean`):

Include related YouTube tutorials when available.

## `clientContext` (type: `string`):

Brand voice, audience, products, public-page summaries, exclusions, or editorial instructions.

## Actor input object example

```json
{
  "sourceType": "topic_research",
  "sourceInput": "Best AI tools for small business automation",
  "tone": "professional",
  "targetWordCount": 600,
  "language": "en",
  "generateImage": false,
  "findYoutube": false
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items containing the generated markdown article, SEO metadata, and usage summary.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sourceInput": "Best AI tools for small business automation"
};

// Run the Actor and wait for it to finish
const run = await client.actor("uduzgun/seo-article-draft-generator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "sourceInput": "Best AI tools for small business automation" }

# Run the Actor and wait for it to finish
run = client.actor("uduzgun/seo-article-draft-generator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sourceInput": "Best AI tools for small business automation"
}' |
apify call uduzgun/seo-article-draft-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=uduzgun/seo-article-draft-generator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SEO Article Generator with Website Context",
        "description": "Generate review-ready SEO article drafts from a topic, website, or YouTube video. Uses website context, search intent, brand notes, metadata, FAQs, sources, internal-link suggestions, and optional featured images for blogs, SaaS, e-commerce, and service pages.",
        "version": "0.1",
        "x-build-id": "7tDmm6gr35YfsYkhI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/uduzgun~seo-article-draft-generator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-uduzgun-seo-article-draft-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/uduzgun~seo-article-draft-generator/runs": {
            "post": {
                "operationId": "runs-sync-uduzgun-seo-article-draft-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/uduzgun~seo-article-draft-generator/run-sync": {
            "post": {
                "operationId": "run-sync-uduzgun-seo-article-draft-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "sourceType",
                    "sourceInput"
                ],
                "properties": {
                    "apiKey": {
                        "title": "Uygar Content API key",
                        "type": "string",
                        "description": "Optional advanced override. Leave blank on public Store runs; the Actor owner should configure UYGAR_CONTENT_API_KEY as a secret environment variable."
                    },
                    "sourceType": {
                        "title": "Source type",
                        "enum": [
                            "topic_research",
                            "youtube_video"
                        ],
                        "type": "string",
                        "description": "Use topic_research for a topic idea or youtube_video for a YouTube URL.",
                        "default": "topic_research"
                    },
                    "sourceInput": {
                        "title": "Topic or YouTube URL",
                        "type": "string",
                        "description": "The article topic, keyword, title idea, or YouTube URL.",
                        "default": "Best AI tools for small business automation"
                    },
                    "companyWebsite": {
                        "title": "Customer website",
                        "type": "string",
                        "description": "The public company website to use for brand, offer, audience, and internal-link context."
                    },
                    "articleDestinationUrl": {
                        "title": "Article destination or target URL",
                        "type": "string",
                        "description": "Where the article will be published, or the page/category the article should support."
                    },
                    "referenceUrls": {
                        "title": "Reference pages or articles",
                        "type": "string",
                        "description": "Optional public customer pages or existing articles to use as context. Add one URL per line."
                    },
                    "niche": {
                        "title": "Niche",
                        "type": "string",
                        "description": "Optional niche or industry context."
                    },
                    "tone": {
                        "title": "Tone",
                        "enum": [
                            "professional",
                            "conversational",
                            "technical"
                        ],
                        "type": "string",
                        "description": "Writing tone for the article draft.",
                        "default": "professional"
                    },
                    "targetWordCount": {
                        "title": "Target word count",
                        "minimum": 600,
                        "maximum": 1600,
                        "type": "integer",
                        "description": "Target article length. The backend may cap or adjust this depending on runtime constraints.",
                        "default": 600
                    },
                    "language": {
                        "title": "Article language",
                        "enum": [
                            "en",
                            "sv"
                        ],
                        "type": "string",
                        "description": "Article output language.",
                        "default": "en"
                    },
                    "generateImage": {
                        "title": "Generate image",
                        "type": "boolean",
                        "description": "Generate a featured image for the article.",
                        "default": false
                    },
                    "findYoutube": {
                        "title": "Find YouTube tutorials",
                        "type": "boolean",
                        "description": "Include related YouTube tutorials when available.",
                        "default": false
                    },
                    "clientContext": {
                        "title": "Brand voice and instructions",
                        "type": "string",
                        "description": "Brand voice, audience, products, public-page summaries, exclusions, or editorial instructions."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
