waterfall_tech_act
Run the tech stack waterfall over a TABLE's rows, on the server — op update_rows.
Nothing personal goes through this call, and nothing found comes back: name the
rows and the columns once, oto reads each row, runs the same cascade as
waterfall_tech and writes the find into the row.
Cheaper than one call per row: only rows whose status_column is empty are
taken, and each gets found (its provider in the status comment), no_match
or failed — so a row is never paid twice; call again with the
same arguments until remaining is 0 (clear a status to retry that row).
no_match is written only when a provider answered without finding and none
failed: a row whose steps failed or never ran stays empty, its code in errors. Rows
with the same inputs share ONE lookup. Up to 8 rows run in parallel; a call
that runs out of time says stopped: "time_budget" and leaves the rest pending.
⚠️ The asynchronous steps (none) are left out here — they would answer
after the row is written; the one-contact tool collects them.
The answer is counts plus errors: [{row_id, code}]; dry_run reads the rows,
counts the lookups and returns the first one's plan, calling nothing.
From a hosted agent, a step whose tool the agent may not call is skipped and
its rows stay pending (tool_not_in_job, not a quota): the answer then names
them (missing_tools) with the owner's one-click fix.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"op": "<op>",
"datastore": "<datastore>",
"inputs": "<inputs>",
"output": "<output>",
"status_column": "<status_column>"
},
"name": "waterfall_tech_act"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | `update_rows`. | |
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| roles | No | ||
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| filter | No | data_rows filter grammar; `{}` = every row not yet treated. | |
| inputs | Yes | {input: column} — inputs are `domain`, `company_name`. Map every column you have: more inputs open more (and cheaper) steps. | |
| output | Yes | {field of the find: column} — `technologies`, `count`, `source` (website | vendor_database | job_postings), `by_category`, `matched` (with `technologies`), or `provider`. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| dry_run | No | read and plan only — nothing called, nothing written. | |
| qualify | No | ||
| row_ids | No | the rows to run (at most 50). Exclusive with `filter`. | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| datastore | Yes | the table, by name or number. | |
| providers | No | the steps to try, in order, for these rows (see `waterfall_tech`). | |
| batch_size | No | rows per call with `filter` (1-50, default 25). | |
| qualify_min | No | ||
| technologies | No | as on `waterfall_tech`, the same for every row — a row is `found` only when one of them is detected, `no_match` when none is. | |
| apify_max_usd | No | ||
| status_column | Yes | where found | no_match | failed is written. | |
| max_paid_steps | No | ||
| people_per_row | No |