Rowfeed Search & Market Data
Server Details
ChatGPT visibility, SERP, Maps, reviews, traffic, backlinks, tech stack, PDF tables, Amazon, jobs, Trends.
- Status
- Healthy
- Uptime
- 77.4% over 25 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- kristerkb-pixel/rowfeed-seo-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 44 tools
Most tools map to distinct data sources (Amazon, Tripadvisor, YouTube, backlinks, etc.) with clearly different outputs. A few overlaps exist within the SEO/Google cluster—e.g. google-serp-api, google-ai-overview-tracker, and ai-search-visibility-tracker, or keyword-generator vs keyword-search-volume vs competitor-keywords—where an agent could hesitate, but descriptions help disambiguate.
All names are kebab-case and the 40 actor tools uniformly use the `rowfeed--<actor>` prefix, which is predictable. The four infrastructure tools use a verb_noun style (abort-actor-run, get-actor-run) that slightly differs from the noun-phrase actor tools, but both conventions are internally consistent.
44 tools is heavy and pushes against the recommended 3-15 range, making selection and discovery burdensome for an agent. Each tool does wrap a distinct data source so they largely earn their place, but the catalog is over-scoped for a single MCP surface.
The data-source surface is broad and covers many research/SEO/market workflows from search to scraping to export. Supporting plumbing exists (abort run, get run, get dataset items, get KV record) but there's no actor-listing or dataset-metadata tool, leaving minor gaps for orchestration.
Available Tools
44 toolsabort-actor-runAbort Actor runADestructiveIdempotentInspect
Abort an Actor run that is currently starting or running. For runs with status SUCCEEDED, FAILED, ABORTING, ABORTED, or TIMED-OUT, this call has no effect. The results will include the updated run details after the abort request.
USAGE:
Use when you need to stop a run that is taking too long or misconfigured.
USAGE EXAMPLES:
user_input: Abort run y2h7sK3Wc
user_input: Gracefully abort run y2h7sK3Wc
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run to abort. | |
| gracefully | No | If true, the Actor run will abort gracefully with a 30-second timeout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the no-effect-on-terminal-states rule, which is exactly what makes the idempotent hint meaningful, plus the fact that updated run details come back. It omits auth/permission requirements and any rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the state constraint, and every prose sentence earns its place. The 'USAGE EXAMPLES' block of raw user_input lines is mostly decorative and pads the definition slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description still notes that updated run details are returned. For a two-parameter mutation with full annotation coverage, only auth requirements are unaddressed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the 30-second graceful-abort timeout are already documented in the schema. The description only gestures at 'gracefully' via an example, adding no syntax or semantic meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Abort) plus resource (Actor run) and a state qualifier ('currently starting or running'), which immediately distinguishes it from siblings like call-actor and get-actor-run. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('stop a run that is taking too long or misconfigured') and an explicit no-op condition (terminal statuses such as SUCCEEDED, FAILED, ABORTED, TIMED-OUT). It does not name an alternative tool or describe prerequisites, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-actor-runGet Actor runARead-onlyIdempotentInspect
Get detailed information about a specific Actor run.
Returns run result: status, storages (datasets/keyValueStores alias map), stats, summary, nextStep.
summary describes the past (e.g. "SUCCEEDED in 22s. 47 items; 3 fields available.").
nextStep prescribes one primary follow-up action with identifiers interpolated (e.g. "Use get-dataset-items with datasetId=...").
waitSecs (0–45, default 30) waits up to that many seconds for terminal status before returning.
USAGE:
Use to check the status of a run started by any Actor-running tool.
Pass waitSecs > 0 to block until terminal (or until the cap elapses).
USAGE EXAMPLES:
user_input: Show details of run y2h7sK3Wc
user_input: Wait for run y2h7sK3Wc to finish
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run. | |
| waitSecs | No | Maximum seconds to wait for the run to reach a terminal state (SUCCEEDED, FAILED, ABORTED, TIMED-OUT). 0 returns immediately with the current status. Cap: 45. Default: 30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, but the description adds real behavioral context beyond them: the summary vs. nextStep semantics, and that waitSecs blocks for up to 45s (default 30) before returning the current state. This is substantive added value, though it doesn't cover error/failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then segmented into Returns/USAGE/EXAMPLES blocks. Every line carries information, though the two usage examples are somewhat redundant with the USAGE prose, adding minor length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need only orient the agent, which it does fully: purpose, when to use, wait semantics, and concrete invocation examples. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by framing waitSecs as a blocking/wait mechanism with its cap and default, and by describing what runId's run produces. Slight above-baseline value over the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed information about a specific Actor run') and enumerates the returned result fields (status, storages, stats, summary, nextStep). It does not explicitly distinguish itself from siblings like call-actor or abort-actor-run, so it falls just short of the 5 benchmark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USAGE block names the condition ('check the status of a run started by any Actor-running tool') and explains when to pass waitSecs > 0 to block until terminal. It gives clear context but stops short of explicit exclusions or naming the sibling to use for other run operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-dataset-itemsGet dataset itemsARead-onlyIdempotentInspect
Get items (rows) from a dataset — the output/results produced by an Actor run. Returns the rows themselves, not dataset metadata, counts, or a schema. When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly. Default limit is 20. Use clean=true to skip empty items and hidden fields.
USAGE:
Use when you need to read data from a dataset (all items or only selected fields).
USAGE EXAMPLES:
user_input: Retrieve results from dataset abc123
user_input: Get only metadata.url and title from dataset username~my-dataset
| Name | Required | Description | Default |
|---|---|---|---|
| desc | No | If true, results are returned in reverse order (newest to oldest). | |
| omit | No | Comma-separated list of fields to exclude from results. | |
| clean | No | If true, returns only non-empty items and skips hidden fields (starting with #). Shortcut for skipHidden=true and skipEmpty=true. | |
| limit | No | Maximum number of items to return. Default is 20. | |
| fields | No | Comma-separated list of fields to include in results. Fields in output are sorted as specified. Use dot notation for nested objects (e.g. "metadata.url"); the server auto-flattens parent prefixes. | |
| offset | No | Number of items to skip at the start. Default is 0. | |
| flatten | No | Comma-separated list of fields to flatten (e.g. flatten="metadata" turns {"metadata":{"url":"x"}} into {"metadata.url":"x"}). Normally derived automatically from dot-notation in `fields`; specify only as a diagnostic override. | |
| datasetId | Yes | Dataset ID, name (resolved against your own datasets), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Dataset items |
| limit | Yes | Limit used for pagination |
| offset | Yes | Offset used for pagination |
| summary | Yes | Summary of the result |
| nextStep | Yes | One follow-up action with tool name |
| datasetId | Yes | Dataset ID |
| itemCount | Yes | Number of items returned |
| totalItemCount | Yes | Total items in dataset |
| apifyConsoleUrl | No | Personalized Apify Console link to the dataset; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description adds value by disclosing the default limit of 20, what clean=true does, and that results are the raw rows. Return-shape details are largely deferred to the existing output schema, which is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the anti-scope sentence, followed by short usage notes and examples. Slightly redundant in repeating the limit default and the clean flag across sections, but nothing wasteful enough to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with full schema coverage and an output schema, the description supplies the purpose, trigger, and key defaults an agent needs. Pagination interaction (offset/limit) and flatten behavior are left to the schema, which is reasonable given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters in depth. The description only restates the default limit and clean=true semantics, adding little beyond the structured fields; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get items (rows) from a dataset') and immediately delimits scope by saying it returns rows themselves, not metadata, counts, or schema. An agent can distinguish the intent without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly') plus a usage section and two concrete examples. It lacks explicit when-not guidance relative to any alternative, but the sibling list contains no competing dataset-read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-key-value-store-recordGet key-value store recordARead-onlyIdempotentInspect
Get the value stored under a specific key in a key-value store — a single record, not a listing of all keys. Requires the exact key name. The response preserves the original Content-Encoding; most clients handle decompression automatically.
USAGE:
Use when you need to retrieve a specific record (JSON, text, or binary) from a store.
USAGE EXAMPLES:
user_input: Get record INPUT from store abc123
user_input: Get record data.json from store username~my-store
| Name | Required | Description | Default |
|---|---|---|---|
| recordKey | Yes | Key of the record to retrieve. | |
| keyValueStoreId | Yes | Key-value store ID, name (resolved against your own key-value stores), or full name as username~name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | Record key |
| value | Yes | The stored value (JSON, text, or binary) |
| summary | Yes | Summary of the result |
| contentType | No | MIME type of the stored value |
| keyValueStoreId | Yes | Key-value store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered elsewhere. The description earns credit for adding behavioral context beyond that: the 'requires the exact key name' precondition and the note that the response preserves the original Content-Encoding, which most clients decompress automatically — a real return-value trait callers would otherwise trip over.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key facts — scope, exact-key requirement, encoding caveat — are front-loaded in three tight sentences. The subsequent USAGE and USAGE EXAMPLES blocks are somewhat redundant with the first paragraph, costing a little efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A two-parameter read tool whose annotations, 100% schema coverage, and output schema already cover safety, inputs, and return shape. The description closes the remaining gap with the Content-Encoding behavior, which is exactly the non-obvious detail an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the keyValueStoreId resolution rules (name vs. username~name) and minLength constraints in the schema itself. The description only reinforces that the key must be exact, adding little semantics beyond what the schema already documents, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the value stored under a specific key in a key-value store') and preemptively scopes it against a listing tool: 'a single record, not a listing of all keys.' An agent can immediately tell this is a point lookup, not an enumeration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to use it ('when you need to retrieve a specific record (JSON, text, or binary)') and includes two concrete usage examples showing the store identifier formats. However, it never states when NOT to use it or names an alternative/sibling for enumeration, so the guidance is implied rather than comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--ai-search-visibility-trackerrowfeed/ai-search-visibility-trackerBDestructiveInspect
This tool calls the Actor "rowfeed/ai-search-visibility-tracker" and retrieves its output results. Actor description: Ask ChatGPT, Google AI Mode, Gemini and Perplexity your customers' questions and see if your brand is mentioned, in which position versus competitors, and which sources are cited. Full answer, brands and sources per prompt. Pay per answer.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Brand name or domain (e.g. hubspot.com). A domain also counts as cited when the AI links to it. Example values: "HubSpot" | HubSpot |
| engines | No | Which AI assistants to ask: ChatGPT, Google AI Mode, Gemini and Perplexity. Each prompt x engine is one answer. Example values: ["chatgpt"] | |
| prompts | No | Questions your customers ask AI assistants, up to 500. Each prompt is asked on each engine. Example values: ["What is the best CRM for a small business? Recommend 5 options."] | |
| language | No | Language of the answer (English name). Example values: "English" | English |
| location | No | Country the question is asked from (English name, e.g. Germany). Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| competitors | No | Optional: up to 20 competitor names or domains to compare against. Example values: ["Pipedrive","Salesforce","Zoho CRM"] |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true and destructiveHint=true, so the safety profile is already known; the description's 'calls the Actor' and 'Pay per answer' add the useful cost model that annotations do not supply. However, the 'retrieves its output results' framing understates that this launches a live, billable, long-running run whose results must later be polled via get-actor-run. Rate limits and run lifecycle are left to the waitSecs schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: a boilerplate wrapper sentence followed by the substantive Actor description. The marketing copy ('Full answer, brands and sources per prompt. Pay per answer.') is compact and the core capability is front-loaded, but the generic first sentence earns little and the fragment style is less scannable than a single well-formed lead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 fully documented parameters, an output schema, and explicit annotations, the description does not need to explain return values or field formats. What is missing is usage context: when this beats sibling visibility/SEO tools, and that live lookups require a paid plan. Adequate but with clear gaps for a paid, multi-engine research tool in a large sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (brand, engines, prompts, language, location, waitSecs, competitors) is already documented in detail in the input schema. The description adds only the conceptual framing of prompts x engines = one answer, without extra syntax or constraints. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: ask the same customer questions across ChatGPT, Google AI Mode, Gemini and Perplexity and detect whether the brand is mentioned, its rank versus competitors, and which sources are cited. That is far more informative than the generic 'calls the Actor and retrieves its output results' opener. It never names the closest sibling (rowfeed--google-ai-overview-tracker), but the multi-engine scope still makes the tool identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no routing versus the many sibling rowfeed tools. 'Pay per answer' hints at cost but does not tell the agent when this tracker is the right choice over the single-engine Google AI Overview tracker or a plain SERP tool. The only exclusion-like signal, the paid-plan requirement, lives in the schema description rather than here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--amazon-product-trackerrowfeed/amazon-product-trackerBDestructiveInspect
This tool calls the Actor "rowfeed/amazon-product-tracker" and retrieves its output results. Actor description: Amazon search results and product details for any keyword or ASIN: rank, price, rating, reviews count, Best Sellers Rank, Amazon's Choice, sponsored flag. Licensed data, no blocked runs. $1 per 1,000 products.
| Name | Required | Description | Default |
|---|---|---|---|
| asins | No | Optional: ASINs or Amazon product URLs (up to 1,000) for full product details: price, discount, availability, rating, Best Sellers Rank, categories, variants, description. | |
| sortBy | No | Amazon's sort order for the searches. Example values: "relevance" | relevance |
| language | No | Marketplace language, e.g. English (United States), English (United Kingdom), German (Germany), French (France). Empty = the marketplace default. Example values: "English (United States)" | English (United States) |
| location | No | Country (and marketplace) as DataForSEO names it: United States, United Kingdom, Germany, France, Italy, Spain, Canada, India, Japan, Australia ... Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| trackAsins | No | Optional: your ASINs. Search rows get tracked: true when the product is yours, so you can follow your rank per keyword over time. | |
| searchQueries | No | What to search Amazon for, up to 500 per run. Each search returns the products in Amazon's own order (organic and sponsored). Example values: ["wireless earbuds"] | |
| maxProductsPerSearch | No | How many products per search, 10 to 700. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the safety profile is structured. The description adds genuinely useful context the annotations do not: licensed data, no blocked runs, and $1 per 1,000 products pricing. However, it never says the call starts a billable Actor run, nor how waitSecs/nextStep polling behaves, leaving the cost-incurring behavior only half explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the data scope front-loaded; the only waste is the boilerplate 'This tool calls the Actor ... and retrieves its output results' wrapper, which restates the obvious. It is short enough that no sentence is burdensome.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so return values and parameters need no explanation here. The description supplies pricing and licensing context appropriate for a paid scraping Actor; the main omission is run-lifecycle guidance (billing trigger, polling) for a tool that launches a run.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 8 parameters (asins, searchQueries, trackAsins, maxProductsPerSearch, waitSecs, sortBy, language, location) is already documented in the schema. The description adds no parameter-level meaning beyond echoing 'keyword or ASIN', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and verb: it calls the 'rowfeed/amazon-product-tracker' Actor and returns Amazon search results and product details, enumerating the fields (rank, price, rating, reviews count, BSR, Amazon's Choice, sponsored flag). An agent can tell this is the Amazon marketplace scraper rather than a generic SERP tool, though it never names a sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'for any keyword or ASIN' — there is no statement of when to pick this over neighbors such as rowfeed--google-shopping-prices or rowfeed--google-serp-api, and no note that live lookups require a paid plan (that constraint lives only in the schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--apple-app-store-scraperrowfeed/apple-app-store-scraperBDestructiveInspect
This tool calls the Actor "rowfeed/apple-app-store-scraper" and retrieves its output results. Actor description: App Store top charts (free, paid, grossing, iPad, new) per country and category, app search and app details: rank, developer, price, rating, ratings count, category, version, size, release date. $1 per 1,000 apps.
| Name | Required | Description | Default |
|---|---|---|---|
| appIds | No | Optional: specific apps to fetch (up to 1,000). | |
| charts | No | Which App Store charts to read (up to 100 apps each, in chart order). Leave empty to skip charts. Example values: ["top_free"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| countries | No | App Store countries as 2-letter codes, up to 50. Example values: ["us"] | |
| categories | No | Optional: chart per category (Finance, Games, Health & Fitness ...). Empty = the overall chart. | |
| maxPerChart | No | Apple's charts list up to 100 apps. Example values: 100 | |
| searchTerms | No | Optional: App Store searches, in Apple's result order (ranked). | |
| maxPerSearch | No | Up to 200. Example values: 50 | |
| includeDescription | No | Add the app description and the latest release notes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, destructiveHint=true, so the safety profile is covered structurally. The description adds genuinely useful cost context ($1 per 1,000 apps) but omits the run lifecycle behavior — that the call may return before terminal state and require polling — which is a critical trait for an Actor-launching tool and is only discoverable in the waitSecs schema field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and capabilities, no filler beyond the necessary Actor-invocation framing. Slightly stiff boilerplate opener ('This tool calls the Actor X and retrieves its output results') but it earns its place by clarifying the execution model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the data domains plus pricing. However, for a nine-parameter actor-launching tool with a polling/nextStep model, the definition leaves the async execution and sibling routing unaddressed, leaving material gaps an agent must fill from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters (appIds, charts, countries, categories, maxPerChart, searchTerms, maxPerSearch, includeDescription, waitSecs) are already documented in the schema. The description echoes the high-level modes but adds no semantics about parameter interaction or defaults, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The actor description names concrete capabilities and resources: App Store top charts (free, paid, grossing, iPad, new), per country/category, app search, and app details, with an explicit field list (rank, developer, price, rating, etc.). The 'App Store' scope distinguishes it from google-play-scraper by name, but it never explicitly separates itself from app-reviews-scraper, which is the nearest ambiguous sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the capability list — an agent can infer 'use this for App Store charts/search/details' but there is no explicit when-to-use statement, no exclusions, and no named alternative. Nothing tells the agent whether to pick this over google-play-scraper or app-reviews-scraper for overlapping intents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--app-reviews-scraperrowfeed/app-reviews-scraperADestructiveInspect
This tool calls the Actor "rowfeed/app-reviews-scraper" and retrieves its output results. Actor description: Export Google Play and App Store reviews of any app: rating, title, text, date, app version, helpful votes and the developer's reply. Paste store links, package names or App Store ids, any country. Newest or most relevant first. About $0.10 per 1,000 reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| apps | No | One app per line: a Google Play or App Store link, a package name (com.spotify.music) or an App Store id (324684580). Up to 500 per run. Example values: ["https://play.google.com/store/apps/details?id=com.spotify.music","https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"] | |
| sortBy | No | Newest first, or the store's most relevant / most helpful first. Example values: "newest" | newest |
| country | No | Store country, e.g. "United States", "United Kingdom", "Germany". Reviews differ per country. Example values: "United States" | United States |
| language | No | Store language, e.g. "English", "German". Example values: "English" | English |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| newerThan | No | Leave out older reviews: a date (2026-10-01) or an age (7 days, 2 weeks, 3 months). Left-out reviews are not charged. With "Newest first", no further reviews are fetched once the cutoff is reached, which makes scheduled monitoring cheap. | |
| maxReviews | No | How many reviews to get per app, in the chosen order. Up to 10,000 on Google Play; the App Store gives at most 500 per app and country. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint and destructiveHint, and the description adds genuinely useful context beyond them: cost (~$0.10 per 1,000 reviews), the paid-plan requirement for live lookups, and that filtered-out reviews are not charged. It does not explain why destructiveHint is set for what reads as a scrape, which is the one gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and followed by the field list and pricing. The opening 'calls the Actor ... and retrieves its output results' is boilerplate that could be trimmed, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers cost, plan requirements and the waitSecs polling behavior. For a 7-parameter, zero-required scraper this is close to complete, missing only explicit sibling differentiation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents apps, sortBy, country, language, waitSecs, newerThan and maxReviews in detail. The description adds only the cost implication of newerThan, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it exports Google Play and App Store reviews with the exact fields returned (rating, title, text, date, version, votes, developer reply). It is clearly distinguishable from metadata scrapers like google-play-scraper, though it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through 'Paste store links, package names or App Store ids, any country' and the sort options, which tells an agent how to invoke it. There is no explicit when-to-use/when-not guidance and no mention of the sibling app-store scrapers that might be alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--backlink-checkerrowfeed/backlink-checkerBDestructiveInspect
This tool calls the Actor "rowfeed/backlink-checker" and retrieves its output results. Actor description: Check backlinks of any website or page: every linking domain and page, anchor text, dofollow or nofollow, domain and page strength, spam score, first and last seen. Up to 10,000 per site. An Ahrefs and Semrush backlink checker alternative, pay per link.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | One per linking domain gives the list of referring domains with their best link. Example values: "one_per_domain" | one_per_domain |
| targets | No | A domain (example.com) checks the whole site with subdomains; a URL with a path checks that one page. Up to 1,000. Example values: ["notion.so"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| dofollowOnly | No | Leave out nofollow links. | |
| maxBacklinks | No | Strongest first. Up to 10,000; every 1,000 is one lookup. Example values: 100 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the bar is lower. The description usefully adds the cost model ('pay per link') and the 10,000-per-site ceiling, but it omits the run/polling semantics that matter here — waitSecs caps the wait and long runs return with an in-progress status plus a nextStep to poll, which is only documented in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and then the returned fields, with no filler. The wrapper boilerplate 'calls the Actor ... and retrieves its output results' is mild overhead but consistent with the other rowfeed tool definitions in this family.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and all five parameters are fully documented in the schema. What is missing is the operational context an agent needs before invoking: that this is a paid pay-per-lookup run, that live lookups require a paid Apify plan, and how to proceed when the run hasn't finished.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains mode, targets format, waitSecs, dofollowOnly and maxBacklinks. The description adds only the aggregate 'Up to 10,000 per site' figure, which loosely maps to maxBacklinks; it adds no new meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: check backlinks for any website or page, and enumerates the returned fields (linking domain/page, anchor text, follow status, strength, spam score, first/last seen). It does not explicitly differentiate itself from nearby siblings such as broken-link-checker or da-pa-checker, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — 'Check backlinks of any website or page' plus the Ahrefs/Semrush comparison signals the scenario, but there is no explicit when-to-use, when-not-to-use, or named alternative among the many rowfeed SEO siblings. An agent must infer the choice from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--broken-link-checkerrowfeed/broken-link-checkerBDestructiveInspect
This tool calls the Actor "rowfeed/broken-link-checker" and retrieves its output results. Actor description: Crawl a website and check every link and image: broken links (404, 410, 5xx, dead domains), redirect chains, timeouts and links the site blocks, with the pages each link is on. Or check a plain list of URLs. Plain HTTP, robots.txt respected.
| Name | Required | Description | Default |
|---|---|---|---|
| crawl | No | On: follow links on the same site, page by page, and check every link and image found. Off: only check the URLs you listed. Example values: true | |
| output | No | Problems only (broken, timed out, blocked), problems plus redirects, or every checked URL. With 'Crawl the site' off, every URL is always output. Example values: "problems" | problems |
| maxPages | No | How many pages of the site are opened to collect links. Links on those pages are all checked. Example values: 20 | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| startUrls | No | Start pages of the sites to check (e.g. https://example.com/). With 'Crawl the site' off, every URL here is checked on its own (bulk URL status and redirect check). Example values: ["https://www.scrapethissite.com/pages/"] | |
| checkImages | No | Also check image files (img src) for broken images. Example values: true | |
| maxLinksPerSite | No | Upper limit on unique URLs checked per site (pages, links and images together). Each checked URL is one charged event. Example values: 1000 | |
| checkExternalLinks | No | Also check links that point to other domains (not crawled, just checked). Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the agent knows this is a mutating/open-world Actor run. The description adds useful context ('Plain HTTP, robots.txt respected') and the Actor's checking scope, but it does not disclose charging behavior, rate limits, or what 'destructive' means in practice. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact at two sentences, but the first sentence is generic wrapper boilerplate and the actual useful purpose appears only in the second sentence. It is adequately sized but not front-loaded with the most useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations are present, and the input schema is fully described, so the description does not need to explain return values or every parameter. Still, for an 8-parameter Actor wrapper with destructive/open-world annotations, the description could better mention charging, long-running behavior, or run/poll semantics beyond what the schema states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 8 parameters in detail, including crawl vs. URL-list modes, output filtering, and waitSecs behavior. The description itself adds little parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool invokes the 'rowfeed/broken-link-checker' Actor and retrieves its output, and the Actor description specifies crawling a site to check links/images for 404s, redirects, timeouts, and blocked links, or checking a plain URL list. This distinguishes it from sibling tools like backlink-checker or seo-site-audit, though the first sentence is generic Actor-wrapper boilerplate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Actor description implies two usage modes: crawling a website or checking a plain list of URLs. However, it does not explicitly say when to choose this over sibling tools such as rowfeed--backlink-checker or rowfeed--seo-site-audit, nor does it state exclusions or prerequisites beyond 'robots.txt respected.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--career-site-jobs-scraperrowfeed/career-site-jobs-scraperBDestructiveInspect
This tool calls the Actor "rowfeed/career-site-jobs-scraper" and retrieves its output results. Actor description: Open jobs straight from company career sites on Greenhouse, Lever, Ashby, Workday and SmartRecruiters: title, team, location, remote, salary, posted date and apply link. Monitor mode returns only new jobs. $1 per 1,000 jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| onlyNew | No | Return only jobs that earlier runs with the same career page and filters did not return. Schedule the Actor daily for a feed of new openings; you pay only for new jobs. Seen job ids are kept in a key-value store named career-site-jobs-seen in your account. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| companies | No | Career page URLs on Greenhouse, Lever, Ashby, Workday or SmartRecruiters (up to 500), or short forms like greenhouse:stripe, lever:spotify, ashby:openai, smartrecruiters:BoschGroup. Example values: ["https://jobs.ashbyhq.com/openai","https://boards.greenhouse.io/stripe"] | |
| locations | No | Keep only jobs whose location contains one of these (city, country or 'remote'). Empty = everywhere. | |
| remoteOnly | No | Keep only jobs marked remote by the job board or with 'remote' in the location. | |
| titleKeywords | No | Keep only jobs whose title contains at least one of these words (not case-sensitive). Empty = all jobs. | |
| postedWithinDays | No | Keep only jobs published in the last N days. 0 = any date. (Workday shows dates only for the last 30 days.) | |
| maxJobsPerCompany | No | Upper limit per career page after the filters. Default 100; raise it (up to 10,000) to get every open job. Example values: 100 | |
| includeDescription | No | Add the full job description as plain text (emails and phone numbers removed). Slower on Workday and SmartRecruiters, which need one extra request per job. No extra charge. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true and destructiveHint=true, so the description's main added value is the cost model ('$1 per 1,000 jobs') and the monitor-mode note. It never explains why destructiveHint is true or that runs may return early before completion, both of which an agent needs to interpret the safety profile correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening 'This tool calls the Actor ... and retrieves its output results' is framework boilerplate that carries no decision-relevant information, and the 'Actor description:' prefix is awkward. The substantive content that follows is dense and useful, but it is not front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the definition is adequate: purpose, sources, cost and monitor mode are covered. Gaps remain around the destructiveHint implication and the early-return/polling behavior, which matter for an open-world actor with nine parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the nine parameters is already documented in detail (including onlyNew's key-value store state and waitSecs polling). The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb and resource (retrieves open jobs from company career sites) and enumerates the five supported boards (Greenhouse, Lever, Ashby, Workday, SmartRecruiters) plus the returned fields. That implicitly separates it from aggregator siblings like google-jobs-api, but the differentiation is never made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is 'Monitor mode returns only new jobs', which signals when to use the monitor behavior. There is no guidance on when to choose this over google-jobs-api or other job-related siblings, and no stated prerequisites for the company career page inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--competitor-keywordsrowfeed/competitor-keywordsCDestructiveInspect
This tool calls the Actor "rowfeed/competitor-keywords" and retrieves its output results. Actor description: See up to 10,000 Google keywords a website ranks for: position, URL, search volume, CPC, keyword difficulty, intent and estimated traffic, plus a visibility summary per domain. A Semrush, Ahrefs and SpyFu alternative for competitor keywords, no subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | No | Websites to analyse, e.g. "semrush.com" or a full URL (scheme, www and path are stripped). Up to 50 per run. Example values: ["python.org"] | |
| language | No | Language name, e.g. "English", "German". Leave empty for all languages. Example values: "English" | English |
| location | No | Country as Google names it, e.g. "United States", "United Kingdom", "Germany". Leave empty for all locations. Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxPosition | No | Only return keywords where the domain ranks at this Google position or better, e.g. 10 = first page only. 100 = all. The summary row then also counts only these positions. Example values: 100 | |
| maxKeywordsPerDomain | No | How many ranked keywords to return per domain, the ones bringing the most estimated traffic first. Up to 10,000. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, yet the description frames the tool as merely 'retrieves its output results', which reads like a safe read and does not explain that a run is started, that credits are consumed, or that live lookups require a paid plan (that caveat lives only in the input schema). The waitSecs/nextStep polling behavior is documented in the schema, not here. With the safety-relevant annotation unexplained, the description leaves real behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with a boilerplate 'calls the Actor and retrieves its output results' clause that carries no information, followed by a genuinely informative but marketing-flavored feature list ('no subscription'). The useful content is present but wrapped in filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values are covered by the output schema and all parameters by the input schema, so the core is present. What is missing is the operational context an agent needs before invoking an open-world Actor: run lifecycle, credit cost, and the paid-plan requirement, none of which appear in the description itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters — including domains, language, location, maxPosition and maxKeywordsPerDomain — are already fully documented in the schema. The description adds no syntax, defaults, or interaction notes (e.g. that maxPosition also filters the summary row, which is covered in the schema). Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence names a specific resource — Google keywords a website ranks for — and enumerates the returned metrics (position, URL, search volume, CPC, keyword difficulty, intent, estimated traffic) plus a per-domain visibility summary. That is enough to separate it from siblings like rowfeed--keyword-generator or rowfeed--keyword-search-volume, though it never names them explicitly. The first sentence ('calls the Actor ... and retrieves its output results') is generic wrapper boilerplate that adds nothing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this tool over the roughly 40 sibling SEO tools, and no prerequisites or exclusions. The 'Semrush, Ahrefs and SpyFu alternative' line is positioning against external products, not guidance for the calling agent. The agent must infer the use case (domain-level competitive keyword research) entirely from the actor blurb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--da-pa-checkerrowfeed/da-pa-checkerBDestructiveInspect
This tool calls the Actor "rowfeed/da-pa-checker" and retrieves its output results. Actor description: Check domain authority (DA), page authority (PA) and spam score for up to 10,000 domains or URLs at once, plus referring domains. A bulk Moz-style DA checker and website authority checker on licensed backlink data.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | No | Domains get domain authority, spam score and referring domains. Page URLs also get page authority (PA). Up to 10,000. Example values: ["apify.com","https://apify.com/store","bbc.co.uk"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The first sentence discloses the important operational fact that this invokes an Actor run and returns its output rather than doing a direct lookup — useful context beyond the annotations. Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, and the description does not contradict them. However, the wait-for-terminal-state behavior, the possibility of a capped response with a pending run, and the paid-plan requirement all live in the schema text rather than in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no padding beyond the boilerplate 'This tool calls the Actor ... and retrieves its output results' wrapper that generic MCP-Actor tools carry. The substantive content is compact, but the leading sentence conveys little that the tool name and annotations do not already signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the description need not explain return values, and the input schema carries the billing prerequisite and wait semantics. What remains missing is the differentiating context an agent needs when choosing among several SEO lookup siblings, which the description does not supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (targets and waitSecs) are fully documented in structured fields, including the DA vs. PA distinction and the 0–45 second cap. The description adds only the 'up to 10,000' scale figure, which the schema already states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: check domain authority, page authority, and spam score for up to 10,000 domains or URLs, plus referring domains. The 'Moz-style bulk DA checker' framing makes the output metric clear. It never names the closest sibling (rowfeed--backlink-checker), so the distinction from that tool is left for the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the metric names: an agent can deduce that this is for bulk authority scoring rather than for link enumeration. There is no explicit when-to-use or when-not-to-use statement, and no alternatives are named, despite rowfeed--backlink-checker, rowfeed--seo-site-audit, and rowfeed--website-traffic-checker sharing the same neighborhood.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--dataset-merge-deduprowfeed/dataset-merge-dedupADestructiveInspect
This tool calls the Actor "rowfeed/dataset-merge-dedup" and retrieves its output results. Actor description: Merge Apify datasets, CSV and JSON files into one table and remove duplicates by any fields (url, email, website ...), keeping the first or newest row. Loose matching of case, spaces and URLs. $0.10 per 1,000 rows out.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | "Last" keeps the newest version of each row, e.g. when merging today's run into yesterday's. Example values: "first" | first |
| rows | No | Or paste rows as a JSON array of objects. Example values: [{"company":"Acme","website":"https://acme.com/"},{"company":"ACME ","website":"http://www.acme.com"},{"company":"Globex","website":"https://globex.com"}] | |
| fileUrls | No | Public links to CSV (comma, semicolon or tab), JSON array or JSON Lines files, up to 50 MB each. Excel: save as CSV first. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| addSource | No | Add _source to each row: which dataset, file or input the row came from. | |
| datasetIds | No | Datasets to merge, e.g. the results of several runs of any Actor. Pick them or paste dataset IDs (Storage tab, or the run's Output). | |
| looseMatch | No | Ignore upper/lower case and extra spaces, and treat http/https, www. and a trailing slash in URLs as the same. Example values: true | |
| dedupFields | No | Rows with the same values in these fields count as duplicates, e.g. url, email, website or title + city. Dots reach nested fields (address.city). Empty = only rows that are identical in every field. Example values: ["website"] | |
| outputFields | No | Optional: keep only these columns, in this order (dots flatten nested fields). Empty = all fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: a concrete cost ($0.10 per 1,000 rows out) and the wait/cap behavior (0–45s, returns at the cap with current status, follow nextStep to poll, 0 = fire-and-forget). It does not clarify what the destructiveHint=true mutation actually is (presumably writing a new output dataset rather than mutating sources), which is the one notable omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the tool's identity and action, then the actor summary, then pricing — the important facts come first. The wrapper boilerplate ('This tool calls the Actor ... and retrieves its output results') is somewhat redundant, but the whole thing is two sentences with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations exist, so return values and safety are covered elsewhere, and cost/wait semantics are described. However, for a 9-parameter tool with zero required fields and three alternative input sources, the description never explains the input combinations (datasets vs pasted rows vs file URLs) or that one is needed — a meaningful gap an agent would hit immediately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter already has a rich description, so the baseline is 3. The prose does reinforce the semantics of keep ('first or newest row'), looseMatch, and dedupFields at a high level, but adds no syntax or constraint detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Merge Apify datasets, CSV and JSON files into one table and remove duplicates') with the dedup key space (url, email, website) and the keep-first/newest policy. This is plainly distinguishable from every sibling, which are all scrapers/checkers or run-storage readers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer 'use this to combine datasets and dedupe' but there is no explicit when-to-use vs when-not, and no statement that at least one input source (datasetIds, rows, or fileUrls) must be supplied. The only routing hint is inside the waitSecs description, which points to get-actor-run for long runs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-ads-transparencyrowfeed/google-ads-transparencyBDestructiveInspect
This tool calls the Actor "rowfeed/google-ads-transparency" and retrieves its output results. Actor description: Every ad a domain or advertiser runs on Google, YouTube, Play, Maps and Shopping, from the Google Ads Transparency Center: advertiser, format, preview image, first and last shown. Find advertisers by name, monitor new ads. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | Only ads shown on or before this date (YYYY-MM-DD). | |
| onlyNew | No | Return only ads not returned in earlier runs with the same domain or advertiser and filters. Schedule it daily or weekly to track competitor ads. | |
| targets | No | A domain (nike.com) or advertiser id (AR...) returns its ads. Anything else (e.g. 'Shopify') is searched as an advertiser name and returns matching advertisers with their ids and ad counts. Up to 500. Example values: ["nike.com"] | |
| adFormat | No | Only ads in this format. | |
| dateFrom | No | Only ads shown on or after this date (YYYY-MM-DD). | |
| location | No | Country whose Transparency Center region to search, e.g. 'United States', 'United Kingdom', 'Germany'. Leave empty for all countries. Example values: "United States" | United States |
| platform | No | Only ads shown on this platform. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxAdsPerTarget | No | Up to 680, in steps of 40 (most recently shown first). Example values: 40 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and destructiveHint=true, and the description adds useful context that the data is licensed and runs are not blocked. However, it never explains the destructiveHint=true flag (unusual for a read-style scraper) or the paid-plan requirement beyond the schema note, and it does not describe run lifecycle behavior beyond what waitSecs documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, but the first sentence ('calls the Actor ... and retrieves its output results') is pure boilerplate that consumes roughly half the description without informing tool selection. The remaining actor blurb is dense and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the actor blurb covers scope and data provenance. Still missing is guidance on the asynchronous run model (waitSecs cap, nextStep polling) and the paid-plan constraint, which are only buried in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including targets, onlyNew, and waitSecs is already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Google Ads Transparency Center ads) and enumerates the returned fields (advertiser, format, preview image, first/last shown) plus the two use cases (find advertisers by name, monitor new ads). It is clear what the tool does, though the opening sentence is generic Actor-wrapper boilerplate that adds nothing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through phrases like 'Find advertisers by name, monitor new ads' and the schema's monitor-mode flag. There is no explicit guidance on when to pick this over siblings such as rowfeed--google-serp-api or rowfeed--google-shopping-prices, nor any mention of the get-actor-run/get-dataset-items follow-up path for long runs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-ai-overview-trackerrowfeed/google-ai-overview-trackerBDestructiveInspect
This tool calls the Actor "rowfeed/google-ai-overview-tracker" and retrieves its output results. Actor description: Check which keywords show a Google AI Overview, get its full text and every cited source, and see whether your domains are cited or rank in the top 10. Any country, language and device. An AI Overview checker and GEO tracker for SEO teams.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Search as a desktop or mobile user. Example values: "desktop" | desktop |
| keywords | No | Google searches to check, one per line. Up to 1,000 per run. Example values: ["best crm for small business"] | |
| language | No | Google interface language, e.g. "English", "German". Example values: "English" | English |
| location | No | Search from this country, e.g. "United States", "United Kingdom", "Germany". Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| trackDomains | No | Domains to look for: are they cited in the AI Overview, at which source position, and where do they rank in the top 10? Up to 20. Free. Example values: ["salesforce.com","hubspot.com"] |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and readOnlyHint=false, so the agent knows this is a stateful, open-world, cost-bearing operation. The description adds the proxy mechanic ("calls the Actor ... and retrieves its output results"), which clarifies that work runs asynchronously on Apify. It does not disclose cost implications, the wait/polling behavior, or that results arrive as an Actor run output rather than a direct answer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence about calling the Actor is largely meta-boilerplate restating the tool name, and the genuinely useful capability detail is pushed into the second sentence. What remains is dense and free of filler, but the front-loading is poor for an agent scanning descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all six parameters are fully documented in-schema with sensible defaults. What is missing is the routing context an agent needs in this crowded sibling set: no statement of how this differs from ai-search-visibility-tracker or google-serp-api, and no plan/cost prerequisite in the description itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter including waitSecs and trackDomains is documented in-schema, so the baseline is 3. The line "Any country, language and device" gestures at the location, language and device inputs but adds no syntax, format or constraint detail beyond what the schema already supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence names a specific verb and resource chain: check which keywords trigger a Google AI Overview, extract its full text and every cited source, and test whether given domains are cited or rank top 10. That is far more concrete than the boilerplate opener about calling an Actor. It does not, however, distinguish this from the close sibling rowfeed--ai-search-visibility-tracker, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only an audience tag ("for SEO teams") hints at usage; there is no when-to-use, no when-not-to-use, and no reference to alternatives such as google-serp-api or ai-search-visibility-tracker. The one operationally critical condition — that live lookups require a paid Apify plan while the pre-filled example works free — appears only in the schema description, not here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-hotels-apirowfeed/google-hotels-apiBDestructiveInspect
This tool calls the Actor "rowfeed/google-hotels-api" and retrieves its output results. Actor description: Google Hotels prices for any city and dates: hotel, stars, rating, reviews, price per night, discounts, and optional prices from every booking site (Booking.com, Expedia, the hotel's own site). Filters for stars, rating and price. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adult guests. Example values: 2 | |
| sortBy | No | Order of the results. | |
| checkIn | No | Check-in date (YYYY-MM-DD). Empty = 30 days from today. | |
| checkOut | No | Check-out date (YYYY-MM-DD). Empty = 2 nights after check-in. Up to 30 nights. | |
| currency | No | 3-letter currency code, e.g. USD, EUR, GBP. Example values: "USD" | USD |
| hotelIds | No | Optional: hotel_id values from earlier results. Each returns its prices from every booking site for the dates above, without a search. Up to 200. | |
| language | No | Language code of the results, e.g. en, de, fr. Example values: "en" | en |
| location | No | Country the search is made from (prices and booking sites can differ by country), e.g. "United States", "Germany". Example values: "United States" | United States |
| minStars | No | Only hotels with at least this many stars (2-5). 0 = any. | |
| priceMax | No | In the chosen currency. | |
| priceMin | No | In the chosen currency. | |
| searches | No | What you would type into Google Hotels, e.g. "hotels in paris" or "hotels near times square". Up to 100. Example values: ["hotels in new york"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxHotels | No | 20 to 100, in steps of 20. Example values: 20 | |
| minRating | No | Only hotels rated at least this. | |
| bookingSites | No | Also get each hotel's prices from every booking site Google shows (Booking.com, Expedia, Hotels.com, the hotel's own site ...). Adds one booking-prices row per hotel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, readOnlyHint=false and destructiveHint=true, so the safety profile is carried by structured data; the description does not contradict it. It adds one genuine behavioral claim — 'Licensed data, no blocked runs' — which is useful. It does not disclose that this is a long-running scrape run subject to waitSecs capping and nextStep polling, nor the paid-plan requirement, both of which live only in the schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no bloat, but the opening sentence about calling an Actor and retrieving output is framework boilerplate that does not earn its place; the substantive content is entirely in the second sentence, which is buried behind it rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully documented, so the description need not explain return values. However, for a 16-parameter, open-world, long-running scrape tool marked destructive, the description omits cost/plan requirements and the async run-and-poll behavior, leaving meaningful gaps that only appear in the schema prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 16 parameters, including the non-obvious ones like hotelIds, bookingSites, maxHotels and waitSecs. The description only restates the filter concept ('Filters for stars, rating and price') and adds no semantics beyond the schema, which is the baseline case for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence names a specific resource and data set: Google Hotels prices for a city and dates, returning hotel, stars, rating, reviews, price per night, discounts, and optional booking-site prices, plus star/rating/price filters. That is concrete enough for an agent to distinguish it from siblings such as rowfeed--google-shopping-prices or rowfeed--tripadvisor-reviews-scraper. The first sentence is boilerplate boilerplate about calling an Actor and adds nothing, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description indicates this is for hotel price lookups with filters, and the schema hints that live lookups need a paid Apify plan. There is no explicit 'use this when' statement, no mention of when to prefer a sibling (e.g. Tripadvisor reviews for review depth), and no mention of the hotelIds path for booking-site-only lookups outside the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-images-apirowfeed/google-images-apiADestructiveInspect
This tool calls the Actor "rowfeed/google-images-api" and retrieves its output results. Actor description: Google Images API and image scraper: every image Google Images shows for a search, with the full-size image URL, thumbnail, title, the page it is on and its website. Up to 700 images per search, any country and language. $2 per 1,000 images.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language of the results (English name). Example values: "English" | English |
| location | No | Country (or city) the search is made from, e.g. United States, Germany, London,England,United Kingdom. Example values: "United States" | United States |
| searches | No | What you would type into Google Images. Up to 500. An image found by several searches is returned (and charged) once. Example values: ["modern kitchen design"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxImages | No | 1 to 700. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real context beyond annotations: per-image pricing, the up-to-700-images ceiling per search, and the shape of the returned records. But annotations declare destructiveHint=true and readOnlyHint=false, and the description frames the tool as merely 'retrieves output results' without saying that invoking it starts a billable Actor run that consumes paid plan credits (that plan caveat sits in the schema, not here). The lifecycle detail lives in the waitSecs schema text rather than the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, and the operative content (what is returned and at what cost) is front-loaded. The opening 'This tool calls the Actor ... and retrieves its output results' is slightly boilerplate MCP-wrapper phrasing but still earns its place by identifying the execution model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema, and annotations present, the description covers purpose, payload fields, volume ceiling, and cost, which is enough for correct invocation. The main omissions are the paid-plan prerequisite (present only in the schema description) and any polling/long-run behavior, which an agent would otherwise only discover after a capped waitSecs response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and waitSecs, searches, language, location and maxImages are all documented in-schema, so the schema carries the burden. The description corroborates scope ('up to 700 images per search, any country and language') but adds no new syntax or format meaning beyond that, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (calls the Actor and retrieves its output) and a specific resource (Google Images results for a search), and the Actor blurb enumerates the returned fields (full-size URL, thumbnail, title, source page, website). It does not, however, distinguish this from closely related siblings such as rowfeed--google-serp-api or rowfeed--google-shopping-prices, so an agent must infer the split from the name and payload description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'every image Google Images shows for a search' tells the agent this is the image-retrieval option, and the '$2 per 1,000 images' line gives a cost signal. There is no explicit when-to-use/when-not statement and no named alternative (e.g., use google-serp-api for web results instead of images), so the agent gets context but no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-jobs-apirowfeed/google-jobs-apiADestructiveInspect
This tool calls the Actor "rowfeed/google-jobs-api" and retrieves its output results. Actor description: Google Jobs listings for any search and location: title, employer, location, salary, contract type, posted date, source and apply link. Filters for date posted and job type, monitor mode for new jobs only. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| onlyNew | No | Return only jobs not returned in earlier runs with the same search, location and filters. Schedule it daily for job alerts. | |
| queries | No | What you would type into Google, e.g. 'data analyst' or 'warehouse jobs'. Up to 500. Example values: ["data analyst"] | |
| language | No | Language of the listings (English name). Example values: "English" | English |
| location | No | City, region or country in Google's format: 'City,Region,Country' or just 'United States'. Example values: "New York,New York,United States" | New York,New York,United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| datePosted | No | Only jobs posted within this period. | |
| employmentTypes | No | Optional: only these job types. | |
| maxJobsPerQuery | No | Up to 200, in steps of 10. Example values: 50 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and destructiveHint=true, so the safety profile of kicking off an external Actor run is communicated structurally. The description adds real context beyond that — 'Licensed data, no blocked runs' and monitor mode semantics — but omits the monetization constraint that the input schema mentions (live lookups need a paid Apify plan) and doesn't clarify that calling it starts a run and consumes credits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead-in 'This tool calls the Actor ... and retrieves its output results' is boilerplate that adds little, but the actor description that follows is dense and front-loaded with the useful capability and filter information. No sentence is redundant enough to be a real liability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers capability, filters, and data-quality/licensing notes. The main gap is operational: the paid-plan requirement (visible only buried in the input schema description) and the relationship to waitSecs/get-actor-run polling are not surfaced here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including waitSecs polling behavior and the onlyNew monitor explanation, so the schema already carries parameter meaning. The description only restates the filter/monitor capabilities at a high level and adds nothing about query limits, location format, or maxJobsPerQuery beyond what the schema documents. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('calls the Actor ... and retrieves its output results') and resource (Google Jobs listings), then enumerates the returned fields: title, employer, location, salary, contract type, posted date, source, apply link. An agent can tell this is a Google Jobs scraper rather than a hotels/maps/SERP tool, though it never explicitly contrasts with the closest sibling, rowfeed--career-site-jobs-scraper.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage through feature mentions ('Filters for date posted and job type, monitor mode for new jobs only') and the schema's onlyNew note about scheduling for job alerts, but it gives no explicit when-to-use/when-not-to-use guidance and never names an alternative tool. The agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-maps-rank-trackerrowfeed/google-maps-rank-trackerBDestructiveInspect
This tool calls the Actor "rowfeed/google-maps-rank-tracker" and retrieves its output results. Actor description: Local rank tracker for Google Maps: where your business ranks at every point of a geo-grid around it (3x3 to 9x9), the top 3 at each point, average rank, top-3 share and the competitors that beat you. Pay per point. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Google Maps zoom level used at each point (15 = a few streets). Example values: 15 | |
| center | No | Center of the grid, e.g. "40.7580,-73.9855" (right-click the place in Google Maps to copy it). Leave empty to center on your business: give a location below and it is looked up first (counts as one point). Example values: "40.7580,-73.9855" | 40.7580,-73.9855 |
| business | No | The business to find at each point: its name as on Google Maps, its website domain (example.com), its place id (ChIJ...) or its CID. Example values: "New York Midtown Dental" | New York Midtown Dental |
| gridSize | No | Points per side: 3, 5, 7 or 9 (9, 25, 49 or 81 points). Example values: 5 | |
| keywords | No | What customers type into Google Maps, e.g. "dentist" or "plumber near me". Each keyword gets its own grid. Up to 20. Example values: ["dentist"] | |
| language | No | Language of the results (English name). Example values: "English" | English |
| location | No | City, region or country where the business is, in Google format, e.g. "New York,New York,United States". Used only when the center is empty. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| spacingKm | No | Distance between neighbouring points. 0.5-1 km for a city business, 2-5 km for a service area. Example values: 1 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds genuinely useful context beyond that: 'Pay per point' (cost model) and 'Licensed data, no blocked runs' (reliability). It does not explain why a rank lookup is flagged destructive, nor does it describe run lifecycle or polling, which the waitSecs parameter only partially covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the invocation and result, followed by the actor's capability summary. No filler or repetition. The 'Actor description:' prefix is slightly mechanical but does not waste meaningful space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema fully documents inputs. What remains thin is the operational picture: cost per point is mentioned but not quantified, and the relationship to sibling tools and to the run-polling tools (get-actor-run) is left implicit. Adequate but with clear gaps for a paid, long-running job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the nine parameters is already documented in the schema, including the center/location interaction and the waitSecs polling behavior. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('calls the Actor rowfeed/google-maps-rank-tracker and retrieves its output') and the actor blurb specifies the deliverable: geo-grid rank positions, top-3 per point, average rank, top-3 share and competitors. That is far more concrete than a bare name restatement. It stops short of naming the sibling it is not (e.g. google-maps-scraper or google-maps-reviews-scraper), so an agent must infer the distinction from the grid/rank framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the grid/rank vocabulary signals 'use this to measure local ranking across a geo-grid', and 'Pay per point' hints at cost-sensitive use. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative sibling such as google-maps-scraper for plain listing extraction. The agent has to derive the selection rule itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-maps-reviews-scraperrowfeed/google-maps-reviews-scraperADestructiveInspect
This tool calls the Actor "rowfeed/google-maps-reviews-scraper" and retrieves its output results. Actor description: Export Google Maps reviews of any business: rating, full text, date, owner reply and review highlights, plus the place's rating and review count. Paste Maps links, place IDs or names. Newest, best or worst first. About $0.30 per 1,000 reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| places | No | One place per line: a Google Maps link (also maps.app.goo.gl share links), a place ID (ChIJ...), a CID, or the business name with its city, e.g. "Katz's Delicatessen, New York". Up to 500 per run. Example values: ["Katz's Delicatessen, New York"] | |
| sortBy | No | Which reviews come first: newest, most relevant (Google's default), highest or lowest rating. Example values: "newest" | newest |
| language | No | Google interface language, e.g. "English", "German". Reviews keep their own language; Google's translation is in review_text when it differs. Example values: "English" | English |
| location | No | Used to find places given by name, e.g. "United States", "United Kingdom", "Germany". Links and IDs work anywhere. Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| newerThan | No | Leave out older reviews: a date (2026-10-01) or an age (7 days, 2 weeks, 3 months). Left-out reviews are not charged. With "Newest first", no further reviews are fetched once the cutoff is reached, which makes scheduled monitoring cheap. | |
| maxReviews | No | How many reviews to get per place, in the chosen order. Up to 4,490. Places with fewer reviews only pay for what they have. Example values: 20 | |
| onlyWithText | No | Leave out star-only reviews that have no text. Left-out reviews are not charged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, and the description does not explain or qualify that profile at all. It does add genuinely useful behavior beyond the annotations: pricing (~$0.30 per 1,000 reviews), the fact that filtered-out reviews are not charged, and the surface of returned data. Nothing is said about run duration, credit consumption on failed lookups, or what terminal results look like beyond the field list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff, but the first one is MCP wrapper boilerplate ("calls the Actor ... and retrieves its output results") placed ahead of the actual purpose, so the useful content is not front-loaded. The second sentence packs purpose, inputs, sorting and pricing efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and all eight parameters are fully described in the schema with defaults and bounds. For an open-world scraper that charges credits, the description covers cost and filtering economy; the only real gap is the missing guidance on which sibling scraper to pick and the paid-plan caveat being buried in the schema description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the eight parameters is already documented in detail by the schema, including enum options for sortBy. The description adds only a broad statement of what can be passed as a place (links, IDs, names) and the per-1,000-review cost, which does not meaningfully extend the per-parameter semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Export Google Maps reviews of any business") and enumerates the returned fields (rating, text, date, owner reply, highlights, place rating/count), which makes it clearly distinct from rowfeed--google-maps-scraper (place data) and rowfeed--google-maps-rank-tracker. It never explicitly names those siblings, so an agent must infer the boundary from the resource noun alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Paste Maps links, place IDs or names" plus "Newest, best or worst first" gives input-level guidance and the cost note hints at scale. There is no when-to-use/when-not guidance versus the many sibling scrapers or the rank tracker, and no mention that live runs require a paid plan except inside the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-maps-scraperrowfeed/google-maps-scraperBDestructiveInspect
This tool calls the Actor "rowfeed/google-maps-scraper" and retrieves its output results. Actor description: Google Maps scraper and Google Places API alternative: every business for a search with address, phone, website, rating, reviews, opening hours and categories. Up to 700 places per search. $2 per 1,000 places. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Google Maps zoom around the center: 12 = a city, 14 = a district, 16 = a few streets. Example values: 14 | |
| phone | No | Filter on the business phone listed on Google Maps. Example values: "any" | any |
| center | No | Search around exact coordinates instead of a location, e.g. "30.2672,-97.7431" (right-click a spot in Google Maps to copy it). Use with Zoom. | |
| website | No | "Only without a website" finds businesses that may need one. Example values: "any" | any |
| language | No | Language of the results (English name), e.g. English, German, Spanish. Example values: "English" | English |
| location | No | City, region or country to search in, in Google format: "Austin,Texas,United States", "Berlin,Berlin,Germany", "France". Ignored when a center is given. Example values: "Austin,Texas,United States" | Austin,Texas,United States |
| searches | No | What you would type into Google Maps, e.g. "dentist", "plumber" or "coffee shop in austin tx". Each search returns up to Max places. Up to 500. A business found by several searches is returned (and charged) once. Example values: ["dentist"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxPlaces | No | Up to 700. Google Maps often has fewer for a narrow search or small town. Example values: 20 | |
| minRating | No | Skip businesses rated below this (0 = no filter). Skipped places are not charged. | |
| minReviews | No | Skip businesses with fewer reviews (0 = no filter). |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the agent knows this launches a live, non-free run. The description does add genuinely useful behavior beyond that: explicit pricing at $2 per 1,000 places, a 700-result ceiling per search, and the reassurance of licensed data with no blocked runs. It omits the run lifecycle, however: nothing says the call returns at the waitSecs cap with a partial status and a nextStep to poll, and cost is framed as an advantage rather than as a warning tied to destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short but front-loaded with generic MCP boilerplate about calling an Actor and retrieving results, which conveys nothing the agent did not already know. The substantive content is a single run-on marketing sentence mixing data fields, per-search caps, price and a reliability claim, so the most decision-relevant facts are not surfaced first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain returns, and the actor summary does cover the payload fields. But for an 11-parameter tool with destructiveHint=true and no required parameters, the definition should say what the charges accumulate against and how a long run is followed up; that lifecycle detail lives only in the waitSecs schema text. Sibling disambiguation is also missing despite four adjacent Maps-related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all 11 parameters carry their own descriptions, including zoom granularity, center coordinates, the with/without enums for phone and website, and the minRating/minReviews skip rules. The description adds no parameter meaning beyond that, so the baseline 3 is the correct ceiling here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource set: it scrapes Google Maps businesses for a search and returns address, phone, website, rating, reviews, opening hours and categories. That is far more informative than the generic wrapper sentence, and it distinguishes the tool from a plain Places lookup. It stops short of a 5 because it never differentiates itself from close siblings such as rowfeed--google-maps-reviews-scraper, rowfeed--google-maps-rank-tracker or rowfeed--google-hotels-api.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative-routing guidance anywhere in the description. The only comparative statement, "Google Places API alternative", points at an external product rather than at the sibling tools the agent must actually choose between. The agent is left to infer from the field list alone whether this is the right Maps tool for a reviews task or a ranking task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-news-monitorrowfeed/google-news-monitorADestructiveInspect
This tool calls the Actor "rowfeed/google-news-monitor" and retrieves its output results. Actor description: Google News articles for any search or topic, any country and language: title, source, publish time and the real publisher URL. Monitor mode returns only articles you have not seen yet. Pay per article.
| Name | Required | Description | Default |
|---|---|---|---|
| topics | No | Google News headline sections for the chosen edition. Optional, in addition to the queries. | |
| edition | No | Which Google News edition to read, as country:language: US:en, GB:en, IN:en, DE:de, FR:fr, ES:es, BR:pt-419, JP:ja, NO:no ... Example values: "US:en" | US:en |
| onlyNew | No | Return only articles that earlier runs with the same query, edition and time range did not return. Schedule the Actor (e.g. hourly) to get a clean feed of new articles; you pay only for new ones. Seen article ids are kept in a key-value store named google-news-monitor-seen in your account. | |
| queries | No | What to search Google News for, up to 100 per run. Google News operators work: "exact phrase", -exclude, site:reuters.com, intitle:word, OR. Example values: ["OpenAI"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| timeRange | No | Only articles published in this period (applies to search queries; topic headlines are always current). Example values: "past_24_hours" | past_24_hours |
| resolveUrls | No | Turn Google News links into the real article URL on the publisher's site (url field). If Google does not give it, url is null and google_news_url still works. No extra charge. Example values: true | |
| maxArticlesPerFeed | No | Google News returns up to 100 articles per query or topic, newest first for short time ranges. Example values: 100 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true), the description discloses a per-article cost model and the monitor-mode dedupe behavior, which explains why the tool is not purely read-only (seen IDs persisted). It still does not describe run lifecycle or latency, but the waitSecs schema field covers that. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the actor identity and then the substantive capability summary; nothing is redundant. The second sentence is dense but every clause (fields, monitor mode, pricing) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 params, 100% schema coverage, annotations and an output schema, the remaining burden on the description is purpose, mode and cost, all of which are present. Return values need not be explained because an output schema exists, and polling behavior is documented in waitSecs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents topics, edition, onlyNew, queries, waitSecs, timeRange, resolveUrls and maxArticlesPerFeed in detail. The description's phrases ('any search or topic', 'any country and language') only loosely map to those params and add no operator, format, or default guidance. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Google News articles) plus the dimensions that matter: query or topic, any country/language, returned fields (title, source, publish time, real publisher URL), and a monitor mode. It is clearly distinguishable from generic siblings like google-serp-api or google-trends-explorer. It stops short of naming a sibling for explicit contrast, so it is not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'any search or topic' plus 'monitor mode returns only articles you have not seen yet' tells an agent when monitoring applies. However, there is no explicit when-not guidance and no routing to alternatives such as google-serp-api for general web results or google-ai-overview-tracker for AI summaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-play-scraperrowfeed/google-play-scraperADestructiveInspect
This tool calls the Actor "rowfeed/google-play-scraper" and retrieves its output results. Actor description: Google Play app data by package name or URL, in any country: exact install count, rating, ratings histogram, price, in-app purchases, ads, genre, version, last update, developer. $0.50 per 1,000 apps.
| Name | Required | Description | Default |
|---|---|---|---|
| appIds | No | The package name is the id= part of the app's Google Play link. Up to 10,000 app/country pairs per run. Example values: ["com.spotify.music"] | |
| language | No | Language of titles, genres and descriptions, e.g. en, de, fr, ja, pt-br. Example values: "en" | en |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| countries | No | Google Play countries as 2-letter codes, up to 50. Each app is read once per country (price, currency and availability differ). Example values: ["us"] | |
| includeDescription | No | Add the full app description (long text). |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true; the description neither contradicts nor explains that write-capable profile (it presumably writes dataset items). It does add value the annotations lack: an explicit cost model of $0.50 per 1,000 apps, which is genuine behavioral context for deciding whether to run a large batch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler beyond the boilerplate Actor wrapper clause, and the concrete data payload and price are stated up front. The opening sentence is redundant filler that delays the useful content slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needs no explanation; the description supplies the payload domain, geographic scope, and pricing, which covers what an agent needs to decide and call correctly. The remaining omission (sibling routing) is captured under usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed notes on waitSecs capping and country-level reads, so the schema carries the parameter burden. The description only echoes 'package name or URL, in any country' and adds no new constraints such as the 10,000 app/country pair ceiling or the 50-country limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the Actor and enumerates the exact resource returned: install count, rating, ratings histogram, price, IAPs, ads, genre, version, last update, developer. Paired with the 'Google Play app data by package name or URL' phrasing it clearly distinguishes this from the App Store sibling, though the generic first sentence ('calls the Actor and retrieves its output results') wastes the strongest opening slot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the data scope ('package name or URL, in any country'), but there is no explicit when-to-use guidance and no routing to obvious alternatives such as rowfeed--apple-app-store-scraper for iOS or rowfeed--app-reviews-scraper for user reviews. The agent must infer boundaries from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-serp-apirowfeed/google-serp-apiADestructiveInspect
This tool calls the Actor "rowfeed/google-serp-api" and retrieves its output results. Actor description: Google search results for any query, country, language and device: organic results, ads, featured snippet, People Also Ask, AI overview when Google shows one, and local pack, plus your domain's rank. Licensed data, no blocked runs. $3 per 1,000 searches.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Results as seen on a desktop or a mobile phone. Example values: "desktop" | desktop |
| queries | No | What to search Google for, up to 1,000 per run. Google operators (site:, "exact", -exclude) work. Example values: ["web scraping api"] | |
| language | No | Search language: English, German, French, Spanish ... Leave empty for the location's default. Example values: "English" | English |
| location | No | Country, region or city as Google names it: "United States", "United Kingdom", "Germany", "London,England,United Kingdom", "New York,New York,United States". Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| targetDomain | No | e.g. example.com. Every row then gets target_position and target_url: where this domain ranks (subdomains count). Schedule the Actor daily for a rank tracker. | |
| resultsPerQuery | No | 10 = first page. Up to 100. Each 10 results count as one search page in the price. Example values: 10 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses two behaviors an agent cannot infer from structured fields: licensed data means 'no blocked runs' (reliability expectation) and pricing of $3 per 1,000 searches (cost consequence of batch size). The annotations already declare openWorldHint and destructiveHint, so the remaining burden is lighter. It does not mention run-time/polling behavior, but waitSecs and nextStep are already documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The second sentence (the actor description) is dense and useful, but the opening sentence is boilerplate that restates the tool name and mechanism without adding information. The useful content is placed second rather than front-loaded, and pricing is buried at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 optional parameters, full schema coverage, an output schema, and annotations supplied, the description only needs to convey what data comes back, its reliability, and its cost — all of which it does. Minor omissions such as per-run limits and polling behavior are already covered by schema fields, so the definition is close to complete for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (device, queries, language, location, waitSecs, targetDomain, resultsPerQuery) is already explained in the schema, including operator support and pricing implications of resultsPerQuery. The description adds no parameter-level meaning of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The actor description names the concrete resource and its contents: organic results, ads, featured snippet, People Also Ask, AI overview, local pack, and target-domain rank. That is far more specific than the wrapper sentence 'calls the Actor ... and retrieves its output results'. It does not differentiate from adjacent siblings such as rowfeed--google-ai-overview-tracker or rowfeed--google-images-api, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the scope line ('any query, country, language and device') tells an agent what situations fit, and the price note hints at cost-sensitive use. There is no explicit when-to-use, when-not-to-use, or pointer to a sibling for a narrower need (e.g. AI-overview-only or image-only tracking), which is a notable gap given ~40 sibling scrapers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-sheets-exportrowfeed/google-sheets-exportADestructiveInspect
This tool calls the Actor "rowfeed/google-sheets-export" and retrieves its output results. Actor description: Send Apify datasets, CSV and JSON files to any Google Sheet: share the sheet with our export account, no OAuth. Append or replace, skip rows already in the sheet, new columns added. $0.05 per 1,000 rows.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Append keeps what is in the tab and adds new rows below. Replace clears the tab first (never when there is nothing to write). Example values: "append" | append |
| rows | No | Or paste rows as a JSON array of objects. | |
| columns | No | Optional: export only these columns, in this order. Nested fields are columns with dots (address.city). | |
| fileUrls | No | Public links to CSV, JSON or JSON Lines files (up to 20 MB each). | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| sheetName | No | Tab (worksheet) to write to. Created if it does not exist. Empty = the first tab. | |
| datasetIds | No | Datasets to export, e.g. a run's results. In an integration (run another Actor, then this one) use {{resource.defaultDatasetId}}. | |
| spreadsheet | No | Link to your Google Sheet. Before the first run: open the sheet, click Share and add the export account (shown in the README and in the run log) as Editor. No Google login or OAuth needed. | |
| skipDuplicatesBy | No | E.g. url or email: rows whose value is already in the sheet (or earlier in this export) are skipped and not charged. Ideal for daily runs that add only new results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag destructiveHint=true and openWorldHint=true, but the description adds real context beyond them: the sheet must be shared with the export account as Editor before the first run, no OAuth is required, replace clears the tab first (never when there is nothing to write), skipped duplicate rows are not charged, and pricing is $0.05 per 1,000 rows. Auth prerequisite and cost disclosure are exactly the kind of behavior the agent cannot infer from the schema. It stops short of describing failure modes or what the run log returns, which the output schema partly covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The second sentence is dense and well packed, but the first sentence is boilerplate that restates the tool name and mischaracterizes the operation as output retrieval. The most useful fact for a first-time caller, the mandatory sheet-sharing step, is buried mid-sentence rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter mutation tool with annotations and an output schema, the description covers the critical missing pieces: the Editor-sharing prerequisite, no-OAuth model, destructive replace semantics, dedup cost behavior, and per-row pricing. The waitSecs/get-actor-run polling flow and response shape are adequately handled by the schema and output schema, so their absence from the description is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters, including the mode enum, waitSecs polling cap and skipDuplicatesBy semantics, are already documented inline. The description reinforces append vs replace and the duplicate-skipping behavior but adds no syntax, format, or interaction detail beyond what the schema states. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The actor description states a specific verb and resource: send Apify datasets, CSV and JSON files to any Google Sheet, with append/replace modes. It is clearly distinguishable from ingestion siblings like get-dataset-items or rowfeed--dataset-merge-dedup. The opening boilerplate ('calls the Actor ... retrieves its output results') is generic and slightly misdescribes the tool as a retrieval wrapper rather than a write-to-Sheets operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource pairing (Apify dataset -> Google Sheet) and by the enumerated modes, but there is no explicit 'use this when X, not Y' guidance. Nothing tells the agent when to prefer get-dataset-items or dataset-merge-dedup instead, and no prerequisites beyond the sharing step are given. Adequate but clearly gapped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-shopping-pricesrowfeed/google-shopping-pricesBDestructiveInspect
This tool calls the Actor "rowfeed/google-shopping-prices" and retrieves its output results. Actor description: Google Shopping results for any product search in any country: price, old price and discount, seller, rating, ratings count, delivery and rank. Track your own or competitors' shops. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| sortBy | No | Google Shopping sort order. Example values: "relevance" | relevance |
| language | No | Search language: English, German, French ... Example values: "English" | English |
| location | No | Country, region or city as Google names it: United States, United Kingdom, Germany, France, Australia ... Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| trackSellers | No | Shop names or domains. Rows from a matching seller get tracked: true, so you can follow your own or competitors' prices and positions. | |
| searchQueries | No | What to search Google Shopping for, up to 500 per run. Example values: ["wireless earbuds"] | |
| maxProductsPerSearch | No | How many products per search, 10 to 120. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the description is not the sole source of the safety profile, and it correctly frames the tool as an Actor wrapper that both triggers a run and fetches results. It adds no cost/credit-consumption warning, no mention of run lifecycle or polling via nextStep/get-actor-run, and no note that each call spins up a billable run — meaningful gaps for a tool flagged destructive. It does not contradict the annotations, so no contradiction is flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with what the tool does, followed by the Actor's value proposition. The framing sentence 'This tool calls the Actor ... and retrieves its output results' is boilerplate but still informative, and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the output fields are summarized adequately. However, for a multi-parameter, billable, open-world scraper, the description omits the paid-plan requirement, the run/poll behavior at waitSecs cap, and any routing guidance versus sibling Actor tools, leaving it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 7 parameters (sort order, language, location, waitSecs, trackSellers, searchQueries, maxProductsPerSearch) are already documented in the schema. The description adds no additional meaning about parameter interaction, defaults, or limits, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific mechanism (calls the 'rowfeed/google-shopping-prices' Actor and returns its output) and the Actor summary enumerates the concrete output fields: price, old price and discount, seller, rating, ratings count, delivery and rank. It clearly distinguishes this as a Google Shopping price-scraping tool, though it never explicitly contrasts itself with close siblings like rowfeed--amazon-product-tracker or rowfeed--google-serp-api.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the line 'Track your own or competitors' shops,' which hints at the price-monitoring use case without saying when to pick this tool over sibling scrapers. There are no exclusions, no prerequisites, and no alternatives named; the key operational caveat (paid plan required, free plan only works with the pre-filled example) lives solely in the schema description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--google-trends-explorerrowfeed/google-trends-explorerBDestructiveInspect
This tool calls the Actor "rowfeed/google-trends-explorer" and retrieves its output results. Actor description: Google Trends that does not break: interest over time, interest by region and top and rising related queries and topics for any keywords, up to 5 compared on one scale. Licensed data, no captchas or rate limits, pay per use.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | No | Search terms to look up (2-100 characters each, up to 100 per run). Up to 5 are compared on one shared 0-100 scale per lookup. Example values: ["web scraping","data extraction","price tracking"] | |
| location | No | Country or region as Google names it, e.g. "United States", "Germany", "California,United States". Leave empty for worldwide. Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| timeRange | No | Period of the interest-over-time timeline. Example values: "past_12_months" | past_12_months |
| searchType | No | Which Google property the interest is measured on. Example values: "web" | web |
| includeRelated | No | Add top and rising related queries and topics per keyword. Free when each keyword has its own lookup (compare off or one keyword); when keywords are compared, each keyword needs one extra lookup. Interest by region is always included. Example values: true | |
| compareTogether | No | On: keywords are looked up in groups of 5 sharing one 0-100 scale (like the Google Trends website). Off: every keyword gets its own 0-100 scale and its own lookup. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuinely useful behavior beyond the annotations: 'pay per use' cost model, 'licensed data, no captchas or rate limits', and the shared 0-100 comparison scale. However, with destructiveHint=true and readOnlyHint=false supplied, the description never explains what the run writes or persists, nor how the Actor-run lifecycle (waitSecs cap, polling) behaves. It adds cost/reliability context but leaves the write-side behavior opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, but the first is boilerplate MCP-wrapper phrasing ('This tool calls the Actor ... and retrieves its output results') that conveys nothing an agent cannot infer. The second sentence is a dense run-on packing scale limits, data licensing, and pricing into one clause chain, so it is compact but not well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description only needs to carry purpose and key behavior, which it mostly does. The gaps are sibling differentiation and the meaning of the destructive/write annotations for a scraping run. Adequate but not complete for a tool sitting among 40+ similar scrapers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every one of the 7 parameters is already fully documented, including waitSecs polling semantics and the includeRelated cost note. The description restates the 'up to 5 compared on one scale' rule that compareTogether already explains, adding no new syntax or constraint information. Baseline 3 applies when the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource (Google Trends data) and enumerates the specific outputs: interest over time, interest by region, and top/rising related queries and topics. This distinguishes it from siblings such as rowfeed--keyword-search-volume or rowfeed--google-serp-api. The opening wrapper sentence ('calls the Actor ... and retrieves its output results') is generic, but the quoted actor description supplies real specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not guidance and no routing to alternatives among the ~40 sibling tools. The description never says whether to pick this over keyword-search-volume for demand data or google-news-monitor for news interest. Usage is only inferable from the domain ('Google Trends').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--keyword-generatorrowfeed/keyword-generatorCDestructiveInspect
This tool calls the Actor "rowfeed/keyword-generator" and retrieves its output results. Actor description: Generate hundreds of long-tail keywords per keyword from what Google, YouTube and Bing suggest in the search box, expanded a-z, 0-9 and with question words. Any country and language. A keyword tool, Google autocomplete API and AnswerThePublic alternative.
| Name | Required | Description | Default |
|---|---|---|---|
| expand | No | none: only the keyword itself (about 10 suggestions). alphabet: also keyword + a-z and 0-9 (about 300 long-tail suggestions). questions: also how/what/why... + keyword and keyword + for/with/vs... all: alphabet and questions. Example values: "alphabet" | alphabet |
| country | No | Two-letter country code, e.g. us, gb, de, fr, in. Example values: "us" | us |
| sources | No | Whose autocomplete to read: Google, YouTube and/or Bing. Example values: ["google"] | |
| keywords | No | Keywords to get suggestions for, one per line. Up to 1,000 per run. Example values: ["running shoes"] | |
| language | No | Two-letter language code, e.g. en, de, fr, es. Example values: "en" | en |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxSuggestionsPerKeyword | No | Stop after this many unique suggestions per keyword and search box. 0 = all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, readOnlyHint=false and destructiveHint=true, which is unusual for what is essentially a read-only keyword scrape. The description adds nothing beyond the Actor's marketing blurb: no note on run duration, cost/credit usage, rate limits, or why a non-destructive scrape is marked destructive. It repeats 'calls the Actor and retrieves its output results' without explaining the async wait/poll behavior described only in the waitSecs schema field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the wrapper boilerplate ('This tool calls the Actor ... and retrieves its output results'), which carries no information for the caller. The second sentence is a pasted Actor blurb with promotional phrasing ('Generate hundreds of...', 'AnswerThePublic alternative'). Short, but a meaningful share of the text doesn't earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema and 100% schema coverage means return shape and parameters needn't be re-explained. What is missing is sibling differentiation in a crowded keyword-tool family and any behavior around run duration or cost. Adequate but with clear gaps for a tool an agent must choose among 30+ alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed enum semantics for expand and the waitSecs polling behavior, so the schema carries the parameter burden. The description itself says nothing about any of the 7 parameters. Baseline 3 applies when the schema is this rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource via the embedded Actor summary: generate long-tail keywords from Google/YouTube/Bing autocomplete, expanded a-z/0-9 and question words, per country/language. That is specific enough for an agent to know what comes back. It never distinguishes this from sibling keyword tools like rowfeed--keyword-search-volume or rowfeed--competitor-keywords, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the keyword-related siblings. The phrase 'AnswerThePublic alternative' hints at the use case but doesn't route an agent between this and competitor-keywords or keyword-search-volume. The agent must infer selection from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--keyword-search-volumerowfeed/keyword-search-volumeBDestructiveInspect
This tool calls the Actor "rowfeed/keyword-search-volume" and retrieves its output results. Actor description: Keyword research tool and Keyword Planner alternative, no SEO subscription: bulk Google and Bing search volume, CPC, competition and 12-month trend, keyword difficulty, search intent and AI search volume (ChatGPT), or keyword ideas from seed words. No per-keyword fee for keywords without data.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "Search volume" returns one row per keyword you enter. "Keyword ideas" returns related keywords Google Ads suggests for your seeds, sorted by search volume. Example values: "volume" | volume |
| keywords | No | In "Search volume" mode: the keywords to measure (thousands are fine; looked up 1,000 at a time). In "Keyword ideas" mode: seed words (up to 20 per lookup). Max 80 characters and 10 words each. Google Ads does not accept symbols like ! @ % , * ( ) or emoji, so such keywords are skipped with a warning row. Example values: ["web scraping","price tracking","keyword research","seo tools","lead generation"] | |
| language | No | Language name, e.g. "English", "German", "Spanish". Codes (de, fr, sk) and native names (Deutsch, Slovenčina) work too. Leave empty for all languages. Example values: "English" | English |
| location | No | Country, region or city as Google Ads names it, e.g. "United States", "United Kingdom", "Germany", "London,England,United Kingdom". Leave empty for worldwide (each batch then counts as 4 lookups, $0.16, instead of 1). Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxResults | No | Keyword ideas mode only: stop after this many keyword rows (Google Ads can suggest up to 20,000 per lookup). Example values: 500 | |
| searchEngine | No | Search volume from Google (Google Ads data), Bing (Bing Ads data) or both. Keyword ideas are Google only. A Bing lookup counts as 3 lookups. Example values: "google" | |
| includeDifficulty | No | Also add keyword difficulty (0-100, how hard it is to rank in Google top 10) and search intent (informational, commercial, transactional, navigational) to every Google keyword with data. +2 lookups ($0.08) per started 100 keywords. | |
| includeAiSearchVolume | No | Also add AI search volume: how often each keyword is asked in AI assistants such as ChatGPT per month, with a 12-month series (Google keywords with data). +1 lookup ($0.04) per started 100 keywords. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false, openWorldHint=true and destructiveHint=true, so the agent knows this is a billable, external, state-changing run rather than a pure read. The description adds one useful behavioral fact — 'No per-keyword fee for keywords without data' — but omits the per-lookup credit consumption, the paid-plan requirement, and the wait/cap/poll behavior that govern how results arrive. It also frames the tool primarily as 'retrieves its output results', which understates the cost-incurring run the annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the first of which is a generic wrapper ('This tool calls the Actor ... and retrieves its output results'), with the substantive content in the Actor summary. The feature enumeration is long but dense with selection-relevant facts — volume, CPC, difficulty, intent, AI volume, ideas — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and all parameters are fully described in the schema. What is still missing from the description is sibling routing (keyword-generator, competitor-keywords), the paid-plan/credit-cost reality of a run, and the polling behavior when waitSecs caps out — meaningful gaps for a billable 9-parameter Actor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 9 parameters (including mode-specific semantics, maxResults scope, and per-option cost multipliers) is already documented in the schema. The description adds no parameter meaning beyond that. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource plus a full feature inventory, but no sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the feature list: measure volume for known keywords, or generate ideas from seeds. The volume-vs-ideas routing is spelled out only inside the 'mode' schema property, not in the description. There is no statement of when to prefer this tool over the keyword-generator or competitor-keywords siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--pagespeed-insights-apirowfeed/pagespeed-insights-apiBDestructiveInspect
This tool calls the Actor "rowfeed/pagespeed-insights-api" and retrieves its output results. Actor description: Run Google PageSpeed Insights on a list of URLs: Lighthouse performance, accessibility, best-practices and SEO scores, LCP, CLS, TBT and INP, real-user Chrome data, Core Web Vitals pass/fail and the top slow-downs. Mobile and desktop.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Web pages to test, e.g. https://example.com/ or example.com/pricing. Up to 1,000 per run. Each page is tested once per device. Example values: ["https://apify.com/"] | |
| device | No | Test as a mobile phone (what Google ranks on), a desktop computer, or both (two rows per page). Example values: "mobile" | mobile |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false, openWorldHint=true and destructiveHint=true, so the agent knows this creates external state; the description does not contradict that and adds the metric set produced. However, it does not disclose that this kicks off an Actor run that may exceed the wait, that polling via nextStep/get-actor-run may be required, or that live lookups need a paid plan — those facts live only in the schema's waitSecs and top-level description fields, not here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the actual capability front-loaded in the second. Efficient overall, though the first sentence is pure template boilerplate restating the tool name and could be cut without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only three optional parameters, full schema coverage and an output schema, the description need not explain return values, and it does cover what the analysis measures. The main omission is asynchronous run behavior and cost/plan requirements, which matter for an open-world Actor invocation but are covered elsewhere in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already explains `urls`, `device` (with enum) and `waitSecs` including the 0–45 cap and fire-and-forget behavior. The description's mention of 'a list of URLs' and 'Mobile and desktop' lightly mirrors two parameters but adds no syntax, limits or defaults beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The second sentence names a specific analysis (Google PageSpeed Insights on a list of URLs) and enumerates the concrete outputs: Lighthouse performance, accessibility, best-practices and SEO scores, LCP, CLS, TBT, INP, real-user Chrome data and Core Web Vitals pass/fail. That is enough to distinguish it from the purely technical checker siblings. The opening sentence ('calls the Actor ... and retrieves its output results') is generic boilerplate that adds no specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to pick this over the many adjacent SEO siblings (rowfeed--seo-site-audit, rowfeed--google-serp-api, rowfeed--website-technology-checker), and no stated prerequisites. The only situational cue is the implicit 'list of URLs' + mobile/desktop framing, which an agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--pdf-table-extractorrowfeed/pdf-table-extractorADestructiveInspect
This tool calls the Actor "rowfeed/pdf-table-extractor" and retrieves its output results. Actor description: Convert PDF tables to Excel, CSV and JSON: bank statements, invoices, price lists and reports. Upload PDFs or paste links; get every table as rows plus one Excel file per PDF. Finds ruled and unruled tables. $3 per 1,000 pages with tables + $0.10 per 1,000 pages read.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Auto reads tables drawn with lines, and on pages without them finds tables by how the words line up (bank statements, price lists). Lines only or Aligned text only force one method. Example values: "auto" | auto |
| pdfs | No | Upload PDFs or paste links to them (one per line): bank statements, invoices, price lists, reports. Up to 200 per run, 50 MB each. Example values: ["https://raw.githubusercontent.com/kristerkb-pixel/rowfeed-seo-mcp/main/examples/bank-statement-example.pdf"] | |
| lastPage | No | Last page to read. 0 = to the end. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| firstPage | No | First page to read (1 = the first page). 0 = from the start. | |
| maxPagesPerPdf | No | Read at most this many pages of each PDF. Each page read costs $0.0001; pages with tables $0.003 more. Example values: 100 | |
| firstRowIsHeader | No | Use each table's first row as column names. Off: columns are col_1, col_2, ... and the first row is a data row. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful behavior beyond the annotations: per-page pricing ($3/1,000 pages with tables + $0.10/1,000 pages read) and the output shape (rows plus one Excel file per PDF). However, annotations declare destructiveHint=true and the description never explains what that means here — an agent could read that as file deletion. Cost is disclosed; the destructive flag is left dangling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence ('calls the Actor ... and retrieves its output results') is near-boilerplate inherited from the wrapper framing, but the Actor description that follows is dense and front-loads the capability, then inputs, then outputs, then price. Little waste beyond the opener.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and all seven parameters are fully described in the schema, including the waitSecs polling/nextStep behavior, so the description only needs to establish capability, input options, cost and output format — all present. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's pricing sentence loosely corresponds to maxPagesPerPdf and the table-finder sentence to mode, but the schema already documents both in more detail (including cost per page), so little unique meaning is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: convert PDF tables to Excel, CSV and JSON, with named input forms (PDFs or links) and named table-finding modes ('Finds ruled and unruled tables'). Clearly distinguishable from every listed sibling, all of which are scrapers/trackers rather than document converters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use-case context — bank statements, invoices, price lists, reports — and both input routes (upload vs paste links), which tells an agent when this is the right tool. It stops short of explicit when-not-to-use guidance or naming an alternative for non-PDF documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--redirect-checkerrowfeed/redirect-checkerADestructiveInspect
This tool calls the Actor "rowfeed/redirect-checker" and retrieves its output results. Actor description: Check thousands of URLs: HTTP status, every redirect hop, final URL, 301 or 302, redirect loops, dead links and response time. For SEO migrations and link audits. $0.10 per 1,000 URLs, invalid addresses free.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | The addresses to check, up to 50,000 per run. Without http:// or https://, https:// is used. Example values: ["http://apify.com","https://apify.com/store","https://www.iana.org/domains/example"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| onlyProblems | No | Leave out addresses that answer 200 directly. Only delivered rows are charged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the description only needs to add context. It does add a real behavioral trait — the cost model ($0.10 per 1,000 URLs, invalid addresses free) — which matters for a pay-per-run Actor. However, it says nothing about what "destructive" means here, about run duration for 50,000-URL batches, or about the polling handoff, so the added context is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the capability and then the use case and price; nothing is buried. The opening boilerplate "This tool calls the Actor ... and retrieves its output results" is filler that could be dropped without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the schema covers all parameters including the async polling escape hatch. What remains missing is sibling differentiation against the other link/redirect checking tools, which is the one thing an agent cannot derive from structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (urls, waitSecs, onlyProblems) are already fully documented in the schema, including defaults, the 0–45 range and the nextStep polling hint. The description adds no per-parameter meaning beyond a rough scale hint ("thousands of URLs"), which is baseline behavior when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb and resource — checking URLs for HTTP status, every redirect hop, final URL, 301/302 classification, redirect loops, dead links and response time — so an agent knows exactly what it produces. The only gap is that it never distinguishes itself from close siblings such as rowfeed--broken-link-checker or rowfeed--backlink-checker, which cover overlapping territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For SEO migrations and link audits" gives a use context, which is more than nothing. But there is no explicit when-not guidance and no named alternative, so an agent choosing between this and broken-link-checker or seo-site-audit must infer the boundary from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--seo-site-auditrowfeed/seo-site-auditBDestructiveInspect
This tool calls the Actor "rowfeed/seo-site-audit" and retrieves its output results. Actor description: Crawl a website and audit every page: title and meta description, H1, canonical, noindex, word count, images without alt, broken links, redirects and slow pages, with issue codes, a 0-100 SEO score per page and duplicate titles across the site. Plain HTTP, robots.txt respected.
| Name | Required | Description | Default |
|---|---|---|---|
| maxPages | No | How many pages of each site are audited. Each audited page is one charged event. Example values: 30 | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| startUrls | No | Start page of each site, e.g. https://example.com/. Pages on the same domain are followed from there. Example values: ["https://www.scrapethissite.com/pages/"] | |
| maxLinksPerSite | No | Upper limit on extra URLs checked for broken links per site. Example values: 2000 | |
| checkBrokenLinks | No | Also check every link and image the pages point to (other sites, images, pages beyond the limit) and list broken ones per page. Each extra URL checked is one charged event. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety bar is lower. The description adds genuinely useful behavioral context that annotations cannot convey: plain HTTP fetches, robots.txt respected, and same-domain crawling. It does not address the notable tension that a crawl-and-read operation is annotated destructive, nor does it mention cost/runtime behavior (charged per audited page, waitSecs capping) that affects how an agent should call it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: a thin wrapper preamble followed by a dense, front-loaded capability sentence. The enumeration of audited attributes is long but each item earns its place by advertising a distinct output dimension. Minor waste in the 'This tool calls the Actor...' boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so return values and parameters need no explanation here. What is missing is caller-relevant context an agent needs before invoking: that runs can be long and are capped by waitSecs with a nextStep follow-up, and that each audited page/checked URL is a billed event. Without that, an agent could fire this expecting an instant cheap result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter — maxPages, startUrls, maxLinksPerSite, checkBrokenLinks, waitSecs — is fully documented in the schema including billing implications and the nextStep polling pattern. The description adds no parameter-level meaning beyond the schema, which is the correct baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb and scope — crawl a website and audit every listed page attribute (title, meta, H1, canonical, noindex, word count, alt text, broken links, redirects, slow pages) with issue codes and a 0-100 score. That is materially more specific than the sibling rowfeed--broken-link-checker, which covers only links. It stops short of an explicit 'use this instead of X' distinction, so it is clear but not sibling-differentiating at the top level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumerated audit dimensions: it is the site-wide SEO audit tool rather than the single-purpose backlink or broken-link checkers. However, the description never states when to choose it over rowfeed--broken-link-checker or rowfeed--backlink-checker, nor when a full crawl is overkill. Guidance is inferable but unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--shopify-store-listrowfeed/shopify-store-listBDestructiveInspect
This tool calls the Actor "rowfeed/shopify-store-list" and retrieves its output results. Actor description: Lists of websites that use Shopify, WooCommerce, Klaviyo or any of 7,000+ technologies, filtered by country, language and domain rank, with each site's full tech stack. A BuiltWith alternative with no personal data.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Two-letter language code of the website's content, e.g. en, de, fr. Leave empty for any language. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| countries | No | Two-letter country codes, e.g. US, GB, DE, CA, AU. A website matches any of them. Leave empty for all countries. Up to 50. Example values: ["US"] | |
| maxResults | No | How many websites to return, strongest domains first. Up to 10,000 per run. Example values: 20 | |
| technologies | No | Technology names, e.g. "Shopify", "WooCommerce", "Magento", "Klaviyo", "Stripe", "WordPress", "HubSpot". With several, only websites using ALL of them are listed (e.g. Shopify + Klaviyo). Up to 10. Case does not matter; a misspelt name gets suggestions and costs only the run start. Example values: ["Shopify"] | |
| minDomainRank | No | Only websites with at least this domain rank (0-1000, higher = stronger site with more backlinks). 0 = no limit. | |
| crawledWithinDays | No | Only websites whose technologies were seen in the last N days, so closed and moved stores drop out. 0 = no limit. Example values: 180 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the run lifecycle in a minimal way ('calls the Actor and retrieves its output results'), which is consistent with the annotations. However, it never explains why destructiveHint is true (a paid, billable Actor run), nor that live lookups require a paid Apify plan — that constraint only appears buried in the schema's top-level description. No contradiction, but meaningful behavioral context is left to other fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Only two sentences and the substance is front-loaded after a short wrapper clause. The wrapper phrase 'This tool calls the Actor "..." and retrieves its output results' is boilerplate that adds little, and the closing 'A BuiltWith alternative with no personal data' is promotional, but overall the text is compact rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 optional parameters, full schema coverage, an output schema and annotations, the description covers the core capability adequately. What it omits — the paid-plan requirement, per-run cost implications, and the polling behavior — is partially recoverable from the waitSecs schema text but is not surfaced where an agent would look for scope and risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (language, countries, technologies, minDomainRank, maxResults, crawledWithinDays, waitSecs) documented including the AND semantics for multiple technologies. The description adds nothing about parameters beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The actor blurb states a specific resource and filters: lists websites using Shopify, WooCommerce, Klaviyo or 7,000+ technologies, filtered by country, language and domain rank, with full tech stack. That is far clearer than the tool name, which suggests a narrow Shopify-only list. It does not differentiate from close siblings such as rowfeed--website-technology-checker or rowfeed--website-traffic-checker.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the filtering capabilities (audience building, tech-stack prospecting); there is no explicit when-to-use or when-not-to-use statement. No alternative is named, so the agent must infer this tool is for bulk listing by technology versus the single-site checker sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--steam-game-datarowfeed/steam-game-dataADestructiveInspect
This tool calls the Actor "rowfeed/steam-game-data" and retrieves its output results. Actor description: Steam game data API: top sellers, games on sale, most wishlisted and most played, or any game by name, id or URL. Price and discount per country, players now, release date, developer, genres and Metacritic. $2 per 1,000 games.
| Name | Required | Description | Default |
|---|---|---|---|
| games | No | Games by Steam app id, store URL or name (the best match is used). Up to 1,000. | |
| lists | No | Steam lists to read, in Steam's order. Leave empty to look up only the games below. Example values: ["top_sellers"] | |
| country | No | 2-letter country code for prices, currency and lists: us, gb, de, fr, br, jp ... Example values: "us" | us |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxPerList | No | 1 to 100. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is partially covered, though the description never explains why a read-style data tool carries a destructive hint (i.e., that it creates and runs an Actor). It does add genuinely useful behavior beyond structured fields: the $2 per 1,000 games cost, the up-to-1,000-games cap, and the 0–45s wait cap with partial results at timeout.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the capability and data fields, with pricing appended last. The opening 'This tool calls the Actor ... and retrieves its output results' is platform boilerplate that adds little, but there is no real padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, zero-required scraping tool with an output schema and full schema coverage, the description supplies what the structured fields do not: cost model, volume limits, and data fields returned. The main remaining gap is the non-obvious run lifecycle (Actor start, polling, partial-result semantics), which is only hinted at inside waitSecs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including per-parameter text on games, lists, country, waitSecs and maxPerList, so the baseline is 3. The description's mention of input modes (name, id, URL) and country-level pricing mirrors what the schema already states rather than adding format examples or edge-case behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb/resource pair (retrieves Steam game data) and enumerates the exact result categories: top sellers, on sale, most wishlisted, most played, or any game by name/id/URL, plus fields like price, discount per country, players now, Metacritic. An agent can distinguish this from sibling scrapers such as google-play-scraper or apple-app-store-scraper by platform. It loses a point only because the framing sentence about 'calls the Actor ... and retrieves its output results' is boilerplate rather than differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the data categories offered, but there is no explicit when-to-use/when-not statement or named alternative among the many rowfeed-* siblings. The only routing guidance (follow `nextStep` to poll via get-actor-run, or set waitSecs to 0 for fire-and-forget) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--subdomain-finderrowfeed/subdomain-finderADestructiveInspect
This tool calls the Actor "rowfeed/subdomain-finder" and retrieves its output results. Actor description: Find subdomains of any domain from certificate logs, passive DNS and the Internet Archive, merged into one list, with a live DNS check and IP addresses. Bulk domains. $0.50 per 1,000 subdomains, domains with none are free.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | No | The domains to look up, up to 500 per run, e.g. example.com. A full link also works. Example values: ["apify.com"] | |
| checkDns | No | Check whether each subdomain resolves today and list its IP addresses. Included in the price. Example values: true | |
| onlyLive | No | Deliver only subdomains that resolve today. Old names from certificates are dropped, not charged. Needs the DNS check. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxSubdomainsPerDomain | No | Caps the cost of very large domains. Each subdomain delivered is one charge. Example values: 1000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare generic wrapper traits (readOnly=false, destructive=true, openWorld=true); the description supplies the genuinely useful behavior an agent needs — per-result pricing ($0.50 per 1,000 subdomains), that domains with no subdomains are free, and that the DNS check is included in the price. It does not contradict the annotations. It stops short of explaining run timing/async behavior, which is left to the waitSecs schema field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the capability statement before the pricing line, so the most decision-relevant information is front-loaded. The opening clause 'This tool calls the Actor ... and retrieves its output results' is boilerplate that earns little, but it is short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; with that covered, the description supplies purpose, sources, and cost model — everything an agent needs to decide to call it. Pagination/async follow-up is handled by waitSecs plus sibling get-actor-run, both already available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in-schema. The description adds only marginal meaning beyond that — 'Bulk domains' loosely points at the domains array, and the per-1,000-subdomain price gives context for maxSubdomainsPerDomain. Baseline 3 is appropriate when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Find subdomains of any domain' and names the data sources (certificate logs, passive DNS, Internet Archive) plus live DNS/IP enrichment. That is far more specific than the wrapper boilerplate 'calls the Actor X and retrieves its output results'. It does not name a sibling, but among the ~40 sibling tools only seo-site-audit and backlink-checker are even adjacent, so explicit differentiation is less critical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no alternative tool is mentioned. 'Bulk domains' hints at scale but does not tell the agent when this is preferable to running an SEO site audit that might include subdomains. Usage must be inferred entirely from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--tripadvisor-reviews-scraperrowfeed/tripadvisor-reviews-scraperADestructiveInspect
This tool calls the Actor "rowfeed/tripadvisor-reviews-scraper" and retrieves its output results. Actor description: Export the newest or most detailed Tripadvisor reviews of any hotel, restaurant or attraction: rating, title, text, date, visit month, language, reviewer country and owner reply, plus the place's rating and star breakdown. Paste Tripadvisor links. About $0.50 per 1,000 reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| places | No | One Tripadvisor link per line: a hotel, restaurant, attraction, tour or vacation rental page on any Tripadvisor country site (open the place on Tripadvisor and copy the address). Up to 500 per run. Example values: ["https://www.tripadvisor.com/Hotel_Review-g186338-d187686-Reviews-The_Savoy-London_England.html"] | |
| sortBy | No | Which reviews come first: the newest, or the most detailed (Tripadvisor's own order). Example values: "newest" | newest |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| newerThan | No | Leave out older reviews: a date (2026-10-01) or an age (7 days, 2 weeks, 3 months). Left-out reviews are not charged. With "Newest first", no further reviews are fetched once the cutoff is reached, which makes scheduled monitoring cheap. | |
| maxReviews | No | How many reviews to get per place, in the chosen order. Up to 500 per run. Places with fewer reviews only pay for what they have. Example values: 20 | |
| onlyWithText | No | Leave out reviews that have no text. Left-out reviews are not charged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and openWorldHint=true, and the description adds the two pieces of context that matter most for that risk profile: per-review cost (~$0.50 per 1,000) and the paid-plan requirement for live lookups. It still doesn't explain the asynchronous Actor-run semantics in the description body (that lives only in the waitSecs parameter text) or what 'destructive' means here beyond spending money.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with little waste, and the resource and return fields are front-loaded before the pricing note. The opening boilerplate about calling the Actor and retrieving its output results is framing rather than information, but it is brief enough not to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and all six parameters fully documented in the schema, the description only needs to establish purpose, cost and access constraints, which it does. The remaining gap is behavioral: the polling/terminal-state lifecycle is documented in the waitSecs parameter rather than the description, which is acceptable given the structured coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains places, sortBy, maxReviews, newerThan, onlyWithText and waitSecs in detail. The description adds almost no parameter meaning beyond echoing 'newest or most detailed' for the sort order; the billing-per-review note is the only increment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: exporting Tripadvisor reviews for hotels, restaurants or attractions, and enumerates the returned fields (rating, title, text, date, visit month, language, reviewer country, owner reply, star breakdown). The Tripadvisor scope implicitly distinguishes it from siblings like google-maps-reviews-scraper and trustpilot-reviews-scraper, but those alternatives are never named, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Paste Tripadvisor links' tells the agent the input form, and the pricing line ('About $0.50 per 1,000 reviews') plus the schema note about a paid Apify plan give cost context. There is no explicit when-to-use/when-not statement and no routing to the alternative review scrapers in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--trustpilot-reviews-scraperrowfeed/trustpilot-reviews-scraperADestructiveInspect
This tool calls the Actor "rowfeed/trustpilot-reviews-scraper" and retrieves its output results. Actor description: Export the newest or most relevant Trustpilot reviews of any company: star rating, title, full text, date, language, verified flag, reviewer country and company reply, plus the company's TrustScore and review count. Paste Trustpilot links, websites or domains. About $0.25 per 1,000 reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| sortBy | No | Which reviews come first: the newest, or the most relevant (Trustpilot's default). Example values: "newest" | newest |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| companies | No | One company per line: its Trustpilot page (any country site, e.g. https://www.trustpilot.com/review/www.booking.com), its website, or just its domain (booking.com). Up to 500 per run. Example values: ["https://www.trustpilot.com/review/www.booking.com"] | |
| newerThan | No | Leave out older reviews: a date (2026-10-01) or an age (7 days, 2 weeks, 3 months). Left-out reviews are not charged. With "Newest first", no further reviews are fetched once the cutoff is reached, which makes scheduled monitoring cheap. | |
| maxReviews | No | How many reviews to get per company, in the chosen order. Up to 200 (the most Trustpilot's data provider returns per company). Companies with fewer reviews only pay for what they have. Example values: 20 | |
| onlyWithText | No | Leave out reviews that have no text. Left-out reviews are not charged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and destructiveHint=true, and the description usefully adds the cost model (~$0.25 per 1,000 reviews) and the paid-plan prerequisite for live lookups. However, it never acknowledges that invoking it creates an Actor run with side effects and possible cost, nor how partial/long runs are handled — those mechanics only appear inside the waitSecs parameter description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the scope and then the returned fields and pricing. The opening 'calls the Actor ... and retrieves its output results' is harness boilerplate rather than tool-specific information, but overall it is tight with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shape, and it covers inputs, breadth limits, pricing, and plan requirements well. The remaining gap is the run lifecycle and destructive side effects, which an agent would want before firing a paid, write-like operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries full parameter meaning including the sortBy enum, the 0–45 waitSecs cap, the 500-company limit, and the 200-review cap. The description repeats the accepted company input formats but adds nothing beyond what the schema states; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource — exports Trustpilot reviews for a company — and enumerates the returned fields (star rating, title, text, date, verified flag, reply, TrustScore). It is clearly distinguishable from siblings like tripadvisor-reviews-scraper or google-maps-reviews-scraper by the platform named, though it never explicitly contrasts with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the accepted input forms (Trustpilot page, website, or bare domain) and the note that live lookups require a paid Apify plan. There is no explicit statement of when to choose this over the other review scrapers in the sibling list, nor any when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--website-contact-finderrowfeed/website-contact-finderBDestructiveInspect
This tool calls the Actor "rowfeed/website-contact-finder" and retrieves its output results. Actor description: Find company emails, phone numbers, social profiles and address from any website's own contact pages. Bulk lists or an Apify dataset. GDPR-safe role addresses only. $2 per 1,000 websites with an email or phone; the rest are free.
| Name | Required | Description | Default |
|---|---|---|---|
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| websites | No | Company websites or domains, one per line (acme.com, https://www.acme.co.uk ...). Duplicates are removed. Up to 10,000 per run. Example values: ["plausible.io","tibber.com","ghost.org"] | |
| datasetId | No | E.g. the results of a Google Maps, SERP or leads run. The website is read from the field below, or from website / url / domain automatically. | |
| datasetField | No | Leave empty to use website, url or domain automatically. | |
| maxPagesPerSite | No | The home page plus contact, about and imprint pages. 5 finds almost everything; the price is per website, not per page. Example values: 5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present the bar is lower, and the description does add real value: per-website pricing ($2 per 1,000 websites yielding an email or phone, others free) and the GDPR constraint limiting output to role addresses. But it does not explain the destructiveHint=true annotation, nor what running the Actor actually changes or creates (a run and dataset). Pricing and compliance are the only behavioral disclosures beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is pure boilerplate about calling an Actor and retrieving results, but the second sentence is dense and front-loaded with the useful facts (what it finds, bulk/dataset modes, GDPR, pricing). Overall compact but with one wasted opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five parameters are richly documented in the schema, an output schema exists so return values need no explanation, and the description covers scope, limits and cost. The remaining gap is the unexplained destructiveHint=true and the lack of any note on run/dataset side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in detail, including waitSecs semantics and the datasetField fallback. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: find company emails, phone numbers, social profiles and addresses from a website's own contact pages. That clearly separates it from sibling scrapers like rowfeed--google-maps-scraper or rowfeed--website-technology-checker. The first sentence is generic wrapper boilerplate ('calls the Actor ... retrieves its output results') that adds nothing, but the Actor description does the real work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Bulk lists or an Apify dataset' implies two distinct input modes, which the schema then maps to `websites` vs `datasetId`. However, there is no guidance on when to prefer this tool over related siblings (e.g., Google Maps scraper for place contact data) and no stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--website-technology-checkerrowfeed/website-technology-checkerADestructiveInspect
This tool calls the Actor "rowfeed/website-technology-checker" and retrieves its output results. Actor description: Find the tech stack of any website: CMS, e-commerce platform, analytics, ad pixels, marketing and chat tools, payments, frameworks, hosting and CDN. Bulk domains in, one row per site out, grouped by category. $2 per 1,000 websites; sites that block visits are looked up in a technology database.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | No | One website per line: a domain (shopify.com) or any link on the site. Up to 5,000 per run. Example values: ["apify.com","wordpress.org","vercel.com"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| useDatabase | No | Some sites refuse automated visits. On: look them up in a licensed technology database instead ($0.02 per lookup, also when it has no data). Off: they get a free error row. Needs a paid Apify plan. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses cost ($2 per 1,000 websites, $0.02 per lookup even on empty results), the paid-plan prerequisite, and the fallback behavior for sites that block automated visits. The waitSecs parameter description adds run-lifecycle behavior (cap at 45s, nextStep polling, fire-and-forget at 0). It does not reconcile the stated 'retrieves its output results' framing with the destructiveHint=true annotation or explain that a billable Actor run is launched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the Actor identity and then the capability and pricing. The opening 'This tool calls the Actor ... and retrieves its output results' is boilerplate that consumes space without adding selection value, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description needn't explain return values, and it supplies the cost and blocked-site fallback an agent needs before spending money. The main residual gap is that run lifecycle is delegated entirely to the waitSecs parameter text rather than surfaced at the top level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented with limits, defaults, and examples. The description adds only the pricing rationale behind useDatabase, which is marginal value over the schema. Baseline 3 applies when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: retrieve a site's tech stack (CMS, e-commerce, analytics, pixels, payments, frameworks, hosting/CDN) for bulk domains, one row per site. That is materially more specific than the tool name alone and clearly separates it from siblings like website-traffic-checker or pagespeed-insights-api. It stops short of explicitly naming which sibling to use instead for adjacent tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Bulk domains in, one row per site out' tells an agent this is the bulk-batch option, and the blocking-site fallback is described. There is no explicit when-not guidance and no routing to alternatives such as website-traffic-checker or seo-site-audit for overlapping intents, so the agent must infer boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--website-traffic-checkerrowfeed/website-traffic-checkerADestructiveInspect
This tool calls the Actor "rowfeed/website-traffic-checker" and retrieves its output results. Actor description: Check website traffic and domain authority for up to 10,000 domains: estimated Google organic and paid traffic, ranking keywords, domain rank, referring domains and backlinks. Any country. A Similarweb alternative for search traffic, pay per domain, no subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | No | Websites to check: domains or full URLs (reduced to the domain). Up to 10,000. Example values: ["hubspot.com","salesforce.com","zoho.com"] | |
| language | No | Search language for the traffic estimate when a country is set. Example values: "English" | English |
| location | No | Estimate Google traffic from one country, e.g. "United States", "Germany". Empty = all countries. Authority and backlinks are always global. | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true) already flag this as a mutating, external-world call, so the description's job is to add operational context. It does add the cost model ('pay per domain, no subscription') and scale ceiling (10,000 domains), but it says nothing about the asynchronous run lifecycle, the waitSecs cap behavior, or polling via get-actor-run — all of which is left to the schema. The description also does not address the odd destructiveHint=true for what is essentially a data retrieval operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences and the capability statement is front-loaded after the template opener. The second sentence carries a bit of marketing filler ('A Similarweb alternative ... no subscription') that isn't needed for tool selection, but overall it is compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so return values and parameter semantics do not need coverage here. What remains thin is the decision boundary against overlapping SEO siblings and the free-vs-paid plan caveat, which is buried in the schema description rather than the tool description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (domains, language, location, waitSecs) are already fully documented in the schema, including the 0–45 second cap and nextStep polling guidance. The description adds no parameter-level meaning beyond what is structured — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: calls the rowfeed/website-traffic-checker Actor and returns traffic/authority metrics (organic and paid traffic, keywords, domain rank, referring domains, backlinks) for up to 10,000 domains. That is specific enough to act on, but it never distinguishes itself from near-duplicate siblings such as rowfeed--da-pa-checker (domain authority) and rowfeed--backlink-checker (referring domains/backlinks), which the description explicitly claims to return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated — 'Check website traffic and domain authority for up to 10,000 domains' tells an agent the shape of the job, and 'Any country' hints at the location parameter. There is no explicit when-to-use or when-not guidance, no routing to alternatives like da-pa-checker or keyword-search-volume, and no mention of the paid-plan prerequisite that sits inside the schema description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--youtube-search-apirowfeed/youtube-search-apiBDestructiveInspect
This tool calls the Actor "rowfeed/youtube-search-api" and retrieves its output results. Actor description: Get the videos YouTube shows for any keyword and country: position, title, views, upload date, length, Shorts flag and channel, plus where your channels rank. A YouTube search scraper and YouTube rank tracker, no API quota or key needed.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | No | What to search on YouTube, one keyword per line. Up to 1,000 per run. Example values: ["best running shoes"] | |
| language | No | YouTube interface language, e.g. "English", "German". Example values: "English" | English |
| location | No | Search as a viewer in this country, e.g. "United States", "United Kingdom", "Germany". Example values: "United States" | United States |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| maxResults | No | How many videos to return per keyword, in the order YouTube shows them. Up to 200. Example values: 20 | |
| includeShorts | No | Keep YouTube Shorts in the results. Turn off for regular videos only. Example values: true | |
| trackChannels | No | Channels whose position you want per keyword: @handle, channel URL or channel ID (UC...). Adds one free summary row per keyword and channel. Example values: ["@RunnersWorld"] |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, and the description is consistent with that by framing the call as invoking an Actor and retrieving its output. It adds that no API quota or key is needed, but omits two material behaviors: that live lookups require a paid Apify plan, and that the call is asynchronous with a capped wait (waitSecs/nextStep polling) — the latter appears only inside the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substantive content sits in the second sentence (the Actor description), while the first sentence is generic MCP boilerplate ('calls the Actor ... and retrieves its output results') that repeats what the runtime already does. The purpose is therefore not front-loaded and could be tightened by leading with what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and full parameter documentation, the description only needs to explain the operation, and it does so adequately by listing the fields returned and the rank-tracking feature. The remaining gap is the paid-plan prerequisite and the poll-on-cap behavior, which an agent calling with a low waitSecs would need to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all seven parameters, including keywords, language, location, waitSecs, maxResults, includeShorts and trackChannels, so the schema does the heavy lifting. The description adds no parameter-level meaning beyond mentioning 'keyword and country' and the rank-tracking output, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it runs the rowfeed/youtube-search-api Actor and returns the videos YouTube surfaces for a keyword and country, including position, title, views, upload date, length, Shorts flag, channel, and channel rank. That is concrete enough to distinguish it from rowfeed--youtube-transcript-api, but it never names that sibling or any other, so differentiation is left to inference from the returned fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer it should use this for YouTube keyword/rank lookups in a given country, but there is no explicit when-to-use or when-not-to-use statement and no pointer to alternatives such as the transcript or Google SERP tools. The 'no API quota or key needed' line hints at a reason to prefer it but does not route the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rowfeed--youtube-transcript-apirowfeed/youtube-transcript-apiBDestructiveInspect
This tool calls the Actor "rowfeed/youtube-transcript-api" and retrieves its output results. Actor description: YouTube transcript extractor: the full transcript of any YouTube video (also Shorts and lives) as clean text plus timed segments, with title, language, duration and word count. Bulk up to 1,000 videos. $4 per 1,000 transcripts. Licensed data, no blocked runs.
| Name | Required | Description | Default |
|---|---|---|---|
| videos | No | Video links (watch, youtu.be, Shorts, live, embed) or 11-character video ids. Up to 1,000 per run. Example values: ["https://www.youtube.com/watch?v=8jPQjjsBbIc"] | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| includeTimestamps | No | Also return every caption line with its start and end time (seconds). Off = full text only. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is already carried structurally. The description adds genuinely non-redundant context: $4 per 1,000 transcripts, a 1,000-video bulk ceiling, and exactly what the output contains (title, language, duration, word count). It does not explain that a run is asynchronous and must be polled, but the waitSecs schema description already covers that with a pointer to get-actor-run.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence ('This tool calls the Actor ... and retrieves its output results') is boilerplate that conveys nothing the name does not. The second sentence is dense and informative but includes promotional phrasing ('Licensed data, no blocked runs') that does not help an agent invoke the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shapes, and it still summarizes them usefully. Annotations plus the schema cover the run/polling mechanics; the remaining gap is only an explicit statement that live lookups require a paid plan, which currently lives solely in the schema-level description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters in detail, including the waitSecs 0–45 range and fire-and-forget semantics. The description only echoes the video bulk limit and the timed-segment concept tied to includeTimestamps, adding little beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: extracting the full transcript of a YouTube video, including Shorts and lives, returned as clean text plus timed segments. That clearly separates it from the sibling rowfeed--youtube-search-api (discovery vs. transcript retrieval), though the differentiation is only implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says when to prefer this over rowfeed--youtube-search-api for finding videos, or what prerequisites exist beyond the schema note about a paid Apify plan. The only steering text ('Bulk up to 1,000 videos') is a capacity note inside the Actor blurb, not an invocation guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
2 tool updates
- Changed
rowfeed--career-site-jobs-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / posted_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
rowfeed--career-site-jobs-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / posted_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
2 tool updates
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
2 tool updates
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
2 tool updates
- Changed
rowfeed--career-site-jobs-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / posted_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
3 tool updates
- Changed
rowfeed--career-site-jobs-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / posted_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
2 tool updates
- Changed
rowfeed--career-site-jobs-scraper4 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / country / typePrevious value: -"null"New value: +[ + "null", + "string" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / errorMessageAdded value: +{ + "type": "string" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / posted_at / typePrevious value: -"string"New value: +[ + "null", + "string" +]
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
3 tool updates
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
3 tool updates
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
1 tool update
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
1 tool update
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
2 tool updates
- Changed
rowfeed--google-maps-reviews-scraper3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
1 tool update
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
3 tool updates
- Changed
rowfeed--google-maps-reviews-scraper8 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / original_language / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / place_id / typePrevious value: -"string"New value: +[ + "null", + "string" +] - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_highlights / properties / Child-friendlinessAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_highlights / properties / Historical informationAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_highlights / properties / Reservation recommendedAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_highlights / properties / Visited onAdded value: +{ + "type": "string" +} - added
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_highlights / properties / Wait timeAdded value: +{ + "type": "string" +} - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / review_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
1 tool update
- Changed
rowfeed--youtube-search-api6 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / best_position / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_id / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / channel_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / description / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_at / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / published_text / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
1 tool update
- Changed
rowfeed--redirect-checker3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / final_url / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / status / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
Related MCP Connectors
AI visibility + fact-checks (ChatGPT/Perplexity), review gaps & competitor scans, local SEO.
Find where ChatGPT names your competitor, write the page that closes the gap, measure it.
AI visibility for your brand: scores, competitors, prompts, site health and articles.
AI-search visibility: GEO audits, tracked prompts, competitors, citations.
Related MCP Servers
- AlicenseAqualityBmaintenanceAI visibility and SEO data for AI agents. Check whether ChatGPT, Claude, Perplexity and Gemini mention your brand and which sources they cite, plus keyword volume and Google Trends.29862 npm1MIT

seocrawl-mcpofficial
AlicenseBqualityCmaintenanceSEO + GEO MCP server: live Google Search Console & GA4 data, keyword and page analysis, AI-visibility tracking across ChatGPT, Claude, Gemini & Perplexity, site audit and SEO task management — all from chat.382MIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to scan brand visibility across ChatGPT, Claude, Gemini & Perplexity, analyze website GEO readiness, compare competitors, and get actionable recommendations.MIT
- AlicenseAqualityDmaintenanceTrack brand visibility across ChatGPT, Perplexity, Claude, and Gemini.6188 npm11MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.