API testing sits between unit tests and browser end-to-end tests, and whether it earns its keep depends almost entirely on how many consumers your endpoints have. Here is the honest cost-benefit, with the tools that make the cost low.
A unit test proves a function works. A browser test proves a user journey works but takes seconds per case and breaks when a CSS class changes. API tests prove the contract — status codes, response shape, error bodies, auth behaviour — and run in the middle: typically a few hundred cases against a locally running server in well under a minute, versus ten to twenty minutes for the same coverage driven through a real browser. That speed is the whole argument. A suite you run on every push catches regressions; one you run nightly catches them after somebody has already built on top.
hurl --test tests/*.hurl. Diffable, no GUI, no runtime beyond a single binary.newman run collection.json makes it CI-runnable.Not in writing the assertions. It lands in test data: a database seeded to a known state, tokens that do not expire mid-run, and idempotent teardown. Testcontainers or a docker compose file that brings up a throwaway Postgres per run solves it properly. Teams that skip this end up with a suite that fails on Tuesdays for reasons nobody can reproduce, and then they delete the suite.
Worth it, with a threshold. If your API is public, has more than one consumer, or is maintained by a different team from the one calling it, API tests pay for themselves the first time someone changes a response field. If it is an internal endpoint with exactly one caller in the same repository, integration tests through that caller cover the same ground for less effort. Start with a dozen tests over your most-called endpoints and the full error catalogue; expand only when a bug slips through.