Start here. This is the direct spoken answer to practice first.
Why this matters
Response types connect endpoint implementation to HTTP outcomes, OpenAPI metadata, and tests. Useful typing makes the allowed success and failure contracts visible without turning every endpoint into an unreadable union.
In controllers, ActionResult<T> expresses that an action normally returns a body of type T but may also return HTTP results such as not found or bad request. Minimal APIs can use IResult, concrete TypedResults, or a Results<T1,T2> union. I prefer the narrowest form that represents the endpoint's real outcomes and keeps status codes and response bodies clear to both readers and generated documentation.