find-and-run skill
How the looot plugin's find-and-run skill searches by job, runs with fallback, and reads the outcome and receipt.
find-and-run is the plugin’s core skill. It loads automatically whenever a task needs external
or live data: SEO and SERP data, keyword volume, backlinks, people and company enrichment, email
finding and verification, social profiles, or web scraping.
What it does
The skill uses search, inspect, run, runs_get, runs_list, runs_evidence and balance.
Searching and inspecting are free. discover_smart costs a small fee, so the skill asks before
using it.
- Search by the job, not the vendor. It calls
searchwith a plain-words query, for example “find a work email from a name and domain”. Each row has anendpointId,provider, the job id incapability,estimatedPrice,priceBasis, andcostPerSuccessUsd(price divided by success rate).worksholdsrate,runsandp50Ms;thin: truemeans fewer than 5 runs back the rate.accessisruns_now,needs_your_accountorcoming_soon. - Read
jobInputs. The search answer’s top-leveljobInputslists each job’s inputs with coverage, so the agent knows which field name gets accepted by the most providers. - Run the job. It sends
endpointId: "job:<job id>"with the shared input names fromjobInputs, plus a newidempotencyKeyfor every run and, usually, afallbackobject (maxAttempts,maxCostUsd,prefer). looot tries providers of that job in order, free ones first, inside one hold. - Read the answer. It checks
statusanderrorfirst, since a call can succeed and still carrystatus: "failed". Then it readsoutcome(hit,weak,miss,error,rejected,skippedorpending),normalized.fieldswhen the job has one,servedEndpointIdandservedProviderId(who actually answered, which can differ fromendpointIdafter a fallback),requestedJobfor what was asked, androutefor the fallback trail (servedBy,outcome,chargedUsd,attempts,skipped,summary). - Get the receipt.
runs_evidencefor every attempt with its cost, orruns_listfor history.
If search comes back empty with a no_supply_for_job warning, the skill tells the user no
endpoint does that job, and can call capability_request to ask looot to add one.
Worked example
User: “Find the work email of Jane Doe at example.com.”
The agent searches, then runs the job with fallback:
{"tool": "search", "input": {"query": "find a work email from a name and domain"}}
{
"tool": "run",
"input": {
"endpointId": "job:people.email.find",
"input": {"first_name": "Jane", "last_name": "Doe", "domain": "example.com"},
"idempotencyKey": "jane-doe-example-find-01",
"fallback": {"maxAttempts": 3, "maxCostUsd": 0.1, "prefer": "cheapest"}
}
}
The run comes back completed, with outcome: "hit", normalized.fields.email set,
servedProviderId naming the provider that answered, and route.summary reading something like
“hunter: found ($0.0245). Charged $0.0245.”
Agent’s answer: “Found jane.doe@example.com, served by [provider from servedProviderId].
Charged [actualCost]. Verify it before sending anything important; see the money and
troubleshooting skills for what a weak or guessed result means.”
See money for cost rules, recipes for ready-made flows, and troubleshooting for error codes.