{at 'path'} answers the value an @ expression points at - the same notation a field can carry, {$name@staff}, written as a tag with the path as a quoted parameter. The part after the @ says where to look: a data set made with {data}, an array of the page, a _data/ file, a stored sequence, or an enclosing level by name.

The part before the @ is a path through that data, its steps separated by dots. A plain step is a field name - owner.phone@shop descends into the owner object. A step id='b2' picks, among the rows at that point, the one whose id field is b2, so {at "id='b2'.name@staff"} is the name of the row with that id. Steps can be chained as deep as the data goes: {at "country.id='f0_162'.province.id='f0_17460'.name@mondial"}. A row can also be named by its key - 1.city@cities - and @globals searches the page's variables: {at 'order.total@globals'}. In a {data} set a bare field name searches the rows and answers the first one that has it.

The tag asserts its path: under the strict syntax check a path that reaches nothing - or an empty value - is an error naming the path. The field form ({$name@staff}) is searched more leniently, which is what optional lookups rest on. Use the lookup pipe to find one row by a key for every row of a loop.