a subcircuit
Some parts, an op-amp, a voltage regulator, a whole sensor, are far too complex to capture with one '.model' line. A subcircuit is the answer: it bundles a little network of primitive components into a reusable block with a name and a few terminals, so you can drop the whole thing into your circuit as if it were a single part, without caring what is inside.
A subcircuit is defined between '.subckt name pin1 pin2 ...' and '.ends'. Inside lives a miniature schematic, the dozens of transistors, resistors, and current sources that mimic an op-amp's behaviour, but from outside you only see its pins (inputs, output, supplies). You place it with an X line, like 'X1 in+ in- out vcc vee TL081', connecting your nodes to its pins. This is exactly how manufacturers ship models of complex parts, and how you can build your own reusable block (a filter stage, a sensor model) and reuse it many times.
Subcircuits are what make large simulations manageable, you reason about a block by its terminals, not its guts, the same modularity good hardware design uses. Two honest notes: a subcircuit is only as accurate as whoever built it (a vendor's macromodel may simplify the internals to run fast, trading away some real behaviour), and the internal nodes are local, a node named out inside one subcircuit is not the same as out in your main circuit, which keeps blocks safely isolated.
An op-amp model arrives as '.subckt TL081 1 2 3 4 5 ... .ends'; you never touch its internal transistors, you just write 'X1 3 2 6 7 4 TL081' to wire its plus, minus, output, and supply pins into your design.
A named, multi-terminal block of components you drop in as a single part without minding its insides.
A subcircuit hides complexity but does not guarantee accuracy, a fast macromodel may deliberately simplify the internals. Its internal node names are private and never clash with your main circuit's nodes.