GraphQL
A query language and runtime where the client specifies exactly which fields it needs, against a typed schema, usually via a single endpoint.
It solves two specific REST problems: over-fetching (the endpoint returns twenty fields, the screen needs three) and under-fetching (the screen needs data from four endpoints, so it makes four round trips). For a product with several client types evolving at different speeds, that is a real and recurring cost.
What it costs is mostly on the server. Caching is harder because HTTP caching keys on URL and every query is a POST to one path. N+1 resolution is the default failure mode and needs batching (DataLoader) to avoid a database query per item. And because the client controls query shape, a deeply nested query is a denial-of-service vector unless you enforce depth limits, complexity scoring and persisted queries.
Rule of thumb: worth it when many diverse clients consume a rich graph of related data. Overhead when you have one client and a handful of endpoints — a BFF gets most of the benefit for far less machinery.