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.
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.
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.
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.
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.
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.
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.