Inputs
Outputs
Reference the matched records downstream as
{{ steps.find_records.records }}, and the count as {{ steps.find_records.number_of_matches }}.
Behavior
The block runs your filter against the chosen object and returns the records that match. They come back in the order Attio returns them. When nothing matches, the run does not fail. It continues with an empty list and a count of0. So if an empty result should change what happens next, guard the later steps with an If block.
The block always returns a list, not a single record. Some blocks expect one record, such as Update record. If you wire the list straight into one of those, it uses only the first match and silently ignores the rest. To act on every match, pass the list into a Loop and put the write step inside the loop.
The 100-record cap is a hard ceiling on what one run can see. A filter that matches 400 deals returns 100. The other 300 never enter the run. For larger working sets, narrow the filter so each run handles a slice. You can also schedule the workflow to run more often against a moving condition, such as “last touched more than 30 days ago”.
Gotchas
- Limit is required and rejects values over 100. The block will not save without a
Limit, and the field caps at 100. Set it to the largest batch one run should process. Then design the filter so the working set fits, rather than assuming the block will page through everything. - A multi-record result collapses into the first match. Connecting
{{ steps.find_records.records }}into a single-record input takes record one and drops the rest with no error. Wrap the write in a Loop whenever the filter can return more than one record. - An empty result does not stop the run. A filter that matches nothing yields an empty list, and downstream blocks still run against it. Branch on
{{ steps.find_records.number_of_matches }}with an If block when “no matches” should take a different path. - The count reflects only what was returned.
Number of matchesreports the records inside the limit, not the true total in the object. Do not treat it as a complete population count when the filter can match more than 100 records.
Examples
Sweeping stale open deals on a schedule
A nightly run finds open deals that have not moved recently, then creates a follow-up task for each.
The block returns up to 100 stale deals. A Loop over
{{ steps.find_records.records }} then runs Create task once per deal.
Finding a company by domain before creating a duplicate
A webhook-triggered run looks for an existing company on the inbound domain. That way the workflow can update it instead of creating a second record.{{ steps.find_records.number_of_matches }} is 1 and the run routes to Update record. When it is 0, the run routes to Create record instead.