apply
takes individual values and then as its last argument, a collection of remaining values, so that last argument is always different. I think that's the fundamental bit you're missing. The last arg collection's values are spliced into the invocation.
Generic example:
(f 1 2 3 4)
can be written as any of these (these are all equivalent):
(apply f 1 2 3 4 nil)
(apply f 1 2 3 4 [])
(apply f 1 2 3 [4])
(apply f 1 2 [3 4])
(apply f 1 [2 3 4])
(apply f [1 2 3 4])
In your example, conj is a function that will take a collection first, so the first arg should always be a vector. And then you expect spliced values to come in with subsequent values. Using numbers instead for brevity these are equivalent:
(conj [1] 2)
(apply conj [1] 2 nil)
(apply conj [1] [2])
Or 3 values:
(conj [1] 2 3)
(apply conj [1] 2 3 nil)
(apply conj [1] 2 3 [])
(apply conj [1] 2 [3])
(apply conj [1] [2 3])