The term API covers at the same time an interface implementation (for the code to use) and an interface specification (for the humans to understand).
While the API specification is abstract and independent of any programming language, the API implementation is language/middleware specific. In C in particular, there is some overlap between a header and an API, but you can have parts of a header that don't belong to the API, and conversely, you can have parts of an API that are not defined in a header.
Is there a definition of API?
There is no authoritative definition of what an API is. But IEEE's SWEBOK provides a good start, as it is an technical report endorsed by the international standard organisation (ISO):
An application programming interface (API) is the set of signatures that are exported and available to the users of a library or a framework to write their applications. Besides signatures, an API should always include statements about the program’s effects and/or behaviors (i.e., its semantics).
The case of C and its headers
In C, any public symbols may be "exported" without necessarily having to be in a header. A non static function defined in some compilation unit will be exported to the linker even if it's not declared in some header.
Such element could be used by any other modules, provided they know how to use the symbol (e.g. hand-crafted assembler if the parameters and parameter passing convention is known, or independent C compilation unit that just declares the same function as
So, the API is defined independently of the header. But in practice, in C and some other languages, a header is the easiest and less error-prone manner to define once the API and make it available to other compilation units. Because it allows to use the same declaration on the "exporting" and "importing" side.
API specification vs. API implementation
Until now I only addressed the implementation of the API (with or without headers in C, but other languages use different techniques to export and import APIs.
Such an API implementation is of little use without an API specification which explains how to use the elements and what their effects are. The specification explains exactly this. For an obvious function like
sin() the name of the function is almost already its specification, but there are lots of other APIs that are less obvious.
Sometimes, e.g. for WebAPI, the API is only defined by a specification: no header defines how to structure the API call over http. You have to know which server to send what request to get the results defined in the API specifications. On the other side, other distributed technologies rely on special Interface Definition Languages used by middleware to connect heterogeneous and remote system components.