FastAPI Development Company: How to Vet One Technically
How to vet a FastAPI development company: questions for the first call, what to check in a code sample, red flags that predict outages, and tests to request.
To vet a FastAPI development company, test what it knows rather than what it shows. Ask how it keeps the event loop unblocked, where slow work goes, what timeouts it sets, and how it tests that one customer can't read another's data. Then read a real code sample. Demos look alike; production habits don't.
TL;DR: FastAPI is easy to demo, so screenshots prove little. Ask aboutasync defversusdef, queues for slow work, timeouts on every external call, and authorization tests. OWASP ranks broken object-level authorization as the top API risk, so ask to see those tests. Then review one real handler, one test file, and one background job.
This is a technical vetting guide: the questions, the code checks, and the red flags. Commercial questions (engagement models, pricing, time zones, contracts) are in our buyer's guide to hiring a dedicated developer from India, so they're only touched on here.
Why is a FastAPI demo not enough?
Because almost anyone can build a working FastAPI demo in a day. The framework does a lot for you up front: typed request models, automatic docs, async support. The differences between teams show up later, under concurrent load, during an outage, or when a third-party API starts timing out.
So vet for the later problems. A demo shows you that the team can produce endpoints. It tells you nothing about what happens when one endpoint calls a slow database driver while a hundred other requests wait behind it. The rest of this guide is built to surface that in the first two calls.
Which questions should you ask a FastAPI development company on the first call?
Eight questions, each with a good answer and a red flag. Ask them in this order; the first one decides whether the rest are worth your time. Good teams answer with specifics from their own systems. Weak teams answer with adjectives.
| Question | A good answer sounds like | Red flag |
|---|---|---|
| Which FastAPI systems do you run in production, and what does FastAPI do in each? | Named systems, the role, and what broke | Demos, tutorials, "we've done many APIs" |
When do you use async def and when plain def? |
A rule tied to whether the library can await |
"Async is always faster" |
| Where do long-running jobs go? | A queue with retries and visibility into stuck jobs | Long jobs inside request handlers |
| What timeouts would you set on our upstream calls? | Numbers, plus the difference between total and inactivity timeouts | "The provider is reliable" |
| How do you test that one customer can't read another's data? | Automated tests per endpoint, run in CI | "We test manually before release" |
| Do you generate API clients from the schema? | Yes, from the OpenAPI schema, in CI | Hand-written calls on both sides |
| What's the worst incident you've had, and what changed? | A specific story and a specific fix | No story |
| Who writes our code, and who reviews it? | Named people and a review step | "The team" |
For a sense of what a specific answer looks like, our own is written up in FastAPI in production: three systems and a hackathon, covering what FastAPI does in NoteTube, Pullsy, and a trading platform and what we changed in each.
How do you check whether they really understand async?
Ask what happens when someone calls a synchronous database driver inside an async def route. The right answer: it blocks the event loop, and every other request on that worker waits. FastAPI's docs say to declare routes with plain def when a library can't await, because FastAPI then runs them in an external threadpool (FastAPI docs).
Then ask the follow-up most teams aren't ready for: "How would you find that in an existing codebase?" Good answers mention reading handlers for blocking calls, profiling, and watching latency climb under concurrent load while CPU stays low. That last symptom is the giveaway, and a team that has debugged it will describe it without prompting.
It's the first thing we'd look for in any FastAPI review. It looks like this, and it's fixed like this:
import httpx
import requests
# Red flag: a blocking HTTP call inside async def stalls every request on the worker.
@app.get("/report")
async def report():
return requests.get(UPSTREAM_URL).json()
# Fix: an async client with explicit timeouts.
@app.get("/report")
async def report():
timeout = httpx.Timeout(10.0, connect=3.0)
async with httpx.AsyncClient(timeout=timeout) as client:
response = await client.get(UPSTREAM_URL)
return response.json()
The deeper patterns are in async FastAPI patterns, and the performance side is on our FastAPI performance page.
What should you check in a FastAPI code sample?
Ask for one real handler, one test file, and one background job from a past project, with secrets removed. Twenty minutes of reading tells you more than an hour of slides. You don't need to be a Python expert to spot most of the red flags below; you need to know what to look for.
- Blocking calls in
async defroutes.requests, synchronous database drivers, ortime.sleepinside an async handler. - No timeouts. HTTPX defaults to 5 seconds of network inactivity and lets you set connect, read, write, and pool timeouts separately (HTTPX docs). Code that sets
timeout=None, or uses a client with no timeout at all, will hang one day. - Long work inside requests. FastAPI's own docs suggest a bigger tool like Celery for heavy background computation and keep
BackgroundTasksfor small jobs such as sending an email (FastAPI docs). - Untyped edges. Handlers that take and return plain
dictinstead of Pydantic models, which leaves the OpenAPI schema vague. - Authorization by trust. A record fetched by ID with no check that the caller owns it.
- Secrets in code. API keys or database URLs in source files instead of the environment.
If the sample is clean on all six, you're talking to people who've run FastAPI under real traffic.
Which tests should a FastAPI team show you?
Authorization tests, first. OWASP's API Security Top 10 lists broken object-level authorization as API1, the top risk: an attacker changes an object ID in a request and the API never checks access. Its prevention advice includes writing tests for the authorization mechanism and treating failures as release blockers (OWASP).
FastAPI makes those tests cheap. Its TestClient is built on HTTPX and works with plain pytest functions (FastAPI docs). A test like this, one per endpoint that takes an ID, is what you want to see:
def test_cannot_read_another_orgs_invoice(client, org_a_token, org_b_invoice):
response = client.get(
f"/invoices/{org_b_invoice.id}",
headers={"Authorization": f"Bearer {org_a_token}"},
)
assert response.status_code == 404
Ask whether these run in CI on every pull request. "We test before release" usually means "someone clicks around", and clicking around never tries another customer's ID.
Signs the team uses what FastAPI gives them
FastAPI's real value is the typed contract: Pydantic models in, Pydantic models out, and an OpenAPI schema generated from them. FastAPI's docs show generating client SDKs from that schema, because the API is described in a standard format many tools understand (FastAPI docs).
Ask whether they generate the web or mobile client from the schema. If they hand-write API calls on both sides, they're paying FastAPI's cost and skipping its main benefit, and every field rename becomes a bug hunt.
Red flags that should end the conversation
Some answers are disqualifying on their own, whatever the price. None of them is about skill level. Each one is about how the team behaves when something goes wrong, which is the part of the engagement you can't see in a proposal.
- They host it and "hand over later". Your repositories and cloud accounts should be in your organization from day one.
- No incident story. Teams that have run real systems have had outages. Teams with none haven't run much.
- "Async is always faster." It isn't, and believing it is how blocking calls get into async routes.
- They never say no. A good FastAPI company will tell you when not to use FastAPI. If the product is mostly forms and an admin over a relational model, Django may fit better; if you have a Flask app that works, migrating may not pay off. We compare those on the FastAPI vs Flask page.
On time zones, get the overlap in writing. A standard IST day of 10:00 to 19:00 overlaps about 8.5 hours with the UAE, but has no overlap at all with a US East Coast day in winter, so one side has to shift hours. The full breakdown by region is in the dedicated developer guide.
FAQ
How long should a technical vetting process take?
Two calls and one code review is usually enough: a first call for the eight questions, a short review of a code sample, and a second call to walk through what you found. If a company won't share any code, even redacted, treat that as an answer in itself.
Can a non-technical founder vet a FastAPI team?
Yes, with help. Ask the questions in the table and listen for specifics rather than adjectives. For the code review, a few hours from an independent senior Python developer is cheap insurance compared with a year of building on the wrong team.
Should we start with a paid trial task?
A small paid task, such as one endpoint with tests and a background job, shows how a team writes code, communicates, and handles review comments. Keep it under a week, use your real repository, and judge the tests and the pull request as much as the feature.
What should a FastAPI codebase review include?
Blocking calls in async routes, missing timeouts, long work inside requests, missing authorization tests, untyped endpoints, and secrets in source. Those six findings cover most of the trouble in inherited FastAPI code, and each comes with a concrete fix the team can estimate.
Looking for a FastAPI team that will pass this checklist? Hire a FastAPI developer from the team that runs NoteTube and Pullsy, and start with a 30-minute architecture call.