Why I built my own HTTP API client when great ones already exist

The API clients out there are excellent, enterprise-grade tools. I still built my own, for one reason: I wanted every request, token and response to stay on my own computer.

Let me start with the part that might sound odd coming from someone who built one: the HTTP API clients you already know are excellent.

They are polished, fast and deep. They handle every authentication scheme you can think of, they have mock servers, monitors and documentation generators, and they let a whole team share one workspace in real time. For a company with dozens of developers working on the same set of APIs, that is exactly what you want, and they do it very well.

I am not a company with dozens of developers. I am one person, and most of the time I just want to send a request, look at the response and move on. So when I looked at what I actually needed from an API client, it turned out to be a much shorter list, with one item on it that the big tools are not built around.

The one requirement: my data stays on my computer

An API client sees more sensitive material than almost any other tool on a developer’s machine.

Think about what sits in a typical collection. Bearer tokens and API keys. Internal hostnames that are nobody else’s business. Staging credentials. Request bodies built from real records while you debug something that only fails with real data. Responses full of personal information that came back from a production endpoint at two in the morning.

Modern API clients are, quite reasonably, built around an account and a cloud workspace. That is what makes team collaboration work: your collections live on a server, so your colleagues can see them. Most of them let you limit what is synced, and many of them take security seriously. But the default shape of the tool is still “sign in, and your work lives with us”, and I kept finding myself working around that rather than with it.

I did not want to have to think about which variables were marked secret, which workspace was synced, or whether a response I pasted into a request body had just left the building. I wanted the simplest possible guarantee: nothing leaves my computer except the requests I choose to send.

No account just to send a request

The second thing was smaller, but it bothered me every day.

Sending an HTTP request is about the most basic thing a developer does. It should not need a login screen, a session that expires, or a network connection to a service that has nothing to do with the API I am testing. I wanted to open the app on a train with no signal and still have every collection, environment and piece of history right there.

Plain files I can read, back up and version

Once the data stays local, the next question is what shape it is in.

I wanted my workspaces to be ordinary folders and my collections to be plain JSON files. Files I can open in any text editor, copy to a backup drive, search with the tools I already use, and keep under version control right next to the code that calls the API. When a request changes, I want to see that change in a diff, not trust a sync status icon.

That also means no lock-in. If I stop using the app tomorrow, my work is still sitting there in a readable format.

Without throwing away what I already had

The obvious risk with building your own tool is ending up with a blank slate and years of saved work stuck somewhere else. That was a deal-breaker for me, so it shaped the whole design of FlosForge Caller:

  • It opens the collections and environments I already had. Export them from your current client, drop the files in, and folders, requests, bodies, auth, variables and scripts come across. An import summary tells you about anything that needs a manual look.
  • The scripts still run. Pre-request and test scripts written for the familiar scripting API work without being rewritten, and test results appear right beside the response. Scripts run in an isolated worker that cannot touch your files.
  • Pasting a request copied from the terminal turns it into a request in the app, so moving something over from a shell session takes a second.
  • Whole collections run from the command line too, with the same engine as the app, so the same tests can run in a CI pipeline and fail the build when something breaks.

On top of that I added the things I personally kept wishing for: captures that pull a value out of a response into a variable without writing a script, flows that chain requests into a sequence like “log in, create an order, poll until it is paid”, and a connection timeline that shows exactly where the time went, from DNS to the last byte.

What it deliberately does not do

Building for one person means saying no to a lot.

There are no hosted mock servers, no scheduled cloud monitors and no team workspaces, because each of those needs a server somewhere, and the whole point was not to have one. A few less common authentication schemes are not supported yet either. If your work depends on those, the big tools are the right choice, and I would honestly recommend them.

Why share it

Like most of what I publish, Caller started as something I built for myself. It became the tool I reach for every day, and it seemed a shame to keep it on my own laptop when other people might want the same thing: a capable API client that never asks who you are and never takes your data anywhere.

So it is free and open source, under the GNU GPL v3. There is no paid tier, no account and nothing to buy. It is a personal project, offered as it is, in the hope that it is useful to someone else too.

Trademarks and affiliation

FlosForge is an independent, one-person project. It is NOT affiliated with, endorsed by, sponsored by, certified by, approved by or connected in any way to any of the companies or organisations named below, or to any other company whose products, services or trademarks appear anywhere on this site or inside its screenshots. None of them has reviewed, approved or supported this software, and no such relationship is claimed or implied. Their names appear here for one reason only: to identify the software the pages are talking about.

Apple Inc.
Apple, macOS, Mac, the Mac App Store, Touch ID, Keychain, Apple Intelligence, AirTag, AirPods and Find My
Microsoft Corporation
Microsoft, Windows, Visual Studio, WinUI and .NET
Google LLC
Google, Android, Google Play, Google Drive, Health Connect, Find Hub and Gemini
Samsung Electronics Co., Ltd.
Samsung, Galaxy, Samsung Health, SmartTag and S Pen
the WordPress Foundation
WordPress
Linus Torvalds
Linux, registered in the U.S. and other countries
The MITRE Corporation
CVE (registered trademark) and CWE
Docker, Inc.
Docker
the OpenJS Foundation
Node.js and Electron
Cloudflare, Inc.
Cloudflare and R2
Amazon.com, Inc. or its affiliates
Amazon Web Services, AWS and Amazon S3
GitHub, Inc.
GitHub
Bluetooth SIG, Inc.
the Bluetooth® word mark and logos
the OpenStreetMap Foundation
OpenStreetMap
Yoast BV
Yoast
reMarkable AS
reMarkable, reMarkable 2 and reMarkable Paper Pro

cURL, Python, Ollama, Tile, Chipolo, Pebblebee, Meta, Ray-Ban, Flipper Zero, GoPro, Backblaze, Wasabi, MinIO, GeoNames, OpenTopoMap, NVD (National Vulnerability Database), the security advisory databases named on the project pages, and every other product, brand or company name shown on this site or inside its screenshots are the property of their respective owners. This product uses data from the NVD API but is not endorsed or certified by the NVD. Each mark is used nominatively — to identify the software, platforms or data sources concerned — and never as a badge of origin, quality or endorsement.