Zod [0] isn't too bad for runtime types and runtime type evaluation. It even has JSON schema output now [1], though most of my API uses of Zod have been with Hono's "RPC" [2] which does a bunch of type magic to build a type-safe API client from your API types directly (in projects where you can share front-end and back-end types).

[0]: https://zod.dev/

[1]: https://zod.dev/json-schema

[2]: https://hono.dev/docs/guides/rpc