Last weekend, I sat down and built an entire API hub in a single night. Eleven endpoints — QR codes, password generators, UUIDs, hash functions, base64 encode/decode, lorem ipsum text, JSON prettify/minify, color conversion, email verification, IP geolocation, and timestamp conversion.
All of them are free (100 requests/day), open source, and deployed on Cloudflare Workers. If you need more, Pro is $5/mo (10,000/day) and Business is $15/mo (100,000/day).
The base URL is dead simple:
https://api.gadgethumans.com/
Every developer has been there. You need a quick QR code for a demo. Or you're debugging and need to hash a string. Or you're writing tests and need placeholder text. Usually you open three browser tabs, search for an online tool, dodge five ads, wait for a captcha, and eventually copy-paste the result.
I wanted a single API endpoint I could curl from anywhere. No UI. No captchas. No signup walls. Just clean JSON responses and fast edge deployment.
The tech stack: One Cloudflare Worker (~30 KiB gzipped), qrcode-generator for QR codes, ipapi.co for geolocation, Cloudflare DNS for MX lookups. Self-hosted on api.gadgethumans.com.
Generate QR codes as PNG or SVG. The most popular tool. Max 2,000 character input, up to 1,000px size.
curl "https://api.gadgethumans.com/qr?text=https://example.com&format=png" > qr.png
curl "https://api.gadgethumans.com/qr?text=hello&format=svg"
Returns an image (PNG or SVG) — not JSON. Set the format to svg for scalable, png for raster. Free tier works without any API key.
Generate cryptographically secure passwords. Free: one at a time. Paid: batch up to 100.
curl "https://api.gadgethumans.com/password?length=32&symbols=true"
# → {"password":"aB3#kL9$xR2@pQ7!","length":32,"options":{...}}
Generate RFC 4122 UUID v4 identifiers. Free: one. Paid: up to 1,000 at once.
curl "https://api.gadgethumans.com/uuid"
# → {"uuids":"550e8400-e29b-41d4-a716-446655440000"}
Hash text with MD5, SHA-1, SHA-256, SHA-512 — or all four at once. Max 5,000 characters input.
curl "https://api.gadgethumans.com/hash?text=hello&algorithm=all"
# → {"input":"hello","md5":"5d41402abc4b2a76b9719d911017c592","sha1":"aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d","sha256":"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824","sha512":"9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"}
Encode or decode Base64 strings. Max 50,000 characters. Returns both input and output with length info.
curl "https://api.gadgethumans.com/base64?text=hello&mode=encode"
# → {"mode":"encode","output":"aGVsbG8=","input_length":5,"output_length":8}
Generate placeholder text as paragraphs, sentences, or words. Free: up to 20 units. Paid: up to 100.
curl "https://api.gadgethumans.com/lorem?type=words&count=10"
# → {"type":"words","count":10,"text":"lorem ipsum dolor sit amet...","chars":62}
Prettify, minify, or validate JSON. Three modes in one endpoint. Max 100,000 characters.
curl "https://api.gadgethumans.com/json?json=%7B%22name%22%3A%22test%22%7D&mode=validate"
# → {"valid":true,"type":"object","keys":1}
Convert between HEX (#ff0000) and RGB (rgb(255,0,0)). Supports 3-digit and 6-digit hex.
curl "https://api.gadgethumans.com/color?value=%23ff0000&from=hex&to=rgb"
# → {"input":{"format":"hex","value":"#ff0000"},"output":{"format":"rgb","value":"rgb(255, 0, 0)"},"components":{"r":255,"g":0,"b":0}}
Verify email addresses with format validation, MX DNS lookup, and disposable domain detection. Returns a score (0-100).
curl "https://api.gadgethumans.com/[email protected]"
# → {"email":"[email protected]","valid":true,"format_valid":true,"mx_valid":true,"is_disposable":false,"score":100}
The email verify system checks three things: (1) email format regex, (2) MX DNS records via Cloudflare's DNS-over-HTTPS, and (3) a curated list of 80+ disposable email domains. Each check adds to the score. Score ≥ 65 = valid.
Look up any IPv4 address — city, country, coordinates, timezone, ISP. Omit the IP to look up your own.
curl "https://api.gadgethumans.com/ip?ip=8.8.8.8"
# → {"ip":"8.8.8.8","city":"Mountain View","country":"United States","latitude":37.4056,"longitude":-122.0775,"org":"Google LLC","timezone":"America/Los_Angeles"}
Convert Unix timestamps to human-readable dates, UTC, local time, and relative time ("2 years ago"). Auto-detects millisecond timestamps.
curl "https://api.gadgethumans.com/timestamp?timestamp=1715385600"
# → {"timestamp":1715385600,"utc":"2024-05-11 00:00:00 UTC","day_of_week":"Saturday","relative":"1 year ago","year":2024,"month":5,"day":11}
Every API is fully open source. You can self-host any of them on your own Cloudflare account in under 5 minutes:
| API | GitHub Repo |
|---|---|
| QR Code | scotia1973-bot/qrcode-api |
| Password | scotia1973-bot/password-api |
| UUID | scotia1973-bot/uuid-api |
| Hash | scotia1973-bot/hash-api |
| Base64 | scotia1973-bot/base64-api |
| Lorem Ipsum | scotia1973-bot/lorem-api |
| JSON Prettify | scotia1973-bot/json-prettify-api |
| Color Converter | scotia1973-bot/color-converter-api |
| Email Verify | scotia1973-bot/email-verify-api |
| IP Geolocation | Part of api-hub |
| Timestamp | Part of api-hub |
Each repo has a README with self-host instructions. The pattern is always the same:
git clone https://github.com/scotia1973-bot/qrcode-api.git
cd qrcode-api
npm install
npx wrangler deploy
The unified API hub (all 11 endpoints in one worker) is at scotia1973-bot/api-hub.
Here's how it all fits together in a single Cloudflare Worker (~30 KiB gzipped):
// Unified routing — one worker, all endpoints
const segment = path.split('/')[1];
if (segment === 'qr') return handleQR(url);
if (segment === 'password') return handlePassword(url, isPaid);
if (segment === 'uuid') return handleUUID(url, isPaid);
if (segment === 'hash') return handleHash(url);
if (segment === 'base64') return handleBase64(url);
if (segment === 'lorem') return handleLorem(url, isPaid);
if (segment === 'json') return handleJSON(url);
if (segment === 'color') return handleColor(url);
if (segment === 'email-verify') return handleEmailVerify(url);
if (segment === 'ip') return handleIP(url, request);
if (segment === 'timestamp') return handleTimestamp(url);
Each handler is a pure function — takes URL params, returns a Response. Stripe integration sits at /subscribe and /webhook. Rate limiting uses per-IP in-memory counters for the free tier, and API key lookups for paid users.
You can. But here's why an API beats an online tool:
I'm planning wave 3 with:
If you want early access or have ideas for the next endpoint, email me.
No signup. No rate limit anxiety. Just curl.
Open the API Hubor subscribe for Pro ($5/mo) · Business ($15/mo)
All source code is MIT licensed. Fork it, self-host it, modify it — go wild.