unknown at every boundary, and a parse step after it

Typing an API response as its expected interface is a claim about a server you do not control, checked by nothing.

// a lie, checked by nothing
const order = await res.json() as Order

// honest, and forces a decision
const raw: unknown = await res.json()
const order = OrderSchema.parse(raw)      // zod, or similar

// the value: a shape change upstream fails at the
// boundary with a message naming the field, rather than
// as undefined somewhere deeper.

The cast is the most common lie in a TypeScript codebase and it is comfortable because the compiler stops complaining. Parsing at the boundary costs a schema definition per response and turns an upstream change into an error with a field name, which is the difference between a five-minute diagnosis and an afternoon.