Skip to main content
Glama

rowfeed/dataset-merge-dedup

rowfeed--dataset-merge-dedup
Destructive

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.

Input Schema

NameRequiredDescriptionDefault
keepNo"Last" keeps the newest version of each row, e.g. when merging today's run into yesterday's. Example values: "first"first
rowsNoOr 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"}]
fileUrlsNoPublic links to CSV (comma, semicolon or tab), JSON array or JSON Lines files, up to 50 MB each. Excel: save as CSV first.
waitSecsNoMax 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.
addSourceNoAdd _source to each row: which dataset, file or input the row came from.
datasetIdsNoDatasets 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).
looseMatchNoIgnore upper/lower case and extra spaces, and treat http/https, www. and a trailing slash in URLs as the same. Example values: true
dedupFieldsNoRows 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"]
outputFieldsNoOptional: keep only these columns, in this order (dots flatten nested fields). Empty = all fields.

Output Schema

NameRequiredDescriptionDefault
tipNoAdvisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key
runIdYesActor run ID
statsNoRun statistics
statusYesRun status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED
actorIdYesStable Apify Actor ID from the run record
summaryYesPast-tense summary of the run state
exitCodeNoActor process exit code; populated for terminal states (especially FAILED)
nextStepYesOne primary follow-up action with identifiers interpolated
storagesYesDataset and key-value store metadata, keyed by alias. "default" is always the primary entry.
actorNameNo"username/actor-name"
startedAtNoISO timestamp when the run started
finishedAtNoISO timestamp when the run finished (terminal states only)
statusMessageNoPass-through from Apify run.statusMessage
apifyConsoleUrlNoPersonalized Apify Console link to the run; present only for Console sessions

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Added value: +{
      +  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      +  "properties": {
      +    "company": {
      +      "type": "string"
      +    },
      +    "website": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • removedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Removed value: -{
      -  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      -  "properties": {
      -    "company": {
      -      "type": "string"
      -    },
      -    "website": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Added value: +{
      +  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      +  "properties": {
      +    "company": {
      +      "type": "string"
      +    },
      +    "website": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Added

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.