No versioning on your APIs
The second mistake is missing versioning. Teams build an API, it works, they move on. Then another team wants to change something. The endpoint shifts. Everything depending on it breaks.
Good API design assumes things will change. Versioning isn't administrative overhead, it's a promise to the systems that depend on your API. /v1/orders keeps working even when /v2/orders returns a different data format. Consumers choose when they migrate.
We see this most often with internal APIs that were once built as a temporary fix. No documentation, no versioning, no contract. And then the system is still in production six years later and nobody touches it out of fear.
Error handling as an afterthought
The third mistake is treating error handling as something to add at the end. An API call fails. What happens? If the response is just a silent timeout or a generic 500 error, the receiving side knows nothing. Was it a temporary problem? A data validation error? An authorisation issue?
Good APIs have explicit error codes that carry meaning. They distinguish 4xx errors (something on your end) from 5xx errors (something on ours). They return readable error messages that tell developers something useful. And they log on both sides.
Retry logic also belongs in the design, not the implementation. Do you know which operations are idempotent? Can you send the same call twice without creating duplicate payments or duplicate records? If the answer is 'not sure', there's work to do.