Backend & API Development

The server side of a product — REST APIs, database design and the third-party integrations that hold everything together. Built in Python, on FastAPI, Django or Flask.

What this covers

An API is a contract, and most backend problems are contract problems: an endpoint that returns three different shapes, an authorisation check that lives only in the user interface, a database that was never indexed for the query the business actually runs. We start with the contract — resources, auth, versioning, error format and schema — agree it in writing, and only then write code. That order is what makes a backend something a second team can build against without a walkthrough, and what makes changing it two years later a normal piece of work rather than a project. Where a system is already slow or already old, we measure before we change anything and fix the cause rather than the symptom.

  • The API contract agreed in writing before any endpoint is built
  • Authorisation checked on every request, not only in the interface
  • Tests around the logic that carries money or permissions, so change stays safe

Capabilities

The specifics, rather than the adjectives.

REST APIs other people can build on

Versioned, documented endpoints with consistent error handling, pagination and authentication — designed so your mobile team, a partner or your own front end can integrate without a walkthrough and without guessing what a field means.

MVP backends built from scratch

The smallest backend that proves the product: accounts, the core entities, the two or three endpoints that carry the business, deployed somewhere real. Enough to put in front of users and learn from, without paying for infrastructure you have not earned yet.

Database design that survives growth

Schema design in PostgreSQL, MySQL or MongoDB — including which of them you should actually be using, which is usually decided by the shape of your data and your reporting needs rather than by fashion. Migrations and indexes planned from the start, because retrofitting them is where the pain lives.

Third-party API integrations

Payments, messaging, accounting, logistics, government portals, and the internal system somebody else wrote. Including the unglamorous parts that decide reliability: retries, idempotency, webhook signature verification, rate limits, and a defined behaviour for when the other side is down.

Performance tuning of slow systems

Finding out what is genuinely slow before changing anything — slow queries, missing indexes, N+1 fetches, blocking calls in the request path — then fixing the cause instead of putting a cache in front of the symptom.

Upgrading legacy Python code

Old Python brought onto a current version with dependencies that still work, dead code removed and tests around the parts that carry value, so the upgrade is not a leap of faith. Done incrementally with the system running throughout, because a big-bang rewrite is how working software becomes a stalled project.

Security on the boundaries

Input validation, parameterised queries, hashed credentials, secrets kept out of the repository, and an authorisation check on every endpoint rather than only in the user interface. The OWASP API risks reviewed before launch, not after an incident.

Tests that make change safe

Pytest coverage of the rules that carry money or permissions, plus integration tests against a real database. Enough that refactoring becomes a routine afternoon rather than an event everybody dreads, and enough to catch the regression before a customer does.

What you get

A concrete list of outputs. If something here is not relevant to your project, it comes out of the scope and the price — we would rather agree that in writing now.

  • An API contract: resources, authentication, versioning and the error format
  • Schema design, migrations and indexes for PostgreSQL, MySQL or MongoDB
  • Implementation on FastAPI, Django or Flask, whichever fits the product and the team
  • Authentication and per-endpoint authorisation, not just a hidden UI
  • Third-party integrations with retries, idempotency and webhook verification
  • A Pytest suite covering the rules that carry money or access
  • OpenAPI documentation your team and your partners can build against
  • Environment configuration, deployment and a written runbook for the failure cases

How it runs

Five steps. You always know which one you are in.

  1. 01

    Contract first

    Resources, authentication, versioning, error shapes and the database schema — written down and agreed before code. Disagreeing with a document is cheap; disagreeing with a finished API is not.

  2. 02

    One slice running

    A single vertical slice end to end: authentication, one entity, one endpoint, real database, deployed. Proves the whole path works before it is replicated ten times.

  3. 03

    Build and test

    The remaining endpoints with tests written alongside rather than scheduled for afterwards. Short iterations on a staging environment you can call yourself.

  4. 04

    Harden

    Measured performance work on the queries and endpoints that matter, authorisation reviewed endpoint by endpoint, and a deliberate decision about what happens when a dependency fails.

  5. 05

    Handover

    Documentation, OpenAPI specification, the runbook for common failures, and a walkthrough recording. Your team should be able to change and deploy this without us.

Stack

The platforms and frameworks we build, integrate and maintain on. We would rather work in a stack your team can hire for and hand over than pick whatever is interesting this year — and where an existing platform does the job better than custom code, we will say so.

  • Python
  • FastAPI
  • Django
  • Flask
  • PostgreSQL
  • MySQL
  • MongoDB
  • REST APIs
  • Pytest
  • Docker
  • AWS
  • Azure

FAQs

Backend & API Development — frequently asked questions

Which Python framework do you recommend?

FastAPI for most new API work: typed, fast, and it generates usable OpenAPI documentation from the code rather than from someone remembering to update a file. Django when the project has substantial administrative needs and would otherwise rebuild a lot of the same screens and permissions. Flask for smaller services or where an existing codebase already uses it. The honest answer is that all three can be made to work; the choice matters far less than the contract and the tests around it.

Can you take over an existing codebase?

Yes, and it is a large part of this kind of work. We start with a read-only review: how it is structured, where the risk is, what is tested and what is not, and what a safe change actually looks like. You get that assessment in writing before committing to anything, because the answer to "can this be improved incrementally" is sometimes no — and it is better to know that early than to discover it halfway through.

PostgreSQL, MySQL or MongoDB — which should we use?

PostgreSQL unless there is a specific reason otherwise: it handles relational data, JSON and full-text search well, and leaves room to grow without a migration. MySQL is a reasonable choice where your hosting or team already standardises on it. MongoDB suits genuinely document-shaped data or a schema that is still moving quickly — but it is often chosen to avoid designing a schema, and that decision usually returns as a reporting problem later.

Our current system is slow. Can you fix it without a rewrite?

Usually, yes, and measuring comes before deciding. Most slow systems are slow for a small number of specific reasons — a missing index, a query inside a loop, a synchronous call to an external service on the request path, a table scanned because it was never designed for the query the business actually runs. We profile first and show you the cause, because a rewrite proposed before anyone has measured the problem is a rewrite proposed on faith.

Do you write tests?

Yes, and specifically around the logic that carries money, permissions or rules — the places where a quiet regression is expensive and hard to notice. Every endpoint also gets an integration test against a real database, because tests that run only against mocks tend to pass while production fails. What we do not do is chase a coverage percentage; coverage is a symptom of testing, not the goal.

Free consultation

Talk through scope for Backend & API Development.

Bring the problem and any constraints. You will leave the call with a scope, a timeline and a price — whether you work with us or not.

We reply within one business day. · No obligation