Förra helgen behövde jag en publik endpoint som kunde ta emot formulärinskickningar från en landningssida. Inget märkvärdigt — ta emot en JSON-POST, validera ett par fält, returnera ett vettigt svar. Hela grejen skulle hantera kanske 50 requests i veckan. Jag ville inte lägga in ett kreditkort för en server för 20 dollar i månaden, lära mig ett nytt infra-verktyg eller sitta igenom en CI-pipeline varje gång jag ändrade tre rader. Tio minuter efter jag började var API:t live i 300+ städer och kostade mig noll dollar. Det här är genomgången.
Cloudflare Workers
har en gratisnivå som faktiskt är generös: 100 000 requests per dag, inget kreditkort krävs för att
registrera sig, och din kod kör vid edge istället för i en region. För de små API:er som de flesta
sidoprojekt behöver — webhook-mottagare, formulärhanterare, länkförkortare, JSON-proxyer — kan du
shippa och glömma. Den här guiden tar dig från "inget Cloudflare-konto" till "live-URL som svarar på
curl" på ungefär tio minuter. Vi bygger en riktig endpoint: en JSON-validator
som tar emot en POST, kollar payloaden och ekar tillbaka ett rent svar.
Vad du får gratis (och vad du inte får)
Cloudflare Workers gratisplan ger dig 100 000 requests per dag och 10 millisekunder CPU-tid per request. Det låter snålt tills du inser att de flesta JSON-endpoints — parsa body, gör en gnutta arbete, returnera ett svar — blir klara på långt under 1 ms. 10 ms-taket är CPU-tid, inte väggklocka, så en upstream-fetch som tar 800 ms räknas fortfarande som ungefär 1 ms CPU eftersom din kod mestadels väntar på I/O.
Det du inte får på gratisplanen: persistent lagring med högt throughput (Workers KV har sin egen gratiskvot — generös för de flesta fall, men separat från request-räkningen), stora svars-payloads, eller schemalagda cron-triggers oftare än en gång per minut. För en typisk "ta emot JSON, gör en grej, returnera JSON"-tjänst som inte behöver en databas, kommer du inte slå i väggen.
Installera Node.js och Wrangler
Wrangler är Cloudflares CLI för Workers. Installera den via npm — du behöver Node.js 18 eller nyare. Har du Node redan är det en one-liner:
npm install -g wrangler
# Verify
wrangler --version
# Should print 3.x or higherLogga nu in. Det öppnar en webbläsare för OAuth, skapar Cloudflare-kontot om du inte har ett, och lagrar credentials lokalt:
wrangler login
# Opens https://dash.cloudflare.com/oauth/authorize ...
# After you approve: "Successfully logged in."Scaffolda projektet
Ett kommando och du har en projektmall med vettiga defaults — en exempel-handler för
fetch, en wrangler.toml-config och den lokala dev-servern redan
inkopplad:
npm create cloudflare@latest free-json-api
# When prompted, pick:
# "Hello World" Worker
# JavaScript (or TypeScript — your call)
# No deploy yet (we'll do that ourselves)
cd free-json-apiGeneratorn släpper allt du behöver i en mapp. Öppna src/index.js —
det är filen din Worker kör. Vi byter ut innehållet mot något mer användbart än
standard-Hello World:en.
Skriv JSON-API:t
Här är en komplett Worker som tar emot en JSON-POST, validerar två obligatoriska fält och returnerar ett rent svar. Den hanterar de vanliga felväggarna — fel metod, trasig JSON, saknade fält — istället för att krascha till en generisk 500:
export default {
async fetch(request) {
if (request.method !== 'POST') {
return Response.json(
{ error: 'POST only' },
{ status: 405 },
);
}
let body;
try {
body = await request.json();
} catch {
return Response.json(
{ error: 'Body must be valid JSON' },
{ status: 400 },
);
}
const { email, message } = body;
if (typeof email !== 'string' || typeof message !== 'string') {
return Response.json(
{ error: 'email and message are required (strings)' },
{ status: 422 },
);
}
return Response.json({
ok: true,
receivedAt: new Date().toISOString(),
echo: { email, message },
});
},
};Två saker värda att lyfta fram.
Response.json()
serialiserar objektet och sätter Content-Type: application/json åt dig, så du
inte behöver komma ihåg headern. Och att linda request.json() i en try/catch är
den enskilt viktigaste vanan när man bygger Workers — utan den returnerar en trasig payload
en ogenomskinlig 500 från Cloudflares runtime istället för en användbar 400 från din kod.
Testa lokalt
Wrangler kommer med en lokal dev-server som kör samma V8-isolat Cloudflare använder i produktion. Starta den med:
npm run dev
# ⛅️ wrangler 3.x
# [wrangler:inf] Ready on http://localhost:8787I en annan terminal slå mot den med curl. Prova happy path först, sedan en
medvetet trasig payload — du ska se rena JSON-fel istället för stack traces:
# Happy path
curl -X POST http://localhost:8787 \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","message":"hello"}'
# {"ok":true,"receivedAt":"2025-10-15T...","echo":{...}}
# Broken JSON (note the missing closing brace)
curl -X POST http://localhost:8787 \
-H "Content-Type: application/json" \
-d '{"email": "ava"'
# {"error":"Body must be valid JSON"}
# Missing required field
curl -X POST http://localhost:8787 \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'
# {"error":"email and message are required (strings)"}Deploya till världen — ett kommando
När lokalt funkar, putta ut det globalt:
npx wrangler deploy
# Total Upload: 1.18 KiB / gzip: 0.55 KiB
# Uploaded free-json-api (1.34 sec)
# Published free-json-api (4.21 sec)
# https://free-json-api.<your-subdomain>.workers.dev
# Current Deployment ID: ...Den URL:en är nu live på varje Cloudflare-datacenter. En request från Berlin träffar
Frankfurt, en från Tokyo träffar Tokyo, en från São Paulo träffar São Paulo — samma kod, ingen extra
konfig. Bundlen var 1,2 KiB. Testa live-URL:en med samma curl-kommandon du
använde lokalt — bara byt ut localhost:8787 mot workers.dev-värdnamnet
Wrangler skrev ut.
När du växer ur gratisnivån
Det dröjer länge. 100k requests/dag är ungefär 1,15 requests per sekund snittat över 24 timmar — bekvämt mer än vad de flesta sidoprojekt, interna verktyg eller tidiga produkter gör. Det första som vanligen knuffar dig av gratisnivån är inte request-antalet utan lagring: börjar du skriva mycket till KV, R2 eller D1 har de sina egna kvoter. Den betalda planen börjar på 5 dollar/månad och ger dig 10 miljoner requests, mer CPU per request, och ett kreditkorts- skyddsnät för spikar. De flesta projekt behöver den aldrig.
Vad härnäst
Det du shippat är den absoluta minsta nyttiga Worker. Riktiga produktions-endpoints behöver ett par vanor till — CORS för webbläsarklienter, secrets-hantering för API-nycklar, edge-cache för långsamma upstreams, och en strategi för att proxa upstream-tjänster. Jag täckte de delarna i Cloudflare Workers och JSON — en praktisk guide, som tar vid där den här artikeln slutar.
Några verktyg jag har öppna när jag bygger Workers som hanterar JSON: JSON Formatter för att snygga till svar, JSON Validator för att lista ut exakt varför en payload avvisades, och JSON Path för att planera fält-plockar-logik innan jag skriver den. Själva JSON-formatet är specificerat i RFC 8259 — värt en snabb genomläsning när du börjar hantera knepiga indata från riktiga användare.
För djupare Worker-mönster — KV-lagring, Durable Objects, schemalagda triggers, AI- inference-bindningarna — är Cloudflares Workers-exempelgalleri den bästa resurs jag hittat. Det är en copy-pasteable lista av recept för nästa steg.
Sammanfattning
Cloudflare Workers är den ovanliga gratisnivå som faktiskt fungerar för riktiga sido- projekt. Inget kreditkort för att starta, 100k requests om dagen, och en deploy-story som ryms i ett enda kommando. Mönstret i den här artikeln — ta emot JSON, validera, returnera JSON — täcker en förvånansvärt stor del av vad de flesta API:er gör. Har du hållit emot att shippa ett litet API för att infrat känts som en plåga, är det här vägen jag önskar jag tagit för tre år sedan.