Skip to main content
REST API development

APIs that let your systems stop copying data by hand

An API is the contract between two pieces of software. Written well, it lets your website, your mobile applications, your accounting package and your partners all work from the same information. Written badly, it becomes the thing everybody is afraid to change.

Why APIs decide what your software can become

Most businesses do not set out to build an API. They set out to build a website, and then a mobile application, and then to connect a supplier system, and each time somebody asks whether the existing software can share its data. If the answer is no, every new requirement means either duplicating logic or copying information manually, and both choices get more expensive every year.

We build APIs with Django REST Framework, which handles serialisation, authentication, permissions, filtering, pagination and rate limiting using patterns that any competent developer recognises immediately. That familiarity matters, because an API is usually consumed by somebody other than the team that wrote it, sometimes years later.

The design work that matters happens before any code. What are the resources, and do they match how the business thinks rather than how the database happens to be structured? What can each kind of caller see and change? How are large collections paged? What does an error look like, and does it explain enough for the caller to act? How will this change in two years without breaking everything already using it?

Authentication, permissions and rate limits

Every API needs a clear answer to who is calling and what they may do. We implement token based authentication for mobile applications, key based access for server to server integration and session authentication where a browser is involved, choosing based on what is actually calling rather than applying one pattern everywhere.

Permissions are enforced on every endpoint, not merely on the ones somebody remembered. A caller should be unable to reach records outside their organisation even if they guess the identifiers, and we test that deliberately. Rate limiting protects the system from a partner integration with an enthusiastic retry loop, which is a far more common cause of outages than any deliberate attack.

Versioning, documentation and not breaking people

The hardest part of running an API is changing it without breaking the software already depending on it, especially mobile applications where old versions remain installed for months after an update is released. We plan for that from the start, adding fields rather than renaming them where possible, versioning when a genuine break is unavoidable, and keeping older versions working for a stated period.

Documentation is produced as part of the work rather than promised afterwards. Whoever integrates with your API, whether that is your own future developer or a customer technical team, should be able to see the available endpoints, the expected parameters, example responses and the meaning of each error without needing a meeting.

Integrating with services you already use

The other half of this work is consuming other people interfaces. We connect systems to payment providers, email delivery services, message gateways, accounting packages, mapping and location services, calendar systems, document storage and industry specific platforms. The engineering care here goes into the failure paths, because external services are occasionally slow, occasionally down and occasionally return something unexpected. Integrations that assume everything always works are the ones that wake people up at night.

What we deliver

  • Resource design that matches your business
  • Django REST Framework implementation
  • Token, key and session authentication
  • Permissions enforced on every endpoint
  • Pagination, filtering and sorting
  • Rate limiting and abuse protection
  • Clear error responses
  • Versioning strategy for future change
  • Written documentation for integrators
  • Third party service integration

Built with

Django REST FrameworkPythonMySQL RedisCeleryJSON
Common projects

The API work we are asked for

Backend for mobile applications

One interface serving both the Android and iOS applications so business rules exist once. This is the pattern behind our own platform and the reason its three clients never disagree about what a record means.

System to system integration

Connecting your software to an accounting package, a supplier ordering system, a courier or a payment provider so information flows automatically instead of being retyped every day by somebody who resents it.

Partner and customer APIs

Giving your larger customers or partners programmatic access to their own data, with keys, permissions, rate limits and documentation, which frequently becomes a competitive advantage in itself.

Opening up an existing system

Adding an interface to software that was never designed to share, carefully, without destabilising the application that your business currently depends on every day.

Webhooks and event delivery

Notifying other systems when something happens rather than making them ask repeatedly, including retries, signature verification and a record of what was delivered and what failed.

Repairing fragile integrations

Fixing connections that fail silently, duplicate records, or fall over whenever the other service is slow. Usually a matter of proper error handling, retries and idempotency rather than a rewrite.

API questions

Usually, if we have access to the code and the database. The work involves exposing the right operations without disturbing the existing application, which needs care because the live system has to keep working throughout. We start with an assessment and tell you what is realistic before committing.

There are usually alternatives, such as scheduled file exchange, a database view provided by the vendor, or an export and import routine that runs overnight. They are less elegant and they can still remove most of the manual work. We will also tell you plainly when a connection would cost more than it saves.

Authentication on every endpoint, permissions checked against the caller rather than assumed, rate limiting per key, sensible payload limits, logging of unusual patterns and no information leaked through error messages. We also test by attempting to reach records that should be invisible, which is the check most often skipped.

That is the intention. We use conventional patterns rather than inventing our own, produce written documentation with examples, and are happy to talk directly to your technical team during integration. An API nobody can use without a meeting is an unfinished API.

Which two systems should be talking to each other?

Tell us what is being copied by hand today. That is almost always where an API pays for itself fastest.