# Content Outline Generator — Frase Alternative (`khadinakbar/frase-alternative`) Actor

Generate a source-linked content outline from a search keyword. Analyze current Google results and public page headings to collect recurring topics, questions, and outline sections for a writer's research brief.

- **URL**: https://apify.com/khadinakbar/frase-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, MCP servers, AI
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $300.00 / 1,000 source-linked content outline briefs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Content Outline Generator — Frase Alternative

Generate a source-linked content outline from a search keyword. Analyze current Google results and public page headings to collect recurring topics, questions, and outline sections for a writer's research brief. For content strategists, the dataset returns a research brief that links its outline, topics, and questions to observed search sources.

### Workflow: put the results to work

Choose one target keyword, language, and search market. Compare the topics and headings found on ranking pages, then give the outline and source links to a writer. The output supports research and planning; the writer still develops the article and checks its claims.

### Best fit

- Give a writer a fresh, source-linked outline before drafting.
- Let an agent research one topic and save structured output to a dataset.
- Compare headings on current organic results without copying article text.
- Keep the research step bounded: one Google SERP and at most eight public HTML
  pages per run.

### How it compares with Frase

| Need           | This Actor                                                            | Frase                                                          |
| -------------- | --------------------------------------------------------------------- | -------------------------------------------------------------- |
| Research unit  | One query → current organic pages → JSON brief                        | Subscription workspace for research, writing, and optimization |
| Main result    | Heading-based outline with source ranks and URLs                      | A finished content workflow, including drafting tools          |
| Evidence       | Source pages, collection time, sampled headings, and PARTIAL warnings | Product workflow and editor context                            |
| Automation     | Run by API or an Apify task; consume dataset records                  | Browser workspace, integrations, and CMS publishing features   |
| What it avoids | No score, rank promise, CMS write, or article generation              | Those suite features are part of the broader Frase product     |

Frase describes its workflow as producing a finished draft rather than merely
an outline, and its plans include additional suite features. This Actor stays
smaller and easier to integrate by returning only the research and planning
layer. See [Frase pricing and plan features](https://www.frase.io/pricing).

### Input

```json
{
    "keyword": "best project management software",
    "locationName": "United States",
    "languageCode": "en",
    "maxCompetitorPages": 5,
    "responseFormat": "concise"
}
```

`keyword` is required. `maxCompetitorPages` is an integer from 3 to 8. Use
`detailed` only when you want a larger heading sample per page. The Actor uses
owner-managed DataForSEO credentials; do not put API keys, logins, or passwords
in task input.

### Output

Each successful or partial brief becomes one dataset record:

```json
{
    "keyword": "best project management software",
    "sourcePagesRequested": 5,
    "sourcePagesAnalyzed": 4,
    "sourcePages": [
        {
            "rank": 1,
            "url": "https://example.com/project-management-guide",
            "domain": "example.com",
            "pageTitle": "Project management software guide",
            "wordCount": 1840,
            "headingSample": [{ "level": "H2", "text": "How to choose a tool" }]
        }
    ],
    "recommendedOutline": [
        {
            "level": "H1",
            "heading": "best project management software",
            "observedOnPages": 0,
            "sourcePageRanks": []
        },
        {
            "level": "H2",
            "heading": "How to choose a tool",
            "observedOnPages": 3,
            "sourcePageRanks": [1, 2, 4]
        }
    ],
    "coverageTopics": [
        {
            "topic": "How to choose a tool",
            "observedOnPages": 3,
            "sourcePageRanks": [1, 2, 4]
        }
    ],
    "researchQuestions": ["How to choose a tool"],
    "contentSignals": {
        "basis": "Observed public HTML headings, titles, and word counts from current Google organic result pages. These signals are descriptive context, not ranking targets or a proprietary content score."
    },
    "source": "google_organic_serp_and_public_html",
    "fetchedAt": "2026-09-07T12:00:00.000Z",
    "warnings": ["1 selected public page was unavailable, non-HTML, oversized, or outside the safe-fetch boundary."],
    "status": "PARTIAL"
}
```

`COMPLETE` means every selected source page was analyzed. `PARTIAL` preserves a
usable brief when a source page is unavailable, non-HTML, oversized, or rejected
by the safe-fetch boundary. A run with no eligible SERP pages—or no safely
analyzable selected page—returns `VALID_EMPTY` in `OUTPUT`; it does not invent
an outline.

### Run through the API

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~frase-alternative/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "best project management software",
    "locationName": "United States",
    "languageCode": "en",
    "maxCompetitorPages": 5,
    "responseFormat": "concise"
  }'
```

For an agent workflow, ask your Apify-connected assistant: “Run the Frase
Alternative actor for `best project management software` in the United States,
then use the returned source-linked outline as a research brief. Do not treat
observed heading frequency as a ranking requirement.”

### Responsible use

This Actor follows a bounded public-page research path. It validates URLs and
DNS results, follows at most three safe redirects, rejects private-network
destinations, limits HTML size and fetch time, and stores concise heading
observations rather than reproducing source articles. Respect each source site’s
terms and robots policy, and use the output as research input—not a claim that a
specific outline will rank. Transient fetch failures receive one bounded retry;
the Actor does not bypass a source's restrictions.

### Builder notes

The output contract is intentionally stable for automation: a dataset record is
written only after a source-linked brief validates, while `OUTPUT` and
`RUN_SUMMARY` report clear `COMPLETE`, `PARTIAL`, `VALID_EMPTY`,
`INVALID_INPUT`, `CONFIG_ERROR`, or `UPSTREAM_FAILED` outcomes. The Actor
currently supports one query per run so each result remains attributable to one
SERP snapshot.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/frase-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `serp-request` | Google SERP request | Charged once after a successful current Google organic SERP request used for the brief. |
| `content-outline-brief` | Source-linked content outline brief | Charged once for each validated heading-based content outline persisted to the dataset. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Independent alternative

This Actor provides the specific workflow described above. It is not affiliated with or endorsed by Frase; the named product and its trademarks belong to their respective owners.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

#### Example agent request

> Generate a source-linked content outline from a search keyword. Use the inputs I supply, confirm the result limit, and return the available results with their source context and any partial or missing-data outcome.

# Actor input Schema

## `keyword` (type: `string`):

Use this for the one topic or query the outline should research, for example ‘best project management software’. Enter 2–200 ordinary query characters. This is required and has no default. It is not a URL, a finished article, or a provider credential.

## `locationName` (type: `string`):

Use this to choose the Google market for the research, for example ‘United States’ or ‘United Kingdom’. Enter a country or supported geographic location name. It defaults to United States. It is not a postal address or a target website location.

## `languageCode` (type: `string`):

Use this for the Google result language, for example ‘en’, ‘de’, or ‘es’. Enter a two-to-five letter language code. It defaults to en. It is not a full locale such as en-US or a writing-tone setting.

## `maxCompetitorPages` (type: `integer`):

Use this to bound how many distinct top organic pages the Actor reads for headings. Enter an integer from 3 to 8. It defaults to 5 and sets the maximum public-page fetches. It is not a Google rank target or a guarantee that every page is reachable.

## `responseFormat` (type: `string`):

Use concise for a compact outline that fits easily into an agent workflow, or detailed to retain more sampled headings per page. Choose ‘concise’ or ‘detailed’. It defaults to concise. It is not a request to generate a full article or reproduce competitor text.

## Actor input object example

```json
{
  "keyword": "best project management software",
  "locationName": "United States",
  "languageCode": "en",
  "maxCompetitorPages": 5,
  "responseFormat": "concise"
}
```

# Actor output Schema

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

Structured current-SERP research briefs with source pages, outline sections, questions, and collection time.

## `summary` (type: `string`):

Compact terminal OUTPUT record.

## `runSummary` (type: `string`):

Detailed RUN\_SUMMARY with source-page and charge diagnostics.

# 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 = {
    "keyword": "best project management software",
    "locationName": "United States",
    "languageCode": "en",
    "maxCompetitorPages": 5,
    "responseFormat": "concise"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/frase-alternative").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 = {
    "keyword": "best project management software",
    "locationName": "United States",
    "languageCode": "en",
    "maxCompetitorPages": 5,
    "responseFormat": "concise",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/frase-alternative").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keyword": "best project management software",
  "locationName": "United States",
  "languageCode": "en",
  "maxCompetitorPages": 5,
  "responseFormat": "concise"
}' |
apify call khadinakbar/frase-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/frase-alternative"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vlzbhItS2bggZGEnB/builds/QTbSVL2xIrOehcRJa/openapi.json
