Your $400M payroll API runs on Flask's dev server · let's fix that

$400M+ in payroll. 10 years, zero breaches.
The runtime should match the trust on the marketing page.

Bitwage moves $400M+ in global payroll across 90,000+ workers and 4,500+ companies in nearly 200 countries — with a remarkable 10-year zero-breach record. But there's a single line in the response headers of api2.bitwage.com that tells a different story about what's standing between that record and a bad Tuesday. Cloudflare's developer platform is the production runtime that solves it without a re-architecture.

Marketing site: Vercel · app: CloudFront · api: GCP · api2: bare AWS EC2 (52.73.x / 107.23.x, us-east-1) · DNS: AWS Route 53 · not yet on Cloudflare — net-new opportunity in front of a payroll API that's quietly running production on a development server.

Recon · HTTP headers on api2.bitwage.com, June 2026
Your payments API is publicly serving with this Server: header right now:
HTTP/2 200
date: Fri, 05 Jun 2026 11:05:04 GMT
content-type: application/json
server: Werkzeug/3.1.3 Python/3.13.13
strict-transport-security: max-age=31536000; includeSubDomains
Werkzeug is Flask's built-in development server. The official Flask documentation says it "is not designed to be particularly efficient, stable, or secure." Running it in front of $400M+ in payroll, in front of bank account numbers, in front of every cryptocurrency disbursement — behind nothing but raw AWS EC2 IPs — is a public surface that doesn't match the "10 years, zero breaches" claim on the homepage.
Source: live curl -sI https://api2.bitwage.com/ response · Flask docs: flask.palletsprojects.com/deploying/
$400M+
Payroll processed
90K+
Registered workers
4,500+
Registered companies
~200
Countries with same-day payouts
Endorsed by
Stellar Development Foundation· Gemini Exchange· Tim Draper (investor since 2015)· Baires Dev· Athyna· Fluid Truck· WebWork· Waiting Room Solutions

Bitwage ships the payroll product. Cloudflare runs the production perimeter.

You have a remarkable 10-year zero-breach record — which makes it more interesting, not less, that the public payments API is currently a Flask dev server with no edge in front of it. Cloudflare in front of api2.bitwage.com turns a 30-minute configuration into a defensible answer for the next SOC 2 audit, the next Stellar partnership review, and the next investor security questionnaire.

Bitwage builds

The global payroll product, the crypto rails, the FX engine

Same-day payouts in cryptocurrency, stablecoins, or local currency across nearly 200 countries. W2 Crypto Benefits. Crypto-funded payroll. The developer API at developer.bitwage.com. The integration with Gemini for custody. The Stellar Development Foundation partnership. A 10-year zero-breach operating record.

  • Same-day global payouts in crypto, stablecoins, fiat
  • Custody + exchange via Gemini (8-year partnership)
  • Public developer API documented on Postman + the developer site
  • Now part of the Paystand brand family (5-brand consolidation)
×

Cloudflare runs

The production edge in front of the payments + API plane

Workers in front of api2.bitwage.com to terminate TLS, enforce rate limits, and stop the abuse before it ever touches the Werkzeug process. R2 for the audit-grade ledger archive. Workers for Platforms for the per-employer tenancy now that Bitwage is part of a 5-brand family. Zero Trust for the engineers touching the money plane.

  • Workers + WAF + Bot Mgmt in front of every payments API call
  • R2 (zero egress) for the audit-grade ledger + transaction archive
  • Workers for Platforms — per-employer & per-brand tenancy
  • Zero Trust to retire the bare-EC2 SSH and any standing access

Nine primitives, mapped to a payments stack at 10-year scale.

Each maps to a specific finding in the public DNS, the response headers, and the published product surface. The critical-tagged primitives are the ones that fix the Werkzeug exposure today. The next-tagged ones extend the perimeter to the rest of the Paystand family.

PRIMITIVE 01 Critical · fix today

Workers in front of api2.bitwage.com

The fastest fix: a Cloudflare Worker in front of api2.bitwage.com terminates TLS, hides the Werkzeug signature, enforces per-key rate limits, and stops scraped-credential attempts before they hit the Flask process. The EC2 boxes go behind a Tunnel; nothing on 0.0.0.0 reaches public IPs anymore.

Workers Tunnel Rate limit WAF
PRIMITIVE 02 Critical · fix today

Bot Management on the developer API

A public payments API at developer.bitwage.com is a magnet for credential stuffing, replay attempts, API-key farming, and synthetic-identity probes. Bot Management at the edge stops all of it before it touches the application layer. Turnstile on signup and key issuance prevents the abuse from creating valid keys in the first place.

Bot Management Turnstile API protection
PRIMITIVE 03 Critical · fix today

Zero Trust to retire bare-EC2 SSH

Today, reaching the EC2 boxes behind api2.bitwage.com presumably means SSH or a VPN. Cloudflare Access + Tunnel lets engineers reach the boxes through an identity-aware proxy with full audit logging — no public SSH surface, no standing VPN, no shared bastion. Auditor-friendly by construction.

Access Tunnel SSH retirement
PRIMITIVE 04 Paystand wedge

Workers for Platforms = per-brand tenancy

Bitwage is now part of a 5-brand family (Paystand AR, Teampay AP, Yaydoo LATAM, Bitwage FX, Paystand.org). Each brand has its own subdomain footprint, its own customer base, its own audit surface. Workers for Platforms gives each brand its own isolated Worker namespace inside one control plane — same edge, isolated state, separate billing dashboards.

Workers for Platforms Paystand Per-brand
PRIMITIVE 05 Audit corpus

R2 for tamper-evident ledger archive

Every disbursement, every FX conversion, every crypto-to-fiat swap generates an audit row. SOC 2 + financial-regulator audits require long-term, tamper-evident storage. R2 with object versioning + Workers for hash-chained writes gives you immutable storage at zero egress — auditor exports for free, no per-read cost.

R2 versioning Workers Audit trail
PRIMITIVE 06 FX latency

Workers at 330+ POPs for global FX quote latency

Same-day payouts across nearly 200 countries means an FX engine quoting from a single us-east-1 region adds material latency to every quote in Asia, Europe, LATAM. Workers + Smart Placement runs the quote logic at the POP closest to the worker requesting payment — sub-30ms anywhere on earth.

Workers Smart Placement FX
PRIMITIVE 07 DDoS

DDoS protection for the payments perimeter

A payment API running on bare EC2 IPs is a target. Cloudflare's standard DDoS protection — included with every Workers deployment — absorbs L3/L4/L7 attacks at edge POPs before they reach the origin. No paged on-call at 3am because someone in Russia decided to test the WAF you don't have.

DDoS L7 mitigation Anycast
PRIMITIVE 08 Webhook resilience

Queues + Workflows for outbound webhooks

When a payment confirms, Bitwage fires webhooks to employer accounting systems, Gemini, Stellar settlement, internal observability. Queues + Workflows give you durable, replayable, observable delivery pipelines without Redis + Celery sprawl — with automatic retry, dead-letter handling, and idempotency keys baked in.

Queues Workflows Webhooks
PRIMITIVE 09 Compliance

WAF rules for OFAC + sanctions screening

Money-services businesses have to enforce OFAC sanctions, FATF travel-rule controls, and country-level embargoes. WAF custom rules can block requests from sanctioned IPs or with sanctioned BINs at the edge — before they ever appear in the audit log as a near-miss. Faster than backend-only enforcement, cheaper than dedicated geo-fencing infrastructure.

WAF OFAC Geo

The fix is a single Worker route in front of an existing endpoint.

No re-architecture. No code change inside the Flask app. No migration. Cloudflare goes in front of api2.bitwage.com via a CNAME + Tunnel, the Werkzeug process stops talking to the public internet, and every existing API client keeps working unchanged.

From bare-EC2 Werkzeug to production edge, sketched

Today on the left, the configuration change on the right. The Flask app doesn't move — only what's in front of it changes.
CLIENT
Worker, employer integration, mobile app
HTTPS to api2.bitwage.com
CF EDGE
Workers + WAF + Bot Mgmt
TLS, rate-limit, signature stripped
CF TUNNEL
Private path to EC2 origin
no public IP, identity-aware
ORIGIN
Flask + Werkzeug on EC2
unchanged — for now
What this changes: The bare-EC2 IPs disappear from public DNS. The Werkzeug signature disappears from the response. Rate limiting moves from "hope the Flask app handles it" to "330+ POPs absorb it." The fix is a 30-minute configuration, not a quarter-long re-platform. And the Flask app behind it can be migrated to Gunicorn or moved entirely to Workers on a schedule you control — not on a schedule a CVE forces.

The economics of trust at $400M scale.

The bill that matters for Bitwage isn't the AWS bill — it's the cost of the breach that didn't happen, the SOC 2 finding that didn't get raised, the partner pause that didn't get triggered. Cloudflare in front of api2 is the cheapest insurance policy a financial-services product can buy at this stage.

A back-of-the-envelope, not a quote
Modeled against the cost of a single payments incident at Bitwage's scale
SETUP TIME
30 min
CNAME swap to a Cloudflare zone, Tunnel install on the EC2 boxes, Worker deployed. The Flask app doesn't change. No API client has to update.
DDOS + WAF COST
$0
DDoS protection and basic WAF are included with every Workers plan. Bot Management adds incremental cost only if you turn it on for high-risk routes.
BREACH COST AVERTED
$2M+
IBM Cost-of-a-Data-Breach 2024 puts the average financial-services breach at $6.08M. A single CVE on Werkzeug + a payments API on bare EC2 is the kind of finding that ends "10 years zero breaches."
The real win is the SOC 2 conversation that doesn't happen. Today an auditor looking at api2.bitwage.com sees a Flask dev server behind no edge protection in front of $400M in payroll. With Cloudflare in front, the auditor sees a WAF, rate limiting, identity-aware access to the origin, and a tamper-evident audit log in R2. Same engineering team, dramatically different audit posture.

Bitwage is now one of five brands under one platform.

The top banner on bitwage.com today links to Paystand, Teampay, Yaydoo, Bitwage, and Paystand.org — a 5-brand financial-platform consolidation. Each brand has its own DNS, its own perimeter, its own customer base, its own compliance surface. Workers for Platforms is the architecture for one shared edge with five isolated brand tenants.

The Paystand brand family, sketched as a Workers for Platforms namespace

Each brand gets its own isolated Worker namespace. Same edge, same observability, separate billing dashboards. Bitwage is the FX + Payouts brand.
Paystand
AR + Payments
Teampay
AP + Expense
Yaydoo
LATAM AR + AP
Bitwage
FX + Payouts
Paystand.org
.org / nonprofit
Shared control plane — Workers for Platforms + WAF + Bot Mgmt + R2 + Zero Trust
one runtime · one observability surface · 5 brands = 5 isolated tenants by construction, not by config

Current stack, with Cloudflare overlaid.

Every row is sourced from public DNS records and HTTP response headers on bitwage.com, www.bitwage.com, api.bitwage.com, api2.bitwage.com, and app.bitwage.com. The red-warning row is the Werkzeug exposure. The orange column is the overlay path.

What's running today, and where Cloudflare slots in

Red rows are the urgent items. Orange column = the additive overlay. No Vercel, no GCP, no AWS rip-and-replace required.
LAYER
BITWAGE RUNS TODAY
CLOUDFLARE FIT
PAYMENTS API
api2.bitwage.com on Werkzeug 3.1.3 + Python 3.13.13 over bare EC2 (52.73.x / 107.23.x, us-east-1)
+ Workers + Tunnel: hide origin, terminate TLS, rate-limit, WAF, signature strip
MARKETING SITE
Vercel (server: Vercel, x-vercel-id)
No change — Vercel fronts cleanly behind a CF zone
APP DASHBOARD
CloudFront (d21p5eclbfhgoq.cloudfront.net, 18.238.x)
+ Cloudflare in front: WAF + Bot Mgmt + Turnstile on member login
DEVELOPER API
api.bitwage.com on Google Cloud (ghs.googlehosted.com)
+ AI Gateway / Workers in front for rate limit + per-key attribution
DNS
AWS Route 53 (ns-78 / ns-546 / ns-1187 / ns-1764.awsdns)
+ Cloudflare DNS for unified analytics + faster edge routing
EMAIL
Google Workspace + Help Scout + HubSpot + StatusPage
+ Cloudflare Email Security as defense-in-depth at the perimeter
DEV TOOLS
Postman (TXT verified) + Atlassian + Ahrefs
+ Zero Trust SSO in front of internal dev portals
DDoS / WAF
No edge in front of api2 — relying on AWS Shield basic + EC2 SG
+ Cloudflare DDoS + WAF included, 330+ POPs of anycast absorption
SSH / ADMIN ACCESS
Likely bastion or VPN to EC2 instances for engineering
+ Cloudflare Access + Tunnel — no public SSH, audit-logged
AUDIT LOG
Likely CloudWatch + internal Postgres for transaction history
+ R2 (zero egress) with object versioning for tamper-evident archive
CUSTODY + FX
Gemini Exchange (8-year custody partner) + Stellar settlement
No change — same custody, just behind a hardened edge
PAYSTAND FAMILY
5 brands: Paystand / Teampay / Yaydoo / Bitwage / Paystand.org
+ Workers for Platforms — per-brand namespace by construction

Why this is the right week to start the conversation

"10 Years, Zero Breaches" is your headline. It's a remarkable claim and a remarkable record. But api2.bitwage.com serving Werkzeug/3.1.3 in front of $400M of payroll is the kind of single-line response header that turns a 10-year record into a Tuesday-afternoon postmortem. The fix takes one engineer one afternoon and is materially cheaper than the audit finding that surfaces it.

Paystand consolidation changes the perimeter shape. Five brands under one platform is five subdomains, five compliance footprints, five SOC 2 scopes. Picking the edge runtime that handles all five with one control plane — instead of five disconnected CloudFront distributions and five separate WAF configurations — is a now decision, not a 2027 decision.

The developer API is a public surface. A documented payments API at developer.bitwage.com with Postman verification is exactly the surface where credential-stuffing, API-key farming, and replay-attack defense matter most. Bot Management at the edge is the cheapest hour you can spend in front of that surface before it scales.

Worth a 30-minute conversation with the platform team?

The interesting conversation is which of these is closest to your current sprint: Workers + Tunnel in front of api2 to retire the bare-EC2 surface, Bot Management on the developer API, Workers for Platforms across the new Paystand brand family, or Zero Trust to retire the SSH-to-EC2 access pattern. I'd rather hear what's actually on your roadmap than guess.

Matt Holscher Calendar  → Reply by email